Subsections

5章 配列

5.1 本日の課題

  1. 教科書に例, 説明があるので, プログラムを作成し動作を確認することで, 下に挙げる「学習のポイント」, 「新しい文法事項」を理解する.

  2. 配列a, b, c, d の宣言と初期化を
    #define N 8
    
       double a[] = {1.0, 2.0, 3.0, 4.0, 5.0};
       double b[5] = {0.0};
       double c[5] = {0.0, 1.0};
       double d[N] = {0.0, 1.0};
       double e[2][3] = {{1.0, 2.0, 3.0}, {10.0, 20.0, 30.0}};
    
    のように行うこととする. このとき, 各配列の全ての要素を printf 関数により画面(標準出力)に出力するプログラムを作成せよ.

  3. 以下のプログラムの中から幾つかを作成せよ.

  4. 講義終了時に, 作成したプログラム(.cが付くファイル)をメールで提出する. 本文に, 学籍番号, 氏名を明記すること.

5.2 学習のポイント

配列の宣言
p. 89. 配列の宣言は int vc[5];のように, []を用いて行う.
添字
配列の各要素は, vc[0], vc[1], .., vc[4] のように[]の中に整数(添字)を入れて表す. 添字は, 最初の要 素からいくつ離れているかを表している. 最初の要素はvc[0]となるこ とに注意.
配列とfor
代入と参照を理解する. 配列は複数のデータを扱うことを想定しているので, forを用いて複数のデータを扱う. (List5-2, List 5-3, List 5-4)
配列の初期化
以下の3つの初期化の方法がある.
   int vc[] = {1, 2, 3, 4, 5};
   int vc[5] = {0};
   int vc[5] = {0, 1};
配列のコピー
for を用いて配列をコピーする. 代入演算子=により, 代入することはできないことに注意. 従って次のプログラムは誤りである.
int main(void)
{
    int i;
    int a[5] = {1, 2, 3, 4, 5};
    int b[5];

    b = a; // 誤り.

    return 0;
}
C言語では, このような代入は, 構造体を用いることで実現できる.
配列の要素に値を読み込む
scanfにより, 配列の要素に値を読み込むときは, 要素の前に&をつける. (List 5-7)
#include <stdio.h>

int main(void)
{
    double vx[5];

    scanf("%lf", &vx[3]); // vx[3]に値を読み込む.
    printf("vx[3]= %f\n", vx[3]);

    return 0;
}

全ての配列要素に値を読み込む時は forを用いて次のようにする.

#include <stdio.h>

int main(void)
{
    int i;
    double vx[5];

    for(i=0; i<5; i++)
        scanf("%lf", &vx[i]); // vx[i]に値を読み込む.

    for(i=0; i<5; i++)
        printf("vx[%d]= %f\n", i, vx[i]); // vx[i]を出力する.

    return 0;
}

多次元配列
多次元配列はさらに[]を加えて表す. 2次元配列は, int a[10][10];, int a[10][10][10]; のように宣言する.
参照, 代入
各要素は a[i][j] のようにして用いる.
初期化
つぎのように初期化する.
   int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
   int b[2][3] = {0};

5.3 新しい文法事項

マクロ
p.96- プログラム全体用いる定数は, マクロで定義することができる.
#define NUMBER 5
C言語では, 大域的な変数, 定数には大文字を, 局所的な変数, 定数には小文字を使う慣習がある.

代入式
代入式を評価すると, 代入が終わった後の左辺が,代入式全体の値になる. a = (b = 1);とすると b=1;が実行され, 「b=1」が「1」という値を持つ. その後, a = 1 という代入が実行される. これは, 括弧をはずして a = b = 1; としても同じ結果が得られるように, 代入の優先順位が定められている.

コンマ演算子
a, b p.110 Table 5-1

5.4 注意

p.89に

配列を宣言する際の要素数は, 定数でなければなりません. すなわち,以下のような宣
言はエラーとなることを覚えておきましょう.
    int n = 5;
    int a[n];    /* エラー:要素数は定数でなければならない */
とあるが, これは1989年, 1990年のC言語の規格 C90に基づいた仕様.

その後 1999年に改訂された規格(C99)では, 要素数に変数を用いることができる. これは特に可変長配列と呼ばれる. さらに, C99では型宣言をブロック内のどこで行ってもよい. 従って, 以下のようなプログラムが可能である.

#include <stdio.h>

int main(void)
{
    int n;
    scanf("%d", &n);
    int a[n];

    a[0] = 0;

    /* ... */

    return 0;
}

ただし, コンパイラーが対応していないと実際に使用することはできない. gcc でコンパイルする場合には,

gcc -std=c99 filename.c

のように -std=c99 オプションを付ける.

(c)1999-2013 Tetsuya Makimura