配列による多数データの取り扱い

注意! 変数の初期化忘れによる奇妙な振るまい

C言語では,プログラム中で宣言した変数について,その宣言直後の中身(変数の値)については「不定(決まってない)」という言語仕様(約束)になっています.

これにより,宣言しただけで一度も何か値を代入しないままに変数の値を使ってしまうようなコードを書くと,コンパイルも出来て一応は動くのだが,その変数の値が状況(動かすタイミング,機種の違い,同時に使っている他のソフトウエアのメモリ使用状態など)で様々に変化しており,プログラムが思ったように動かない(つまり,バグ)という現象が起きる事があります.

この現象を確認するためのサンプルを以下に置きましたので,各自,コンパイル・実行してみて試してみてください.

尚,全く同じプログラムをNetBoot環境で動作させた場合,ローカルブートで動作させた場合などでプログラムの挙動が変わるかも知れません.各自,試してみてください.

教訓としては,C言語では変数宣言した後で,最低一度は代入文を実行して何かの値が代入されている事をしっかり確認するように習慣づけしておくと良いでしょう.

配列

プログラムで取り扱うデータの個数が少ない場合は,それぞれのデータを入れておく変数を個別に用意すれば良い.しかし,取り扱うデータ数が数十とか数百個になると,それぞれのデータを格納しておく変数を個別に宣言するのは大変であるし,また,間違いも起こりやすい.

配列とは,デ−タの入れ物が複数個並んでいるものを用いて,数多くのデータを分かりやすく系統的に取り扱うための仕組みである.

配列の基本的考え方

配列の基本は,データが入る箱を一列に並べた全体に配列名という名前をつけたものである.これを1次元配列と呼ぶ.また,個々の箱を配列要素と呼び,各要素を区別するために要素番号という番号を付けている.一個の配列要素のそれぞれは変数のように一個のデータを格納出来る.

例えば,

int array[5];

という宣言は,「arrayという名前の配列を使い,そこに格納できる要素は整数型,格納する要素数は5個である」ことを意味している.この配列arrayの最初の要素はarray[0]と表され,最後の要素はarray[4]と表される.

尚,C言語では配列の先頭要素は0番目と数えるので気をつけよう.

補足

各配列要素は機能的には「数値を覚えておく入れ物」であり,殆どの場合,プログラム中で変数と同じように使う事が出来る.(但し,要素番号は必ず指示する.また,要素番号の指示には変数が使える.)

例えば,以下のプログラムはキーボードから入力された数値を変数inputに格納しておき,後で画面出力している例であるが,

int input;
    ....
    ....
scanf("%d", &input);
    ....
    ....
printf("入力された整数: %d¥n", input); 
    ....
    ....

上記で使っている整数型変数inputと同じように配列numbersの配列要素に対して,

int i;
int numbers[5]; // 要素数5個の整数型配列
    ....
    ....
i = 3; 
    ....
    ....
scanf("%d", &numbers[i]);
    ....
    ....
printf("入力された整数: %d¥n", numbers[i]); 
    ....
    ....

というような使い方が許されている.

練習1

教科書プログラム例6.4のソースプログラムを作成して,その動作を確認せよ.

練習2

上記で確認したプログラムを少し修正して,データを入力した順番に,そのデータの二乗を計算して画面表示するように修正してみよ.

練習3

教科書プログラム例6.5が以下のディレクトリ位置に配置してある.各自の手元でコンパイルして実行してみよ.

この例題のデ−タ入力部分のfor文の繰返しの継続条件を

count < 6;

から

count < 7;

に変更して実行してみると,どのような現象が起きるか確認せよ.

さらに,

count < 1000000; // 百万

に変更するとプログラムがどのような動作となるか確認せよ.

上記の練習3から分かるように,C言語では,配列サイズを越えないように配列要素を使っているかどうかのチェックは行われない.このため,配列サイズ(配列要素数)を間違えると,一見,正常に動いているように思われるプログラムが,突然,強制終了したり暴走して止まらなくなったりすることがある.配列サイズ間違いのようにプログラムを実行している途中で初めて発覚するプログラムの間違いを「実行時エラー」と呼ぶ.

実行時エラーを引き起こす原因は幾つか考えられるが,何れもソースプログラムのコンパイル時には発見できないために非常に見つけにくい間違いとなることが多い.配列を利用するときには配列要素数に十分注意しながらプログラムを作成すること.

多次元配列

2次元配列

取り扱うデータが一列でなく縦横の升目に並んでいる場合を取り扱いたい場合,2次元配列と呼ばれる配列を用いる.このようなデータの例としては線形代数学に出てくる「行列」などがある.

例えば,

int table[3][5];

という宣言は,縦に3行横に5列の整数型データの入れ物が並んだtableという名前の整数型2次元配列を使うことを意味している.

練習4

9行×9列の整数型二次元配列として「単位行列」となる数表を作成しこれを表示するプログラム(ファイル名matrix.c)を作成せよ.尚,数表の作成処理部分は「繰り返し処理」を用いて実現すること.また,作成する数表は9×9単位行列なので各配列要素をキーボード入力しなくても繰り返し処理の中で少し工夫して実現すること.(ただ単にprintf関数を使って以下とそっくりに0,1が並んでいる文字メッセージを画面表示するだけではダメです.念のため.)

1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1

多次元配列

C言語では縦横高さ方向にデータが並んだ3次元配列など,さらに高次元の多次元配列を取り扱う事も出来る.

例えば,

int qube[3][5][2];

という配列宣言は3行5列のデータ並びが2段積まれたビルディングのような3次元配列を示している.

基本的な考え方は2次元配列と同様であり,単に次元が増えただけである.詳細は教科書6.2.2節を参照のこと.

提出課題

まず,100個の要素を持つ整数型配列を用意する.プログラム起動後の最初に1以上100以下の整数を「デ−タ個数」として入力し,その後,「デ−タ個数」だけ整数値をキ−ボ−ドから読み取り,配列の先頭から順番に格納する.

全てのデ−タをキ−ボ−ドから読み取った後,その読み取った各整数の最大値と最小値を,それぞれ探しだして表示するプログラムmaxmin.cを作成せよ.

考え方のヒント にあるので参考にして構わないが,但し,このファイル内容は以下の状態になっているので,そのままでは内容が読めないだろう.何らかのコマンド操作(こちらのページ参照)にて内容が読めるように「復元」する必要がある.

以下の実行例ではキ−ボ−ドから入力した数値は赤色で示す.

デ−タの個数を入力して下さい > 5
No. 0 data = 24
No. 1 data = -56
No. 2 data = 10
No. 3 data = 5
No. 4 data = 48
最大値 = 48
最小値 = -56
デ−タの個数を入力して下さい > 11
No. 0 data = 45
No. 1 data = 29
No. 2 data = 10
No. 3 data = 4
No. 4 data = -12
No. 5 data = 39
No. 6 data = 105
No. 7 data = -45
No. 8 data = 2
No. 9 data = 99
No. 10 data = 105
最小値 = -45
最大値 = 105

作成したプログラムはmoodle学習支援システムにて提出すること.

レポート名: program/maxmin

提出期限: 教員の指示による

基礎プログラミング演習Iの表紙ページへ戻る