2004 年度「計算機基礎論3B」 2004-11-12

配列

「配列」というのは変数の列です。 K&R2 では §1.6 にあります。

#include <stdio.h>

int a[10];      /* a[0], ..., a[9] が使える */

main() {
    int i, n;

    for (i = 0; i < 10; i++) {      /* 配列に代入 */
        a[i] = i * i;
    }
    for (i = 0; i < 10; i++) {      /* 印字 */
        printf("%d\n", a[i]);
    }
}

#include <stdio.h>  /* エラトステネスのふるいで 10000 以下の素数を全て求める */

#define KESITENAI 0                     /* 消してない */
#define KESITA 1                        /* 消した */

int a[10000+1];                         /* 配列 a[0], ... , a[10000] */

main() {
    int n, i;

    for (n = 2; n <= 10000; n++) {      /* 配列の初期化 */
        a[n] = KESITENAI;
    }

    for (n = 2; n <= 100; n++) {        /* ふるいにかける */
        for (i = 2; n * i <= 10000; i++) {
            a[n*i] = KESITA;
        }
    }

    for (n = 2; n <= 10000; n++) {      /* 結果の出力 */
        if (a[n] == KESITENAI) {
            printf("%d は素数.\n", n);
        } else {
            printf("%d は合成数.\n", n);
        }
    }
}

※ C言語では、配列の要素 a[i] の値を調べたり a[i] に代入したりするとき、 添字 i が正しい範囲にあるかどうかチェックしない。 もしも上のプログラムで a[20000] に代入したとしても、 コンパイル時にも実行時にもエラーメッセージは出ない。 しかし、 プログラムが暴走したりおかしな結果が出たりすることは起こり得るので、 絶対にそのようなプログラムを書いてはならない。

プログラムの中止・一時停止・再開、more

練習問題の前に、 エラトステネスのふるいのプログラムで次の練習をしておくとよい。

出力が大量になり、最初の部分がよく見えない場合などは、 「./a.out」の代わりに「./a.out | more」とする。 一画面分だけ出力されると「--続ける--」が出て止まるので、 スペースバーを押せば次に進む。 次に進まないでプロンプトに戻りたい場合は「q」を押す。

練習問題


岩瀬順一