第39章 住所録を作ろう その2


今回は、住所録に検索機能を付けます。



メインのメニューに「検索」が加わりました。



メインメニューから3の「検索」を選択すると、検索メニューが 表示されます。1の検索語句入力を選択すると検索語句入力が 促されます。

0の終了を選択すると、メインメニューが表示されます。



では、プログラムを見てみましょう。

// jusho02.cpp #include <iostream.h> #include <fstream.h> #include <string.h> //memset()で必要 #include <conio.h> // getch()で必要 #define JFILE "jfile.txt" class Jusho { struct _tagdata{ char name[64]; char address[256]; char birth_year[16]; char birth_month[8]; char birth_day[8]; char memo[256]; } data; char searchword[64]; public: Jusho(); int show(char *); int write(); int search(); };

メンバ関数のshowの引数が変更になりました。この関数は「住所録を見る」「検索」の 両方で使われます。引数にヌル文字のみの文字列が指定されると、すべての データを表示して「住所録を見る」の機能を果たします。特定の語句を指定すると その語句を含んだデータのみを表示します。

Jusho::Jusho() { memset(&data, 0, sizeof(data)); }

コンストラクタに変更はありません。

int Jusho::show(char *sword) { int n, i = 0, match; ifstream J; if (strcmp(sword, "") == 0) match = 2; J.open(JFILE, (ios::nocreate)); if (J.is_open()) J >> n; else { cout << "住所録データはありません" << endl; return -1; } while (i < n) { match = 0; J >> data.name; if (strstr(data.name, sword) != NULL) match = 1; J >> data.address; if (strstr(data.address, sword) != NULL) match = 1; J >> data.birth_year; if (strstr(data.birth_year, sword) != NULL) match = 1; J >> data.birth_month; if (strstr(data.birth_month, sword) != NULL) match = 1; J >> data.birth_day; if (strstr(data.birth_day, sword) != NULL) match = 1; J >> data.memo; if (strstr(data.memo, sword) != NULL) match = 1; if (match == 1 || match == 2) { cout << "----------------------" << endl; cout << data.name << endl; cout << data.address << endl; cout << data.birth_year << "年" << data.birth_month << "月" << data.birth_day << "日" << endl; cout << data.memo << endl; cout << "----------------------" << endl; cout << "Hit any key!" << endl; getch(); } i++; } J.close(); return 0; }

「住所録を見る」でこの関数が呼ばれたときは引数の文字列はヌル文字のみなので match は2となります。

whileループにはいるとmatchは0にされ、検索語句(sword)と一致したものがあれば1となります。

matchが1または2のデータが表示されます。

showメンバ関数を引数によりオーバーロードしても良いのですが、中身が重複した部分が多く 結局1つの関数にしました。

strstr関数についてはSDK編第76章に解説があります。

int Jusho::write() { int no_of_data; char yesno[8]; ifstream Jin; ofstream Jout; Jin.open(JFILE, ios::nocreate); if (Jin.is_open() == 0) no_of_data = 0; else { Jin >> no_of_data; Jin.close(); } cout << "氏名--"; cin >> data.name; cout << "住所--"; cin >> data.address; cout << "誕生年--"; cin >> data.birth_year; cout << "誕生月--"; cin >> data.birth_month; cout << "誕生日--"; cin >> data.birth_day; cout << "メモを書き込みますか(1:Yes 0:NO)"; cin >> yesno; if (strcmp(yesno, "1") == 0) { cout << "メモ--"; cin >> data.memo; } else strcpy(data.memo, "メモなし"); Jout.open(JFILE, ios::ate); Jout.seekp(0); //ファイルの先頭に移動 Jout << no_of_data+1 << endl; Jout.seekp(0, ios::end); Jout << data.name << endl; Jout << data.address << endl; Jout << data.birth_year << endl; Jout << data.birth_month << endl; Jout << data.birth_day << endl; Jout << data.memo << endl; Jout.close(); return 0; }

この関数に変更はありません。

int Jusho::search() { int no, cont = 1; while (cont) { cout << endl; cout << "*******************" << endl; cout << "1.検索語句入力" << endl; cout << "0.終了" << endl; cout << "*******************" << endl; cout << "番号選択---"; cin >> no; switch (no) { case 0: cont = 0; break; case 1: cout << "検索語句---"; cin >> searchword; show(searchword); break; default: cout << "番号が違います" << endl; getch(); break; } } return 0; }

検索メニューを出すメンバ関数です。

1を選択すると、検索語句入力が促され、これがshow関数の引数となります。

int main() { Jusho j; int no, cont = 1; while (cont) { cout << endl; cout << "*******************" << endl; cout << "1.住所録を見る" << endl; cout << "2.書き込む" << endl; cout << "3.検索" << endl; cout << "0.終了" << endl; cout << "*******************" << endl; cout << "番号選択---"; cin >> no; switch (no) { case 0: cont = 0; break; case 1: j.show(""); break; case 2: j.write(); break; case 3: j.search(); break; default: cout << "番号が違います" << endl; break; } } return 0; }

main関数です。

「検索」が増えました。

1が選択されると、j.show("");のように引数にヌル文字のみの文字列が指定されます。

今回も簡単でした。データを編集する機能が欲しいものですね。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Nov/05/2000 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。