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

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

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

【2次元配列で学生ごと教科ごとの平均点を求めるプログラム例】
 3教科、5人分のテストの点数を2次元配列に格納し、学生ごとの平均点、教科ごとの平均点を求めます。
class ScoreAvg {
    public static void main( String[] args ) {
        int[][]  score =  { { 87, 78, 91 }
                          , { 86, 67, 89 }
                          , { 78, 82, 90 }
                          , { 65, 55, 71 }
                          , { 69, 82, 88 } };

        // (1) 学生ごとの平均点を求める
        for( int i = 0; i < score.length; i++ ) {
            int sum = 0;
            for( int j = 0; j < score[i].length; j++ )
                sum += score[i][j];
            System.out.println( i+1 + "番目の学生の平均点は " + (double)sum/score[i].length );
        }
        // (2) 教科ごとの平均点を求める
        for( int j = 0; j < score[0].length; j++ ) {
            int sum = 0;
            for( int i = 0; i < score.length; i++ )
                sum += score[i][j];
            System.out.println( j+1 + "番目の教科の平均点は " + (double)sum/score.length );
        }
    }
}

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

 2次元配列は配列の配列です。よく説明に使われる図のような行×列の領域が実際に取られるわけではありません。
 たとえば次のように、要素数の異なる配列を指定して初期化することも可能です。
 int[][]  score =  { { 87, 78, 91 }
                   , { 86, 67, 89, 100 }
                   , { 78, 82, 90 }
                   , { 65, 55, 71, 100, 100 }
                   , { 69, 82, 88 } };
 score[1] は要素数が4つの配列、score[3] は要素数が5つの配列です。score は、それらの配列をまとめた配列です。
 配列要素の参照は、各次元の添字の値で位置を指定して行います。各配列の要素数が異なる場合は注意が必要です。
 含まれる各配列の要素数は score[i].length、全体の行数は score.length で分かります。

 上のプログラムでは、(1) は各行の要素数が異なる場合にも対応しています。
 (2) は、一番上の配列の要素数 score[0].length を教科の数として使用しています。 厳密な対応ではありませんが、上のプログラムでは学生ごとの教科の数が異なると、集計自体が意味のないものになります。

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

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

前回のクイズの答え: 2つ目以降の分割文字列は先頭に空白文字がある (前回の問題を見る
1:Milk
2: Eggs
3: Bread
4: Apple
5: Cheese
厳密に指定した区切り文字(,)で分割するので、空白文字も特別扱いされません。