★データ構造(二次元配列2)★


二次元配列の使い道は非常に幅広いのですが、入門編として使えそうな題材はそんなに多くありません。

表計算ソフト(MicrosoftのExcelなど)のように表として使う方法や、ゲーム要素を取り入れた題材を扱ってみます。

最初は表計算をイメージした使い方をやってみましょう。

段階を追って説明しますので、少しずつ進めます。


あるクラスで国語のテストが実施されました。

クラス人数は3名として3名分の得点データを配列に入れてみます。

point  0 1 2 
   +−+−+−+
国語 |58|73|62|
   +−+−+−+

この時点では二次元配列である必要は無いので、一次元配列で説明を続けます。

国語の得点の合計を配列の後ろに格納したいので、要素を1つ増やします。

point  0 1 2 3
   +−+−+−+−+
国語 |58|73|62|0|
   +−+−+−+−+
          ↑合計欄

合計はプログラムで求めたいと思います。

まずはここまでのプログラムを作成します。

枠組みを作りましょう。


<sample program 091-01>

#include <stdio.h>

#define COL 4

#define SUM 3

int main(void)
{
    int point[COL] = { 58, 73, 62, 0 };

    /* ここにプログラムを追加 */

    printf("合計 = %d\n", point[SUM]);

    return 0;
}

<実行結果>

合計 = 0
続行するには何かキーを押してください・・・

#defineでCOLとSUMを定義しました。

COLは列を表す言葉ですので、1次元配列の要素数4を設定しました。

SUMは合計欄の添え字を表すために3としています。

合計の基本は覚えていますか?

今回はpoint[SUM]に合計が入っていれば良いですので作ってみましょう。









































解答例です。


<sample program 091-02>

#include <stdio.h>

#define COL 4

#define SUM 3

int main(void)
{
    int point[COL] = { 58, 73, 62, 0 };

    int i;

    for (i = 0; i < SUM; i++) {
        point[SUM] += point[i];
    }

    printf("合計 = %d\n", point[SUM]);

    return 0;
}

<実行結果>

合計 = 193
続行するには何かキーを押してください・・・

しっかりと図を見ながらプログラムしなければ、ちょっとした所で間違えそうです。

例えばループの繰り返し条件を、

