質問: 国語、数学、英語の点数を人数分だけくり返し読み込み(人数制限10人以内)、各教科の平均点及び3教科の合計の平均を計算して格納する、そして、格納した各平均点を表形式で出力したいのですが、そもそも、どのようにプログラムすれば表形式となるのかもわかりません。 期待している出力結果は以下のようになるそうです。 ``` 人数を入力してください:5 1人目の国語、数学、英語の点数:69 98 87 2人目の国語、数学、英語の点数:34 54 45 3人目の国語、数学、英語の点数:100 95 75 4人目の国語、数学、英語の点数:80 78 35 5人目の国語、数学、英語の点数:52 78 98 国語 数学 英語 合計 ーーーーーーーーーーーー 69 98 87 254 34 54 45 133 100 95 75 270 80 78 35 193 52 78 98 228 ーーーーーーーーーーーー 67.0 80.6 68.0 215.6 ``` <自作プログラム(現段階)> ``` #include int main(void) { int ma[10][3],mb[10][3],mc[10][3]; int i,j,num; printf("人数を入力してください: "); scanf("%d",&num); for(i=1;i<=num;i++){ printf("%d人目の国語、数学、英語の点数",i); scanf("%d %d %d",&ma[i][j],&mb[i][j],&mc[i][j]); } } ``` 現段階では、点数を聞くところまでは完成しているのですが、そこからどのようにしたら平均と合計が見本のように出力されるのかがわかりません。 初学者なので(始めてから三ヶ月足らず)かなり杜撰な質問となってしまったかもしれませんが、よろしくお願いします。
回答: 入力のコードにも問題があります。 > > > ``` > int ma[10][3],mb[10][3],mc[10][3]; > > ``` > > の `[3]` は使っていません。 > > > ``` > for(i=1;i<=num;i++){ > printf("%d人目の国語、数学、英語の点数",i); scanf("%d %d %d",&ma[i][j],&mb[i][j],&mc[i][j]); > > ``` > > 制御変数 `i` も1から始まっていますので、配列の範囲外を参照しています。 以上を修正すると、入力のコードは以下のようになります。 ``` #include int main(void) { int ma[10], mb[10], mc[10]; int i, num; printf("人数を入力してください: "); scanf("%d", &num); for(i = 0; i < num; i++) { printf("%d人目の国語、数学、英語の点数", i + 1); scanf("%d %d %d", &ma[i], &mb[i], &mc[i]); } } ``` > > 各教科の平均点及び3教科の合計の平均を計算 > > > 教科毎の累計をsa、sb、scに格納することにします。 ある人の3教科の合計の累計をsumに格納することにします。 平均は必要なところで計算しています。 合計と平均を表示する処理を追加したコード例です。 ``` #include int main(void) { int ma[10], mb[10], mc[10]; int i, num; int sum = 0; int work; double sa = 0.0, sb = 0.0, sc = 0.0; printf("人数を入力してください: "); scanf("%d", &num); for(i = 0; i < num; i++) { printf("%d人目の国語、数学、英語の点数", i); scanf("%d %d %d", &ma[i], &mb[i], &mc[i]); } printf("\n"); printf("国語 数学 英語 合計\n"); printf("―――――――――――\n"); for(i = 0; i < num; i++) { work = ma[i] + mb[i] + mc[i]; printf("%3d %3d %3d %3d\n", ma[i], mb[i], mc[i], work); sum += work; sa += (double)ma[i]; sb += (double)mb[i]; sc += (double)mc[i]; } printf("―――――――――――\n"); printf("%3.1f %3.1f %3.1f %3.1f\n", sa / (double)num, sb / (double)num, sc / (double)num, (double)sum / (double)num); } ```