第22回
データ構造(1)~配列とその扱い

配列と繰り返し処理

ここで紹介してきたように、同じ型の変数が複数並んだ配列では、繰り返しによる処理がよく用いられます。先に入力の例を紹介したので、今度は出力の例を1つ紹介しておきましょう。

配列の値を出力する

signed short int型のscoreという配列に、あるテストの結果得られた値が格納されているとします。配列の要素は10としますが、実効性のある値はテストが行われた回数によって変わるため、有効な要素数は分かりません。そのため、最後の有効な値を持つ要素の次の要素には-1が入っているものとします。

例えば、テストが6回実行された結果、配列scoreは以下のような状態になっているとします。
添字  0    1    2    3    4    5    6    7    8    9
値  12    8    7   11    6   13   -1    ?    ?    ?

'*'による棒グラフ

このような配列から値を順次取り出して、数値を複数の'*'で棒グラフとして画面に表示する処理は、リスト3のようになります。

リスト3は完全な実行形式のソースではないため、プログラムとして実行することはできません。以下は、サンプルのexeをコンパイルしたものを実行した結果です。
----------------------------------------------------------------------
0001 : ************
0002 : ********
0003 : *******
0004 : ***********
0005 : ******
0006 : *************
----------------------------------------------------------------------

リスト3:配列から順次値を取り出して*の数で表示する処理(ex2203.cEX2203.EXE)
signed short int score[10];    /* テストの結果を格納する配列 */
int cnt = 0;    /* 繰り返しの回数を保持 */
int i;

        :
    (配列scoreに値を取り込む処理)
        :
/* 配列の要素が-1になるまで繰り返す */
while (score[cnt] != -1) {
  printf("%04d : ", cnt + 1);
  /* 要素の保持する数だけ'*'を出力 */
  for (i = 0; i < score[cnt]; i++) {
    (void)putchar((int)'*');
  }
  (void)putchar((int)'\n');
  cnt++;
}
この処理を実行形式としたソースは、"ex2203.c"というファイル名でサンプルに収録しています。

whileとforの二重ループ

まず
while (score[cnt] != -1) {
のところで、配列scoreの添字cntで示す要素の値が-1でなければ続く{ }内の処理を繰り返します。

繰り返す処理では
printf("%04d : ", cnt + 1);
と、cntの値に1を加算した値を表示します。cntが0から始まっているためです。

続いて
for (i = 0; i < score[cnt]; i++) {
とforループを使い、配列scoreの添字cntで示す要素の値の数だけ処理を繰り返します。この繰り返しの中では1文字を出力するputchar関数を使って、配列scoreの添字cntで示す要素の値の数だけ'*'を出力します。
(void)putchar((int)'*');
そして、必要数'*'を出力してforループを抜けたら、改行(\n)を出力します。
(void)putchar((int)'\n');
putchar関数は引数の1文字を標準出力に出力する関数で、以下のように宣言されています。
int putchar(int);
引数にint型の1文字を与え、出力した文字を返します。ここでは1文字をunsigned char型で出力するため、(int)として型変換(キャスト)を行っています。また、戻り値は使わないため関数名の前に(void)を付けて戻り値を捨てています。