第30章 家計簿を作ろう その4


さて、今回はいよいよ(?)項目クラスのメンバ関数の 中身を作ります。

Kakeiboクラスは、全く手を付けないのでこのクラスの メンバ関数は、以前のものをそっくりそのまま使います。 新しく加えたKomokuクラスのメンバ関数を考えます。

まずは、コンストラクタですがこれは、単に、データメンバに 0を代入しておきましょう。

Komoku::Komoku(void) { Shokuhi = 0; Kosaihi = 0; Others = 0; OutgoTotal = 0; Kyuyo = 0; Zatsushu = 0; IncomeTotal = 0; Item = 0; }

ま、こんな感じになるでしょう。まちがっても コンストラクタにreturn文は書かないで下さい。 コンストラクタは何も返しません。 (コンストラクタはケチだ

次はSetSection関数を作りましょう。まずは、収入か支出かを たずねます。収入なら給与か、その他の収入かをたずねます。 支出なら食費か、交際費か、その他の支出かをたずねます。 項目が決まったら、データメンバのItemに値をしまっておきます。

void Komoku::SetSection(void) { char kind[8]; while(1) { cout << "収入(I) 支出(O)="; cin >> kind; if (kind[0] == 'I' || kind[0] =='O') break; else cout << "入力が不正です" << endl; } if (kind[0] == 'I') { cout << "給与(3) その他の収入(4)="; }else { cout << "食費(1) 交際費(2) その他(0) ="; } cin >> Komoku::Item; return; }

どうしてchar kind;としなかったの?

はい。そのようにしてもよいのですがユーザーが間違って2バイト文字の 「I」とか「O」を入力しても桁あふれが起こっておかしなことが 起こらないようにするためです。でもこれでも完全ではありません。 いろいろ変な入力をするとおかしくなります。

次は、SetKingaku関数を考えましょう。データメンバの Itemの内容によってたしたり、引いたりをすればよいだけですね。

void Komoku::SetKingaku(int money) { switch(Item) { case 0:Others += money; OutgoTotal = Others + Shokuhi + Kosaihi; Kakeibo::zankin -= money; break; case 1:Shokuhi += money; OutgoTotal = Others + Shokuhi + Kosaihi; Kakeibo::zankin -= money; break; case 2:Kosaihi += money; OutgoTotal = Others + Shokuhi + Kosaihi; Kakeibo::zankin -= money; break; case 3:Kyuyo += money; IncomeTotal = Kyuyo + Zatsushu; Kakeibo::zankin += money; break; case 4:Zatsushu += money; IncomeTotal = Kyuyo + Zatsushu; Kakeibo::zankin += money; break; default: cout << "エラー!" << endl; break; } return; }

残金zankinは、相続元クラス(基底クラス)のメンバなので Kakeibo::zankinとスコープ解決演算子を使っていることに注意して下さい。 また、各caseで同じような計算が繰り返されています。もう少し 工夫してすっきりしたプログラムにしてみて下さい。 (こういうのを「いもプログラム」といいます)

最後は、Disp関数ですね。これは、単に各項目を表示するだけなので 特別難しくはないでしょう。

void Komoku::Disp(void) { cout << endl; cout << "給与=" << Kyuyo << endl; cout << "その他の収入=" << Zatsushu << endl; cout << "収入合計=" << IncomeTotal << endl; cout << endl; cout << "食費= " << Shokuhi << endl; cout << "交際費= " << Kosaihi << endl; cout << "その他= " << Others << endl; cout << "支出合計= " << OutgoTotal << endl; cout << endl; cout << "残金=" << Kakeibo::zankin << endl; return; }

はい、これらのメンバ関数の中身をfclass.hに書いて いよいよビルドしてみましょう。ここで注意ですが xx.hファイルを修正しても、VC++1.51の場合ビルドボタンを押しても ダメです。リビルド・ボタンを押して下さい。 コンパイルの設定によってはビルド・ボタンでもよいのかもしれません。 (筆者は何も考えずにリビルドしています) xx.cppを修正した時はビルド・ボタンで大丈夫です。 それと、この関数はKakeiboクラスにも同じ名前のものがあります。 元の(Kakeibo)関数を仮想関数として宣言しても問題ありません。

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

はい。実行結果は左の図の通りです。 前回までの残金はファイルからきちんと読み出しています。 終了時には今回の残金をファイルに記録しています。 いろいろやってみて下さい。 そして、不満な点を少しずつ改良していって下さい。


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

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