早速プログラムを見てみましょう。
まずは、統計クラスを作ってみます。 個々のデータは配列に格納して、後からデータの修正ができるようにしておきます。 そして、コンストラクタでデータの個数と、個々のデータを入力するようにしておきます。// statics.cpp #include <iostream.h> #include <conio.h> #include <math.h> class tokei { double *pdata, sum, sum2, mean, sd; int no; public: tokei(); ~tokei(); int menu(); int show(int); int correct(); };
コンストラクタでデータの個数を聞いておき、その分だけnew演算子で メモリを確保しておきます。あとは、データの個数だけ、データを入力させます。 そして、データの合計(sum)、データの2乗の合計(sum2)、平均値、標準偏差を メンバ変数に格納しておきます。コンストラクタが呼ばれた時点で、 ほとんどの作業が完了していることになります。tokei::tokei() { int i; sum = 0; sum2 = 0; cout << "データの個数 = "; cin >> no; pdata = new double[no]; for (i = 0; i < no; i++) { cout << "[" << i << "] = "; cin >> *(pdata + i); sum += *(pdata + i); sum2 += pow(*(pdata + i), 2); } mean = sum / no; sd = sqrt((sum2 - no * pow(mean, 2)) / no); }
デストラクタです。newしたものをdeleteしています。tokei::~tokei() { delete []pdata; }
メニューメンバ関数です。ユーザーにどのメニューを選択させます。 戻り値はメニュー番号となります。int tokei::menu() { int id; cout << endl; cout << "***** Menu *****" << endl; cout << "1.データの表示" << endl; cout << "2.データの修正" << endl; cout << "3.合計" << endl; cout << "4.平均" << endl; cout << "5.標準偏差" << endl; cout << "0.終了" << endl; cout << endl; cout << "番号で選択--> "; cin >> id; return id; }
ユーザーがメニューで要求したものを表示するメンバ関数です。int tokei::show(int n) { int i; switch (n) { case 1: for (i = 0; i < no; i++) { cout << "[" << i << "] = " << *(pdata + i) << endl; if ((i + 1) % 10 == 0) { cout << "Hit any key!" << endl; getch(); } } getch(); break; case 2: correct(); getch(); break; case 3: cout << "合計 = " << sum << endl; getch(); break; case 4: cout << "平均 = " << mean << endl; getch(); break; case 5: cout << "標準偏差 = " << sd << endl; getch(); default: break; } return 0; }
1が選択された場合は、データを順番に表示していきます。
2が選択された場合は、correctメンバ関数を呼んでデータの修正を行います。
3が選択された場合は単にsumメンバ変数を表示するだけです。
4が選択された場合も単にmeanメンバ変数を表示します。
5が選択された場合もsdを表示するだけです。
データを修正するメンバ関数です。int tokei::correct() { int cno, i; cout << "データ番号 --> "; cin >> cno; if (cno >= no) { cout << "データ番号が不正です" << endl; return -1; } cout << "[" << cno << "] = "; cin >> *(pdata + cno); sum = 0; sum2 = 0; for (i = 0; i < tokei::no; i++) { sum += *(pdata + i); sum2 += pow(*(pdata + i), 2); } mean = sum / no; sd = sqrt((sum2 - no * pow(mean, 2)) / no); return 0; }
データ番号を入力させて、データを修正します。 データを修正したらsum, sum2, mean, sdを計算し直します。
main関数です。int main() { int id; tokei MyTokei; while (1) { id = MyTokei.menu(); if (id == 0) break; MyTokei.show(id); } return 0; }
tokei MyTokei;
でもう、データ入力と計算が終わっています。
あとは、menu関数とshow関数を繰り返します。メニューで0が入力されると 無限ループを抜けてプログラムが終了します。
さて、このプログラムではデータの追加や、削除はできません。工夫してみてください。
Update Apr/23/2000 By Y.Kumei