第9回 | C言語の配列の基本を学ぶ:同じ型の値をまとめて扱う| UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第9回|C言語の配列の基本を学ぶ:同じ型の値をまとめて扱う

はじめてのC言語 | 第9回

目次

はじめに

前回は、関数を使って処理をまとめる方法を学びました。
今回は、同じ型の値をまとめて保存する「配列」を扱います。

この回の目的は次の5点です。

  • 配列の役割を理解する
  • 配列の宣言と初期化の書き方を覚える
  • 要素の取り出し方を知る
  • for 文と組み合わせた基本的な使い方を確認する
  • 2次元配列の基本を知る

配列とは何か

配列は、同じ型の値を順番に並べて保存する仕組みです。
たとえば、5人分の点数を保存したいときに使います。

変数を5個用意することもできますが、配列を使うと1つのまとまりとして扱えます。

配列の基本形

宣言の書式

型 配列名[要素数];

例:

int scores[5];

このコードは、整数を5個保存できる配列 scores を宣言しています。

最初のサンプルコード

ソースコード

array_sample.c という名前で保存します。

#include <stdio.h>

int main(void) {
    int scores[3];

    scores[0] = 80;
    scores[1] = 90;
    scores[2] = 75;

    printf("%d\n", scores[0]);
    printf("%d\n", scores[1]);
    printf("%d\n", scores[2]);

    return 0;
}

実行手順

1. 作業ディレクトリに移動する

cd ~/Desktop

2. コンパイルする

clang array_sample.c -o array_sample

3. 実行する

./array_sample

実行結果:

80
90
75

コードの読み方

int scores[3];

整数を3個保存できる配列 scores を宣言しています。

scores[0] = 80;

配列の先頭の要素に 80 を代入しています。

scores[1] = 90;

2番目の要素に 90 を代入しています。

scores[2] = 75;

3番目の要素に 75 を代入しています。

配列の添字に注意する

C言語の配列は、0番目から始まります。
3個の要素がある場合、使える添字は次の3つです。

  • 0
  • 1
  • 2

つまり、scores[3] は使えません。

初期化して宣言する

配列は、宣言と同時に値を入れることもできます。

#include <stdio.h>

int main(void) {
    int scores[3] = {80, 90, 75};

    printf("%d\n", scores[0]);
    printf("%d\n", scores[1]);
    printf("%d\n", scores[2]);

    return 0;
}

実行結果は同じです。

80
90
75

この書き方の方が、値が最初から決まっているときは分かりやすいです。

for 文で配列を順番に処理する

配列は for 文と非常に相性が良いです。

#include <stdio.h>

int main(void) {
    int scores[3] = {80, 90, 75};
    int i;

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

    return 0;
}

実行結果:

80
90
75

なぜ for 文と組み合わせるのか

配列の要素が増えるたびに、次のように1行ずつ書くのは非効率です。

printf("%d\n", scores[0]);
printf("%d\n", scores[1]);
printf("%d\n", scores[2]);

for 文を使えば、添字を変えながら同じ処理を繰り返せます。

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

この形は、配列を扱う基本になります。

合計を計算する例

配列の要素を順番に足していく例です。

#include <stdio.h>

int main(void) {
    int scores[3] = {80, 90, 75};
    int i;
    int total = 0;

    for (i = 0; i < 3; i++) {
        total = total + scores[i];
    }

    printf("%d\n", total);

    return 0;
}

実行結果:

245

平均を計算する例

整数同士の割り算になる点に注意します。

#include <stdio.h>

int main(void) {
    int scores[3] = {80, 90, 75};
    int i;
    int total = 0;
    int average;

    for (i = 0; i < 3; i++) {
        total = total + scores[i];
    }

    average = total / 3;
    printf("%d\n", average);

    return 0;
}

実行結果:

81

245 / 3 は 81.666… ですが、int 型同士の計算なので結果は 81 になります。

初心者がつまずきやすい点

添字は0から始まる

これは配列で最も重要な点です。

scores[0]

が最初の要素です。
1 から始まるわけではありません。

範囲外の添字を使わない

次のようなコードは問題があります。

int scores[3] = {80, 90, 75};
printf("%d\n", scores[3]);

scores[3] は範囲外です。
C言語ではこのようなアクセスは未定義動作になります。
エラーにならずに動いてしまうこともありますが、正しい結果は保証されません。

要素数と繰り返し回数を合わせる

次のコードは危険です。

for (i = 0; i < 5; i++) {
    printf("%d\n", scores[i]);
}

scores が3要素しかない場合、scores[3]scores[4] にアクセスしてしまいます。

よくあるエラー

use of undeclared identifier

原因: 配列や変数を宣言する前に使っています。
対処: int scores[3];int i; を先に書きます。

範囲外アクセスによる不正な動作

原因: 添字が大きすぎます。
対処: 配列の要素数を確認し、for 文の条件を見直します。

初期化の個数が多すぎる

誤った例:

int scores[3] = {80, 90, 75, 60};

要素数より多い値は入れられません。

2次元配列とは何か

配列は、横一列に値を並べるだけでなく、表のように行と列で値を管理することもできます。
このような配列を「2次元配列」と呼びます。

