あらかじめ,データの個数が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 --------------------------------------------------