第33章 簡単な統計プログラム


今回はC++を使って、簡単な統計プログラムを作ってみます。



早速プログラムを見てみましょう。

// 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(); };

まずは、統計クラスを作ってみます。 個々のデータは配列に格納して、後からデータの修正ができるようにしておきます。 そして、コンストラクタでデータの個数と、個々のデータを入力するようにしておきます。

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演算子で メモリを確保しておきます。あとは、データの個数だけ、データを入力させます。 そして、データの合計(sum)、データの2乗の合計(sum2)、平均値、標準偏差を メンバ変数に格納しておきます。コンストラクタが呼ばれた時点で、 ほとんどの作業が完了していることになります。

tokei::~tokei() { delete []pdata; }

デストラクタです。newしたものをdeleteしています。

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を計算し直します。

int main() { int id; tokei MyTokei; while (1) { id = MyTokei.menu(); if (id == 0) break; MyTokei.show(id); } return 0; }

main関数です。

tokei MyTokei;

でもう、データ入力と計算が終わっています。

あとは、menu関数とshow関数を繰り返します。メニューで0が入力されると 無限ループを抜けてプログラムが終了します。

さて、このプログラムではデータの追加や、削除はできません。工夫してみてください。


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

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