1. 多次元配列とは
配列には2次元以上の配列も存在し、多次元配列と呼ばれます。ただし、配列に次元があるように考えるのは扱いやすくするためで、メモリ上は連続して並んでいます。
プログラムで多次元配列を扱う場合はほとんどが2次元配列です。この章では特に2次元配列を取り上げて説明します。
2. 2次元配列
2次元配列とは、縦横の 2次元で配列を考えるものです。
(1) 2次元配列の宣言
プログラムの先頭で型と配列名、縦(行)と横(列)の大きさの宣言を行います。

概念上は上の図のようになりますが、メモリ上はこのように割当てられています。

(2) 2次元配列データの取り扱い方
配列の添字を直接指定してデータをアクセスします。

(3) 2次元配列データの初期化
{ } を使って初期化リストを書きます。

(4) 2次元配列で複数の文字列を設定
複数の文字列は 2次元配列で表すことができます。
// 例
#include <stdio.h>
int main(void)
{
char str[3][7] = {
"ABC", "DEFGHI", "JK"
};
for (int i = 0; i < 3; i++) {
printf("%s\n", str[i]);
}
return 0;
}

【実行結果例】
ABC
DEFGHI
JK
〇 演習問題
問1
次のように各 0番目の列要素にテストの点数を初期設定してある大きさ 10×2 の配列がある。
この配列の 1番目の列要素に点数の高い順からの順位を格納するプログラムを作成しなさい。

【実行結果例】
点数 順位
67 5
43 9
56 7
97 1
30 10
88 2
76 4
55 8
66 6
78 3
問2
次の仕様に従って、生徒の科目得点から平均点と評価を求め、実行結果のように画面表示するプログラムを作成しなさい。
【仕様】
- プログラムに組み込むデータについては、配列の初期値として与え、生徒番号は1次元配列、科目点数は2次元配列で、次のとおりとすること。
生徒番号 | 国語 | 数学 | 理科 | 社会 |
---|---|---|---|---|
1001 | 85 | 74 | 63 | 90 |
1002 | 78 | 65 | 70 | 62 |
1003 | 89 | 92 | 88 | 76 |
1004 | 32 | 48 | 66 | 25 |
1005 | 92 | 76 | 81 | 98 |
- 処理手順は、次のとおりとすること。
・各人の4科目の平均点を求めること。
・4段階の評価基準は、次のとおりとすること。
平均点 | 評価 |
---|---|
80点以上 | A |
70点以上80点未満 | B |
60点以上70点未満 | C |
60点未満 | D |
【実行結果例】
番号 国語 数学 理科 社会 平均 評価
1001 85 74 63 90 78.00 B
1002 78 65 70 62 68.75 C
1003 89 92 88 76 86.25 A
1004 32 48 66 25 42.75 D
1005 92 76 81 98 86.75 A
解答例
// 問1
#include <stdio.h>
int main(void)
{
// 最初は全員1位を設定
int seiseki[10][2] = {
{67, 1}, {43, 1}, {56, 1},
{97, 1}, {30, 1}, {88, 1},
{76, 1}, {55, 1}, {66, 1},
{78, 1}
};
// 他の全員と比べる
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
// 点数が少なければ
if (seiseki[i][0] < seiseki[j][0]) {
// 順位が下がる
seiseki[i][1]++;
}
}
}
// 結果の表示
puts("点数 順位");
for (int i = 0; i < 10; i++) {
printf("%3d %2d\n", seiseki[i][0], seiseki[i][1]);
}
return 0;
}
// 問2
#include <stdio.h>
#define NINZU 5 // #defineについては第18を参照してください。
#define KAMOKU 4
int main(void)
{
int no[NINZU] = {1001, 1002, 1003, 1004, 1005};
int ten[NINZU][KAMOKU] = {
{85, 74, 63, 90},
{78, 65, 70, 62},
{89, 92, 88, 76},
{32, 48, 66, 25},
{92, 76, 81, 98}
};
double avg[NINZU] = {0.0, 0.0, 0.0, 0.0, 0.0};
char hyouka[NINZU];
printf("番号 国語 数学 理科 社会 平均 評価\n");
for (int i = 0; i < NINZU; i++) {
// 平均点を求める
for (int j = 0; j < KAMOKU; j++) {
avg[i] += ten[i][j];
}
avg[i] /= KAMOKU;
// 評価を求め
if (avg[i] < 60.0)
hyouka[i] = 'D';
else if (avg[i] < 70.0)
hyouka[i] = 'C';
else if (avg[i] < 80.0)
hyouka[i] = 'B';
else
hyouka[i] = 'A';
}
// 結果の表示
for (int i = 0; i < NINZU; i++) {
printf( "%4d %4d %4d %4d %4d %8.2f %c\n",
no[i], ten[i][0], ten[i][1], ten[i][2], ten[i][3],
avg[i], hyouka[i] );
}
return 0;
}
コメント