Yamamoto's Laboratory

プログラム例

あらかじめ,データの個数が20000行×5列と分かっているので,少し大きめの配列を宣言している.この例では,わざわざ二次元配列を使わなくてもプログラムできる.むしろ,二次元配列を使わない方が良いプログラムと言える.今後のために,読み込んだデータを配列に格納する練習を行っていると考えてほしい.

01: #include <stdio.h>
02: #include <stdlib.h>
03: 
04: int main(void)
05: {
06:   FILE *in_file;
07:   int x[20100][5];
08:   int max[5], min[5], sum[5];
09:   double ave[5];
10:   int i=1, j;
11: 
12: 
13:   in_file = fopen("ex2.data","r");     // ファイルをオープン
14: 
15:   //---- 初期値の設定 ------
16: 
17:   fscanf(in_file, "%d%d%d%d%d",&x[0][0], &x[0][1], &x[0][2], &x[0][3], &x[0][4]);
18:   for(j=0; j<5; j++){
19:     max[j] = x[0][j];
20:     min[j] = x[0][j];
21:     sum[j] = x[0][j];
22:   }
23: 
24:   //--- データの読み込みと処理 -------
25: 
26:   while(fscanf(in_file, "%d%d%d%d%d",&x[i][0], &x[i][1], &x[i][2], &x[i][3], &x[i][4])!=EOF){
27:     for(j=0; j<5; j++){
28:       if(max[j] < x[i][j]) max[j]=x[i][j];
29:       if(x[i][j] < min[j]) min[j]=x[i][j];
30:       sum[j] += x[i][j];
31:     }
32:     i++;
33:   }
34:  
35:   fclose(in_file);                       // ファイルをクローズ
36: 
37:   for(j=0; j<5; j++){
38:     ave[j]=(double)sum[j]/i;             // 平均の計算.キャスト(強制型変換)を使用
39:   }
40: 
41:   printf("--------------------------------------------------\n");
42:   printf("\t1st\t2nd\t3rd\t4th\t5th\n");
43:   printf("==================================================\n");
44:   printf("min\t%d\t%d\t%d\t%d\t%d\n",min[0],min[1],min[2],min[3],min[4]);
45:   printf("max\t%d\t%d\t%d\t%d\t%d\n",max[0],max[1],max[2],max[3],max[4]);
46:   printf("ave\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",ave[0],ave[1],ave[2],ave[3],ave[4]);
47:   printf("--------------------------------------------------\n");
48: 
49: 
50:   return 0;
51: }

実行結果

一瞬のうちに計算が終了して,ディスプレイに以下のように結果が表示される.10万個のデータをコンピューターは一瞬で処理する; このスピードに感動してほしい.

--------------------------------------------------
        1st     2nd     3rd     4th     5th
==================================================
min     -107370 -107373 -107368 -107371 -107367
max     107367  107363  107373  107369  107363
ave     369.64  -486.23 190.05  26.52   452.16
--------------------------------------------------


no counter