第9章 多次元配列

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

2次元配列の各先頭要素のアドレスは、配列名[添字]で表す点に注意してください。詳しくはポインタの章で説明します。

〇 演習問題

問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. プログラムに組み込むデータについては、配列の初期値として与え、生徒番号は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
  1. 処理手順は、次のとおりとすること。
    ・各人の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;
}

コメント