C++ 名簿を作って検索できるプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
gari
記事: 16
登録日時: 11年前

C++ 名簿を作って検索できるプログラム

#1

投稿記事 by gari » 8年前

C++のプログラムについて質問させていただきます。

プログラムの内容としては、
名前、年齢、性別のデータを追加、削除、検索できるものです。
名簿メソッドは、人の情報、名簿追加、名簿削除ができる。

■質問したいこと
 ・vectorで名簿を持っているがこれでいいのか、持つ場所がmainだと依存しているのではないか
 ・削除する部分のコードの書き方
   newしてるのでdeleteでいいのではないかと考えているのですが、
   そもそもnewしないで名簿インスタンスを作成したい(そうしているのを見たことがある気がする)。←この考え方から間違っている??
 ・searchの実装がよくわからない。

今の時点で書いているのは以下のコードです。

コード:

class Member {
  public:
    void add(string, int, string);
    void rm();
    void search(string);
  private:
    string name;
    int age;
    string sex;
};

void Member::add (string nm, int toshi, string seibetu) {
    Member::name = nm;
    Member::age = toshi;
    Member::sex = seibetu;
    printf("add\nname:%s\nage:%d\nsex:%s\n",nm.c_str(),toshi,seibetu.c_str());
}

void Member::rm() {
    printf("rm\n");
}

int main(void){
    Member* abcd = new Member;
    std::vector<Member*> person;
    abcd->add("watashi",25,"man");
    person.push_back(abcd);
    abcd->rm();
}
C++は初心者レベルなので知り合いに おすすめの本(Effective C++、Effective Modem C++など)を紹介してもらい、読んでいます。
基本的なC++の用語などは理解しているつもりなので、既存のコードを読んで、
何をしているのかを理解することができるのですがコーディング経験が無さすぎて、書けない。という状態(と自分では感じています)。

また、おすすめの書籍(実際に動かして学んでいくようなもの)がありましたら、教えていただきたいです。

よろしくお願いいたします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C++ 名簿を作って検索できるプログラム

#2

投稿記事 by みけCAT » 8年前

gari さんが書きました:・vectorで名簿を持っているがこれでいいのか、持つ場所がmainだと依存しているのではないか
とりあえず動くものを作って、リファクタリングはその後で考えればいいでしょう。
(依存している→何に?)
gari さんが書きました:newしてるのでdeleteでいいのではないかと考えているのですが
まだ参照されているオブジェクトをdeleteすると、dangling pointerとなり危険です。
vectorからの要素の削除には、erase()関数が使えます。
gari さんが書きました:そもそもnewしないで名簿インスタンスを作成したい
名簿、すなわち名前の一覧(リスト)は、
すでにvectorを用いてnewを用いずに作成しているでしょう。
名簿の中身でもnewを避けたいなら、こんな感じで。

コード:

int main(void){
    Member abcd;
    std::vector<Member> person;
    abcd.add("watashi",25,"man");
    person.push_back(abcd);
    abcd.rm();
}
gari さんが書きました:searchの実装がよくわからない。
仕様がわからないので、よくわかりません。
多分イテレータかなんかでvectorに入っている要素を先頭から見ていって、条件に合うものを出力する、みたいな感じでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

gari
記事: 16
登録日時: 11年前

Re: C++ 名簿を作って検索できるプログラム

#3

投稿記事 by gari » 8年前

回答ありがとうございます。
とりあえず動くものを作って、リファクタリングはその後で考えればいいでしょう。
確かにそうかもしれません。

まだ参照されているオブジェクトをdeleteすると、dangling pointerとなり危険です。
vectorからの要素の削除には、erase()関数が使えます。
ここでもう一つ疑問が出てきたのですが、
Member内の関数(Member::rm)で削除を行いたいのですが、現在のコードではmainにvectorが宣言されております。
vectorをどこで宣言するのが良いのか教えてくただけませんか?

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C++ 名簿を作って検索できるプログラム

#4

投稿記事 by usao » 8年前

オフトピック
正直,問題点というか疑問点がどこなのかよくわかりませんが…
何をどこに置けばよいのかわからん とかいう話(?)であれば,
考えを一つずつ整理しながら進めていけばクリアになったりしませんでしょうか.

「名簿」なる人物情報のリストがあって,
・名簿に,新しい人物情報を追加できる
・名簿から,既存の人物情報を削除できる
という話だとすると…

例えば,最初は,

コード:

class 名簿
{
  void 情報追加( 情報[名前,年齢,性別]を指定 ){  どうにかして引数データを保有する  }
  void 情報削除( 削除対象を指定 ){ どうにかして指定されたデータを保有データから削除する  }
};
という感じのものがあれば良いかなー,とか,そのくらいからスタート.

で,
・「どうにかして保有」,ってどうやって? → std::vectorで実現することにする
・[名前,年齢,性別]をひとかたまりのデータにしたい → classかstructで個人情報をまとめる
ということになれば,

コード:

struct 個人情報
{
  std::string 名前;
  int 年齢;
  std::string 性別;
};

class 名簿
{
public:
  void 情報追加( 個人情報 NewData ){  m_Data.push_back( NewData );  }
  void 情報削除( 削除対象を指定 ){ どうにかして指定されたデータを保有データから削除する  }

private: //データ
  std::vector< 個人情報 > m_Data;
};
という感じに,少し具体的になる.

・「削除対象」ってどうやって指定する? → 人物の「名前」で指定するなら…

コード:

struct 個人情報{ ... }; //省略

class 名簿
{
public:
  ...

  bool 情報削除( std::string 削除対象者の名前 )
  {
    ・指定された人物名のデータを保有データm_Dataからどうにかして探す
    ・見つからなかったら? → 削除できなかったということを表すために return false; としよう.
    ・見つかった場合は → そのデータをどうにかしてm_Dataから除去し,return true; としよう.
  }

private: //データ
  std::vector< 個人情報 > m_Data;
};
…とかなんとか.

閉鎖

“C言語何でも質問掲示板” へ戻る