C 言語で二次元配列を作成する

CCBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、C言語における二次元配列の作成と操作方法を学びます。まず二次元配列を宣言し、次にそれを初期化するさまざまな方法を探ります。次に、配列の要素にアクセスして操作する方法を学びます。最後に、2科目の平均点を計算し、二次元配列の機能を拡張するために知識を適用します。この実験は、C言語における二次元配列の操作に関する包括的な理解を提供します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/PointersandMemoryGroup(["Pointers and Memory"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/data_types("Data Types") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/CompoundTypesGroup -.-> c/structures("Structures") c/PointersandMemoryGroup -.-> c/pointers("Pointers") c/PointersandMemoryGroup -.-> c/memory_address("Memory Address") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/data_types -.-> lab-438259{{"C 言語で二次元配列を作成する"}} c/for_loop -.-> lab-438259{{"C 言語で二次元配列を作成する"}} c/arrays -.-> lab-438259{{"C 言語で二次元配列を作成する"}} c/structures -.-> lab-438259{{"C 言語で二次元配列を作成する"}} c/pointers -.-> lab-438259{{"C 言語で二次元配列を作成する"}} c/memory_address -.-> lab-438259{{"C 言語で二次元配列を作成する"}} c/math_functions -.-> lab-438259{{"C 言語で二次元配列を作成する"}} c/output -.-> lab-438259{{"C 言語で二次元配列を作成する"}} end

二次元配列を宣言する

このステップでは、C言語における二次元配列の宣言方法を学びます。二次元配列は、基本的に配列の配列であり、行と列のグリッド状の構造でデータを格納することができます。

まず、二次元配列の宣言を示す新しいCファイルを作成しましょう。

touch ~/project/two_dimensional_arrays.c

次に、最初の二次元配列の宣言を書きましょう。

#include <stdio.h>

int main() {
    // 3行4列の整数型の二次元配列を宣言する
    int grades[3][4];

    return 0;
}

この例では、grades は3行4列の二次元配列です。これは、合計12個の整数値(3 × 4 = 12)を格納できることを意味します。

二次元配列の宣言方法をさらに探ってみましょう。以下のコードをファイルに追加します。

// 方法1: 初期化付き宣言
int matrix[2][3] = {
    {1, 2, 3},   // 1行目
    {4, 5, 6}    // 2行目
};

// 方法2: 部分的な初期化
int scores[3][3] = {
    {10, 20, 30},
    {40, 50}     // 残りの要素は0になる
};

// 方法3: フラットな初期化
int simple_matrix[2][3] = {1, 2, 3, 4, 5, 6};

コンパイルしてプログラムを実行して確認しましょう。

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

出力例は、何も表示されない空のプログラム実行になります。なぜなら、print文を追加していないからです。

二次元配列宣言に関する要点:

  • 最初のブラケットは行を表します
  • 2番目のブラケットは列を表します
  • 部分的または完全に初期化できます
  • 初期化されていない要素は自動的に0に設定されます
  • 要素の総数 = 行数 × 列数

二次元配列を初期化する

このステップでは、前のステップで学んだ宣言のスキルを基に、C言語における二次元配列の初期化方法を学びます。

前のファイルを修正して、さまざまな初期化手法を調べましょう。

次に、既存のコードを次の初期化方法に置き換えます。

#include <stdio.h>

int main() {
    // 方法1: 完全初期化
    int scores[3][4] = {
        {85, 92, 78, 90},    // 1行目
        {76, 88, 95, 82},    // 2行目
        {63, 71, 89, 93}     // 3行目
    };

    // 方法2: 部分的な初期化
    int temperatures[2][3] = {
        {25, 30, 22},        // 1行目
        {28}                 // 2行目の一部
    };

    // 方法3: フラットな初期化
    int matrix[2][3] = {1, 2, 3, 4, 5, 6};

    // 方法4: すべての要素を0に初期化
    int zeros[3][3] = {0};

    // 最初の方法を表示して確認する
    printf("Student Scores:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", scores[i][j]);
        }
        printf("\n");
    }

    return 0;
}

コンパイルしてプログラムを実行します。

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

出力例:

Student Scores:
85 92 78 90
76 88 95 82
63 71 89 93

重要な初期化方法:

  1. 完全初期化: 各行に値を指定する
  2. 部分的な初期化: 指定されていない要素は0に設定される
  3. フラットな初期化: 値を行ごとに埋める
  4. ゼロ初期化: すべての要素を0に設定する

