C言語

【C言語】第3章第6回:多次元配列の基礎

多次元配列は、行列や表形式のデータを格納するために使われるデータ構造です。この章では、2次元配列を中心に、多次元配列の宣言、初期化、操作方法を解説します。

1. 多次元配列とは?

多次元配列は、配列の中にさらに配列を持つ構造を持ちます。特に2次元配列は、行と列で構成され、表形式のデータを管理するのに適しています。

例:2次元配列の宣言

int matrix[3][4]; // 3行4列の2次元配列

上記の例では、matrixは3行4列(合計12個の要素)を持つ2次元配列を表します。

2. 2次元配列の初期化

2次元配列は、以下のように初期化できます。

例:2次元配列の初期化と表示

#include <stdio.h>

int main() {
    int matrix[2][3] = {
        {1, 2, 3}, // 1行目
        {4, 5, 6}  // 2行目
    };

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);
        }
    }

    return 0;
}

解説:

  • 各行のデータを{}で囲み、配列を初期化します。
  • matrix[i][j]:配列の行i、列jに対応する要素にアクセスします。

3. 部分初期化とデフォルト値

部分的に初期化した場合、未初期化の要素はデフォルト値(整数型では0)になります。

例:部分初期化の例

#include <stdio.h>

int main() {
    int matrix[2][3] = {
        {1, 2}, // 1行目の3列目は自動的に0
        {4}     // 2行目の2列目と3列目は自動的に0
    };

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);
        }
    }

    return 0;
}

解説:

  • 部分的に初期化された要素以外は0に初期化されます。
  • 未使用の要素は明示的に0と設定しなくても問題ありません。

4. 2次元配列の応用例:行列の加算

2次元配列を使って、行列の加算を行うプログラムを作成します。

例:2つの行列の加算

#include <stdio.h>

int main() {
    int matrix1[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    int matrix2[2][3] = {
        {7, 8, 9},
        {10, 11, 12}
    };
    int result[2][3];

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("result[%d][%d] = %d\n", i, j, result[i][j]);
        }
    }

    return 0;
}

解説:

  • 対応する要素を加算して、新しい行列resultに格納します。
  • 2重ループを使い、行と列を効率的に操作します。

5. 練習問題

以下の課題に挑戦して、多次元配列の基本を練習しましょう。

  1. 3行2列の2次元配列を初期化し、すべての要素を表示するプログラムを作成してください。
  2. 2つの3行3列の行列を加算し、結果を表示するプログラムを作成してください。
  3. 2次元配列内の最大値を探し、その行と列を表示するプログラムを作成してください。

6. 練習問題の解答と解説

問1の解答

#include <stdio.h>

int main() {
    int matrix[3][2] = {
        {1, 2},
        {3, 4},
        {5, 6}
    };

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);
        }
    }

    return 0;
}

問2の解答

#include <stdio.h>

int main() {
    int matrix1[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int matrix2[3][3] = {
        {9, 8, 7},
        {6, 5, 4},
        {3, 2, 1}
    };
    int result[3][3];

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("result[%d][%d] = %d\n", i, j, result[i][j]);
        }
    }

    return 0;
}

問3の解答

#include <stdio.h>

int main() {
    int matrix[3][3] = {
        {1, 2, 3},
        {9, 8, 7},
        {4, 5, 6}
    };

    int max = matrix[0][0];
    int row = 0, col = 0;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (matrix[i][j] > max) {
                max = matrix[i][j];
                row = i;
                col = j;
            }
        }
    }

    printf("Maximum value: %d at row %d, column %d\n", max, row, col);

    return 0;
}

7. まとめ

多次元配列は、複雑なデータを効率的に管理するための重要なツールです。基本的な操作を理解し、実際の課題で応用してみましょう。