たとえば、3人分の点数を、国語・数学・英語の3教科で保存したい場合を考えます。

int scores[3][3] = {
    {80, 70, 90},
    {75, 85, 60},
    {90, 95, 88}
};

この配列は、3行3列の表として考えることができます。

  • scores[0][0] は、1人目の国語の点数
  • scores[0][1] は、1人目の数学の点数
  • scores[1][0] は、2人目の国語の点数

2次元配列では、最初の添字が「行」、次の添字が「列」を表すと考えるとわかりやすくなります。

2次元配列のサンプルコード

#include <stdio.h>

int main(void) {
    int scores[3][3] = {
        {80, 70, 90},
        {75, 85, 60},
        {90, 95, 88}
    };

    printf("%d\n", scores[0][0]);
    printf("%d\n", scores[0][1]);
    printf("%d\n", scores[0][2]);

    return 0;
}

実行結果:

80
70
90

このコードでは、1人目の3教科の点数を順番に表示しています。

2重の for 文で表示する

2次元配列のすべての値を表示するときは、for 文を2つ組み合わせます。

#include <stdio.h>

int main(void) {
    int scores[3][3] = {
        {80, 70, 90},
        {75, 85, 60},
        {90, 95, 88}
    };
    int i;
    int j;

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

    return 0;
}

外側の for 文は行を進め、内側の for 文は列を進めています。

2次元配列も、添字は 0 から始まります。
scores[3][0]scores[0][3] のように、範囲外の添字を指定しないように注意しましょう。

ミニゲーム:九九の段を選んで表示する

2次元配列を使うと、表のようなデータをまとめて保存できます。次の array_09.c は、九九の答えを 9 行 9 列の配列に入れておき、入力された段だけを表示するミニゲームです。

int a[9][9]; は、整数を 9×9 個保存できる2次元配列です。九九の表全体を配列に保存しておくことで、あとから必要な場所だけを取り出せます。

#include <stdio.h>

int main(void) {
    int a[9][9];
    int i, j, dan;

    // 1. まず九九を全部計算して配列に入れておく
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) {
            a[i - 1][j - 1] = i * j;
        }
    }

    // 2. ユーザーに聞く
    printf("何段を表示しますか? (1-9): ");
    if (scanf("%d", &dan) != 1) {
        printf("整数を入力してください。\n");
        return 1;
    }

    // 3. 入力された段だけ表示する
    if (dan >= 1 && dan <= 9) {
        printf("--- %dの段 ---\n", dan);
        for (j = 1; j <= 9; j++) {
            printf("%dx%d = %d\n", dan, j, a[dan - 1][j - 1]);
        }
    } else {
        printf("1から9までの数字を入力してください。\n");
    }

    return 0;
}

コンパイルと実行:

clang array_09.c -o array_09
./array_09

たとえば 7 を入力すると、次のように 7 の段だけが表示されます。

何段を表示しますか? (1-9): 7
--- 7の段 ---
7x1 = 7
7x2 = 14
7x3 = 21
7x4 = 28
7x5 = 35
7x6 = 42
7x7 = 49
7x8 = 56
7x9 = 63

このプログラムの中心は、最初の2重の for 文です。外側の for 文が段を進め、内側の for 文が 1 から 9 までのかけ算を進めています。

for (i = 1; i <= 9; i++) {
    for (j = 1; j <= 9; j++) {
        a[i - 1][j - 1] = i * j;
    }
}

ij は 1 から 9 まで動きますが、配列の添字は 0 から始まります。そのため、保存するときは a[i - 1][j - 1] と書いています。たとえば 7 の段の 3 番目の答えは、a[6][2] に入っています。

練習用コード

5個の整数を表示する

#include <stdio.h>

int main(void) {
    int numbers[5] = {10, 20, 30, 40, 50};
    int i;

    for (i = 0; i < 5; i++) {
        printf("%d\n", numbers[i]);
    }

    return 0;
}

合計を求める

#include <stdio.h>

int main(void) {
    int numbers[5] = {10, 20, 30, 40, 50};
    int i;
    int total = 0;

    for (i = 0; i < 5; i++) {
        total = total + numbers[i];
    }

    printf("%d\n", total);

    return 0;
}

実行結果:

150

まとめ

今回のポイントは次のとおりです。

  • 配列は同じ型の値をまとめて保存する仕組みである
  • 配列の添字は 0 から始まる
  • scores[i] のようにして各要素を扱う
  • 配列は for 文と組み合わせると効率よく処理できる
  • 2次元配列を使うと、表のように行と列で値を管理できる

この回では、C言語の配列の基本を確認しました。
配列を使えるようになると、複数の値をまとめて処理できるようになります。

次回予告

次回は、文字列の基本を学びます。
C言語では文字列も配列と深く関係しているため、ここまでの内容がそのまま土台になります。

文字の並びをどう扱うのかを理解すると、C言語でできることがまた少し広がっていきます。

復習してみよう

復習したい方は、こちらもあわせてご覧ください。

C言語の次にUnityやUnreal Engineを学ぶ選択肢

用途ごとに選ぶ C言語のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

目次