重要なポイント:

  • 配列を部分的に初期化できる
  • 指定されていない要素は自動的に0に設定される
  • 初期化子の総数は配列サイズを超えてはならない
  • ネストしたブレースは行ごとの初期化を明確にするのに役立つ

二次元配列の要素にアクセスする

このステップでは、C言語においてインデックス付けとネストしたループを使って二次元配列の個々の要素にアクセスする方法を学びます。

要素アクセスを示すために、前のファイルを更新しましょう。

配列要素にアクセスするさまざまな方法を調べるために、次のコードを追加します。

#include <stdio.h>

int main() {
    // 3行4列の学生の成績配列を作成する
    int grades[3][4] = {
        {85, 92, 78, 90},    // 1番目の学生の成績
        {76, 88, 95, 82},    // 2番目の学生の成績
        {63, 71, 89, 93}     // 3番目の学生の成績
    };

    // 方法1: 要素への直接アクセス
    printf("1番目の学生の1科目目の成績: %d\n", grades[0][0]);
    printf("2番目の学生の3科目目の成績: %d\n", grades[1][2]);

    // 方法2: ネストしたループを使った要素のアクセス
    printf("\nネストしたループを使ったすべての成績:\n");
    for (int student = 0; student < 3; student++) {
        for (int subject = 0; subject < 4; subject++) {
            printf("学生 %d, 科目 %d: %d\n",
                   student + 1, subject + 1, grades[student][subject]);
        }
    }

    // 方法3: 配列要素の変更
    grades[2][3] = 95;  // 3番目の学生の最終成績を更新する
    printf("\n更新後の3番目の学生の最終成績: %d\n", grades[2][3]);

    return 0;
}

コンパイルしてプログラムを実行します。

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

出力例:

1番目の学生の1科目目の成績: 85
2番目の学生の3科目目の成績: 95

ネストしたループを使ったすべての成績:
学生 1, 科目 1: 85
学生 1, 科目 2: 92
学生 1, 科目 3: 78
学生 1, 科目 4: 90
学生 2, 科目 1: 76
学生 2, 科目 2: 88
学生 2, 科目 3: 95
学生 2, 科目 4: 82
学生 3, 科目 1: 63
学生 3, 科目 2: 71
学生 3, 科目 3: 89
学生 3, 科目 4: 95

更新後の3番目の学生の最終成績: 95

二次元配列の要素にアクセスする際の要点:

  • 2つのインデックスを使用する: array[row][column]
  • 最初のインデックスは行(垂直方向)を表す
  • 2番目のインデックスは列(水平方向)を表す
  • インデックスは0から始まる
  • ネストしたループは、配列全体をトラバースするのに便利
  • 個々の要素を直接読み取り、変更することができる

2科目の平均点を計算する

このステップでは、二次元配列を使って、複数の学生の異なる科目の平均点を計算する方法を学びます。

科目の平均点を計算するために、前のファイルを更新しましょう。

平均点を計算して表示するために、次のコードを追加します。

#include <stdio.h>

#define STUDENTS 5
#define SUBJECTS 3

int main() {
    // 学生の点数を格納する二次元配列を作成する
    int marks[STUDENTS][SUBJECTS] = {
        {85, 92, 78},
        {76, 88, 95},
        {63, 71, 89},
        {90, 84, 77},
        {82, 79, 91}
    };

    // 科目の平均点を格納する配列
    float subject_averages[SUBJECTS];

    // 各科目の平均点を計算する
    for (int subject = 0; subject < SUBJECTS; subject++) {
        int subject_total = 0;

        // 現在の科目の点数を合計する
        for (int student = 0; student < STUDENTS; student++) {
            subject_total += marks[student][subject];
        }

        // 平均点を計算する
        subject_averages[subject] = (float)subject_total / STUDENTS;
    }

    // 科目の平均点を表示する
    printf("Subject Averages:\n");
    for (int subject = 0; subject < SUBJECTS; subject++) {
        printf("Subject %d: %.2f\n", subject + 1, subject_averages[subject]);
    }

    // ボーナス: 最高と最低の科目平均点を求める
    float highest_avg = subject_averages[0];
    float lowest_avg = subject_averages[0];
    int highest_subject = 0;
    int lowest_subject = 0;

    for (int subject = 1; subject < SUBJECTS; subject++) {
        if (subject_averages[subject] > highest_avg) {
            highest_avg = subject_averages[subject];
            highest_subject = subject;
        }
        if (subject_averages[subject] < lowest_avg) {
            lowest_avg = subject_averages[subject];
            lowest_subject = subject;
        }
    }

    printf("\nHighest Average: Subject %d (%.2f)\n",
           highest_subject + 1, highest_avg);
    printf("Lowest Average: Subject %d (%.2f)\n",
           lowest_subject + 1, lowest_avg);

    return 0;
}

