Othello 練習問題2

練習問題
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 ループは無限ループに陥ってしまう. このような要素を「番兵」と言う.プログラムの動きが決められた範囲を出ないよう,この番兵が見張るわけだ.この番兵のテクニックは,複雑な動きを制御するときに非常に役に立つ.ぜひ,覚えておこう.