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次元配列は配列の配列です。
よく行×列の図で表現されますが、実際に領域がそのように取られるわけではありません。
用途によっては、その図を思い浮かべると考えやすいときがあるので、イメージとして活用されています。
[ 関連記事 ] 2次元配列の初期化と関数への受け渡し
while( tk != NULL && cnt < MAXITEM ) { : }