Thinkers'Studio
JavaとC言語の自習ツール
2次元配列のプログラム例(学生ごと教科ごとの平均点を求める)(C言語版)

2次元配列を使ったプログラム例

 2次元配列を使った成績集計のサンプルです。

【2次元配列で学生ごと教科ごとの平均点を求めるプログラム例】
 3教科、5人分のテストの点数を2次元配列に格納し、学生ごとの平均点、教科ごとの平均点を求めます。
#include <stdio.h>
#define NINZU 5
#define KYOKA 3
main()
{
    int   score[NINZU][KYOKA] =  { { 87, 78, 91 }
                                 , { 86, 67, 89 }
                                 , { 78, 82, 90 }
                                 , { 65, 55, 71 }
                                 , { 69, 82, 88 } };
    int i, j, sum;

    // (1) 学生ごとの平均点を求める
    for( i = 0; i < NINZU; i++ ) {
        sum = 0;
        for( j = 0; j < KYOKA; j++ )
            sum += score[i][j];
        printf( "%d番目の学生の平均点は %.2f\n", i+1, (double)sum/KYOKA );
    }
    // (2) 教科ごとの平均点を求める
    for( j = 0; j < KYOKA; j++ ) {
        sum = 0;
        for( i = 0; i < NINZU; i++ )
            sum += score[i][j];
        printf( "%d番目の教科の平均点は %.2f\n", j+1, (double)sum/NINZU );
    }
}

 (1) は、学生の各行について列方向にすべての教科の点数を足し、KYOKA で割って平均を求めます。
 (2) は、教科の各列について行方向に学生全員の点数を足し算し、最後に平均を求めるために NINZU で割ります。

 (2) は(列, 行) の2重ループで、見慣れた(行, 列)の形と異なりますが、特別なことではありません。 配列要素の参照は、各次元の添字の値で位置を指定して行うというルールがあるだけです。 どんなループで参照しても構いません。
 なお、2次元配列は配列の配列です。 よく行×列の図で表現されますが、実際に領域がそのように取られるわけではありません。 用途によっては、その図を思い浮かべると考えやすいときがあるので、イメージとして活用されています。

(今回のクイズです)
 上のプログラムで、初期化で設定した点数を代入文で変更します。
 最後の学生の最後の科目の点数 88 を 90 にするには、どんな代入文を書けばよいですか?
   (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 2次元配列の初期化と関数への受け渡し

前回のクイズの答え: MAXITEM個までの分割文字列が結果のリストに設定される (前回の問題を見る
split 関数で、下記のように MAXITEM を超えない範囲で処理をしているため。
    while( tk != NULL && cnt < MAXITEM ) {
        :
    }