コンパイルしてプログラムを実行します。

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

出力例:

Subject Averages:
Subject 1: 79.20
Subject 2: 82.80
Subject 3: 86.00

Highest Average: Subject 3 (86.00)
Lowest Average: Subject 1 (79.20)

示された重要な概念:

  • 二次元配列を処理するためのネストしたループの使用
  • 行と列にわたる平均点の計算
  • 最高と最低の平均点を見つける
  • 浮動小数点数の平均点を計算するための型キャスト
  • 配列の次元を定義する定数の使用

二次元配列の機能を拡張する

この最後のステップでは、二次元配列の機能を拡張する高度な技術を学びます。これには、関数に配列を渡す方法、動的メモリ割り当て、そしてより複雑な配列操作の作成などが含まれます。

これらの高度な概念を示すために、前のファイルを更新しましょう。

前のコードを次の包括的な例に置き換えます。

#include <stdio.h>
#include <stdlib.h>

#define ROWS 3
#define COLS 4

// 二次元配列を表示する関数
void printArray(int arr[ROWS][COLS]) {
    printf("Array Contents:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%4d ", arr[i][j]);
        }
        printf("\n");
    }
}

// 二次元配列を転置する関数
void transposeArray(int original[ROWS][COLS], int transposed[COLS][ROWS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            transposed[j][i] = original[i][j];
        }
    }
}

int main() {
    // 静的二次元配列
    int matrix[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    // 元の配列を表示する
    printf("Original Array:\n");
    printArray(matrix);

    // 配列を転置する
    int transposed[COLS][ROWS];
    transposeArray(matrix, transposed);

    // 転置した配列を表示する
    printf("\nTransposed Array:\n");
    for (int i = 0; i < COLS; i++) {
        for (int j = 0; j < ROWS; j++) {
            printf("%4d ", transposed[i][j]);
        }
        printf("\n");
    }

    // 2次元配列の動的メモリ割り当て
    int **dynamicMatrix;
    dynamicMatrix = (int **)malloc(ROWS * sizeof(int *));
    for (int i = 0; i < ROWS; i++) {
        dynamicMatrix[i] = (int *)malloc(COLS * sizeof(int));
    }

    // 動的行列を初期化する
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            dynamicMatrix[i][j] = i * COLS + j + 1;
        }
    }

    // 動的行列を表示する
    printf("\nDynamic Matrix:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%4d ", dynamicMatrix[i][j]);
        }
        printf("\n");
    }

    // 動的に割り当てたメモリを解放する
    for (int i = 0; i < ROWS; i++) {
        free(dynamicMatrix[i]);
    }
    free(dynamicMatrix);

    return 0;
}

コンパイルしてプログラムを実行します。

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

出力例:

Original Array:
   1   2   3   4
   5   6   7   8
   9  10  11  12

Transposed Array:
   1   5   9
   2   6  10
   3   7  11
   4   8  12

Dynamic Matrix:
   1   2   3   4
   5   6   7   8
   9  10  11  12

示された重要な高度な概念:

  • 関数に二次元配列を渡す
  • 配列の転置
  • 2次元配列の動的メモリ割り当て
  • malloc()free() を使ったメモリ管理
  • 柔軟な配列操作技術

まとめ

この実験では、C言語における二次元配列の宣言方法を学びました。二次元配列は、配列の配列であり、行と列を持つグリッド状の構造でデータを格納することができます。宣言と初期化のさまざまな方法を調べました。完全初期化、部分的な初期化、フラットな初期化などです。また、初期化されていない要素は自動的に0に設定され、二次元配列の要素の総数は行数と列数の積によって決まることも学びました。

宣言のスキルを基に、C言語における二次元配列の初期化方法を学びました。行ごと、列ごとに値を割り当てる方法や、フラットなアプローチを使う方法などです。また、二次元配列内の個々の要素にアクセスする方法を調べました。行と列のインデックスを使ってアクセスする方法です。