/* Part6 演習問題4 */ /* 成績データの平均値と分散(2次元配列版) */ #include <stdio.h> int main(void) { int score[100][10],n,m ; /* nは人数、mは科目数 */ double s[10],dss[10] ; /* 合計と偏差平方和 */ double mean[10],var[10] ; /* 平均値と分散 */ int i,j ; int sw ; /* データ入力終了判定用 */ printf("科目数(上限は10): ") ; scanf("%d",&m) ; if((m<1)||(m>10)) { printf("科目数が誤りです。\n") ; return(1) ; } printf("成績を入力してください(100点満点、負の値で終了)。\n") ; n=0 ; for(i=0;i<m;i++) { s[i]=0 ; dss[i]=0 ; } while(1) { printf("%d> ",(n+1)) ; for(i=0;i<m;i++){ scanf("%d",&score[n][i]) ; } sw=0 ; for(i=0;i<m;i++) { if(score[n][i]>100) { printf("満点を超えています。正しい成績を入力し直してください。\n") ; sw = -1 ; /* 入力ミスのデータは計算しない */ break ; } else if(score[n][i]<0) { sw = 1; break ; } } if(sw==0){ /* 入力データは正しい */ for(i=0;i<m;i++) { s[i] = s[i] + score[n][i] ; /* 合計 */ } n++ ; if(n==100) { printf("データ数が上限に達しました(入力終了)。\n") ; break ; } } else if(sw>0) break ; /* データ入力終了 */ } if(n>0) { for(i=0;i<m;i++) { mean[i] = s[i]/n ; for(j=0;j<n;j++) { dss[i] = dss[i] + (score[j][i]-mean[i])*(score[j][i]-mean[i]) ; /* 偏差平方和 */ } var[i] = dss[i]/n ; } printf("データ件数は%dです。\n",n) ; for(i=0;i<m;i++) { printf("科目番号%dの平均値は%f 分散は%fです。\n",i+1,mean[i],var[i]) ; } } else { printf("データが入力されていません。\n") ; } return(0) ; } |
% gcc -Wall part6-4.c % ./a.out 科目数(上限は10): 2 成績を入力してください(100点満点、負の値で終了)。 1> 78 78 2> 76 76 3> 65 99 4> 102 80 満点を超えています。正しい成績を入力し直してください。 4> 99 98 5> 80 99 6> 56 56 7> 81 60 8> 92 56 9> 77 66 10> 59 65 11> 60 71 12> -1 0 データ件数は11です。 科目番号1の平均値は74.818182 分散は171.057851です。 科目番号2の平均値は74.909091 分散は257.719008です。 |