for (i = 0; i < COL; i++) {

にしてしまうと、iは0から3まで変化しますので、合計欄の数値も合計してしまいます


これで国語の合計得点を計算するプログラムは出来ました。

ここに数学の得点も追加したいと思います。

二次元配列のイメージを書くと↓の通りです。

point   0 1 2 3
    +−+−+−+−+
国語 0|58|73|62|0|
    +−+−+−+−+
数学 1|36|82|53|0|
    +−+−+−+−+
           ↑合計欄

配列pointの[0][3]に国語の合計を、[1][3]に数学の合計を計算させたいです。

枠組みを書いておきますので、二重ループを上手く使って作ってみてください。

<sample program 091-03>

#include <stdio.h>

#define ROW 2
#define COL 4

#define SUM 3

int main(void)
{
    int point[ROW][COL] = {
        { 58, 73, 62, 0 },
        { 36, 82, 53, 0 },
    };

    int i;
    int j;

    /* ここにプログラムを追加 */

    printf("国語合計 = %d\n", point[0][SUM]);
    printf("数学合計 = %d\n", point[1][SUM]);

    return 0;
}

<実行結果>

国語合計 = 193
数学合計 = 171
続行するには何かキーを押してください・・・









































ヒントです。


今回の計算を順番に書いてみます。

point[0][3] += point[0][0];
point[0][3] += point[0][1];
point[0][3] += point[0][2];

これで国語の合計が計算出来ました。

point[1][3] += point[1][0];
point[1][3] += point[1][1];
point[1][3] += point[1][2];

これが数学の合計です。

添え字の変わり方を良く見てください。









































解答例です。


<sample program 091-04>

#include <stdio.h>

#define ROW 2
#define COL 4

#define SUM 3

int main(void)
{
    int point[ROW][COL] = {
        { 58, 73, 62, 0 },
        { 36, 82, 53, 0 },
    };

    int i;
    int j;

    for (i = 0; i < ROW; i++) {
        for (j = 0; j < SUM; j++) {
            point[i][SUM] += point[i][j];
        }
    }

    printf("国語合計 = %d\n", point[0][SUM]);
    printf("数学合計 = %d\n", point[1][SUM]);

    return 0;
}

<実行結果>

国語合計 = 193
数学合計 = 171
続行するには何かキーを押してください・・・

これで完成です。


では、さらに社会の得点を加え、縦の合計欄も加えたプログラムに挑戦してみてください。

クラスの3名は左からA君、B君、C君としましょう。

※point[3][3]は今回は不使用領域とします。

     A B C
point   0 1 2 3
    +−+−+−+−+
国語 0|58|73|62|0|
    +−+−+−+−+
数学 1|36|82|53|0|
    +−+−+−+−+
社会 2|72|56|70|0|
    +−+−+−+−+
合計 3|0|0|0|0|←縦合計欄
    +−+−+−+−+
           ↑横合計欄

枠組みを書いておきますので、まずは何からどう作っていくか良く考えてから実際のプログラムを打ってください。

難しいプログラムほど、しっかりと考えた後に作り始めると良いと思います。

<sample program 091-05>

#include <stdio.h>

#define ROW 4
#define COL 4

#define ROW_SUM 3 /* 横合計欄 */
#define COL_SUM 3 /* 縦合計欄 */

int main(void)
{
    int point[ROW][COL] = {
        { 58, 73, 62, 0 },
        { 36, 82, 53, 0 },
        { 72, 56, 70, 0 },
        {  0,  0,  0, 0 },
    };

    int i;
    int j;

    /* ここにプログラムを追加 */

    printf("国語合計 = %d\n", point[0][COL_SUM]);
    printf("数学合計 = %d\n", point[1][COL_SUM]);
    printf("社会合計 = %d\n", point[2][COL_SUM]);
                                                 
    printf("A君合計 = %d\n", point[ROW_SUM][0]);
    printf("B君合計 = %d\n", point[ROW_SUM][1]);
    printf("C君合計 = %d\n", point[ROW_SUM][2]);

    return 0;
}

<実行結果>

国語合計 = 193
数学合計 = 171
社会合計 = 198
A君合計 = 166
B君合計 = 211
C君合計 = 185
続行するには何かキーを押してください・・・









































解答例です。


<sample program 091-06>

#include <stdio.h>

#define ROW 4
#define COL 4

#define ROW_SUM 3 /* 横合計欄 */
#define COL_SUM 3 /* 縦合計欄 */

int main(void)
{
    int point[ROW][COL] = {
        { 58, 73, 62, 0 },
        { 36, 82, 53, 0 },
        { 72, 56, 70, 0 },
        {  0,  0,  0, 0 },
    };

    int i;
    int j;

    for (i = 0; i < ROW_SUM; i++) {
        for (j = 0; j < COL_SUM; j++) {
            point[i][COL_SUM] += point[i][j];
        }
    }

    for (i = 0; i < ROW_SUM; i++) {
        for (j = 0; j < COL_SUM; j++) {
            point[ROW_SUM][i] += point[j][i];
        }
    }

    printf("国語合計 = %d\n", point[0][COL_SUM]);
    printf("数学合計 = %d\n", point[1][COL_SUM]);
    printf("社会合計 = %d\n", point[2][COL_SUM]);

    printf("A君合計 = %d\n", point[ROW_SUM][0]);
    printf("B君合計 = %d\n", point[ROW_SUM][1]);
    printf("C君合計 = %d\n", point[ROW_SUM][2]);

    return 0;
}

<実行結果>

国語合計 = 193
数学合計 = 171
社会合計 = 198
A君合計 = 166
B君合計 = 211
C君合計 = 185
続行するには何かキーを押してください・・・

国語の合計は、

point[0][3] += point[0][0];
point[0][3] += point[0][1];
point[0][3] += point[0][2];

数学の合計は、

point[1][3] += point[1][0];
point[1][3] += point[1][1];
point[1][3] += point[1][2];

社会の合計は、

point[2][3] += point[2][0];
point[2][3] += point[2][1];
point[2][3] += point[2][2];

これで計算出来ます。

二重ループでのiとjの動きに合わせて

point[i][3] += point[i][j];

と書けば、全て科目の合計が計算出来ます。

point[i][3]の3は#defineでCOL_SUMと定義していますので、

point[i][COL_SUM] += point[i][j];

となります。


同じように、A君の合計は

point[3][0] += point[0][0];
point[3][0] += point[1][0];
point[3][0] += point[2][0];

B君の合計は、

point[3][1] += point[0][1];
point[3][1] += point[1][1];
point[3][1] += point[2][1];

C君の合計は、

point[3][2] += point[0][2];
point[3][2] += point[1][2];
point[3][2] += point[2][2];

ですから、

point[3][i] += point[j][i];

とすれば、同じ二重ループで計算出来ます。

point[3][i]の3は#defineでROW_SUMと定義していますので、

point[ROW_SUM][i] += point[j][i];

となります。


上の例では二重ループを2つ使っていますが、1つでも出来ます。


<sample program 091-07>

#include <stdio.h>

#define ROW 4
#define COL 4

#define ROW_SUM 3 /* 横合計欄 */
#define COL_SUM 3 /* 縦合計欄 */

int main(void)
{
    int point[ROW][COL] = {
        { 58, 73, 62, 0 },
        { 36, 82, 53, 0 },
        { 72, 56, 70, 0 },
        {  0,  0,  0, 0 },
    };

    int i;
    int j;

    for (i = 0; i < ROW_SUM; i++) {
        for (j = 0; j < COL_SUM; j++) {
            point[i][COL_SUM] += point[i][j];
            point[ROW_SUM][i] += point[j][i];
        }
    }

    printf("国語合計 = %d\n", point[0][COL_SUM]);
    printf("数学合計 = %d\n", point[1][COL_SUM]);
    printf("社会合計 = %d\n", point[2][COL_SUM]);

    printf("A君合計 = %d\n", point[ROW_SUM][0]);
    printf("B君合計 = %d\n", point[ROW_SUM][1]);
    printf("C君合計 = %d\n", point[ROW_SUM][2]);

    return 0;
}

<実行結果>

国語合計 = 193
数学合計 = 171
社会合計 = 198
A君合計 = 166
B君合計 = 211
C君合計 = 185
続行するには何かキーを押してください・・・

同じ形の二重ループを使っていますので、同時に計算することが可能です。


次回は趣向を変えて、面白いものを作ってみましょう。


次へ

戻る

目次へ