練習問題
int a[10] と宣言された配列 a があり,最初と最後の要素 a[0] と a[9] の値は -1
であるが,その他の要素の値は 0, 1, 2 のいずれかとする。また,p を 1 <= p <= 8 であるような整数とする。
a[p+1], a[p+2], ... の要素の値を見たとき,0を挟まず2が1個以上続いて,その直後に 1
があるかどうかを調査し,そうであれば続いている2の個数を,そうでなければ 0 を返す関数 check(a, p) を作れ。
この調査を行う関数は,以外にも簡単に次のようにコーディングできる.
int check(int a[10], int p) { int i; for (i = 1; a[p+i] == 2; i++); if (a[p+i] == 1) { return i-1; } else { return 0; } }
for 文の反復条件 a[p+i] == 2 に注意しよう.また, for
文には本体部分がない.すなわち,この for 文は,ただ i の値を増やすだけの目的で,そこにある.
この for 文が停止したとき, a[p+i] は, a[p+1], a[p+2], ... a[9] の中で, 2
でないもの(このような要素は必ずある.なぜなら, a[9] の値は -1 だから)のうち,最初の要素である.そして i-1 の値が,2が続いた個数である.a[p+i] が 1 のときだけその値を返して,
そうでなければ 0 を返せばよい.
この for 文が機能するのは, a[9] == -1 という要素があるからだ. そうでなければ,この for ループは無限ループに陥ってしまう. このような要素を「番兵」と言う.プログラムの動きが決められた範囲を出ないよう,この番兵が見張るわけだ.この番兵のテクニックは,複雑な動きを制御するときに非常に役に立つ.ぜひ,覚えておこう.