練習問題1: 整数型配列 array の,array[0] から array[n-1]までの n
個の要素の中から,指定された値
val をもつ要素を探して,その添字を返す関数
int arrayIndex(int array[], int n, int val)
を作れ。ただし,そのような要素が複数個あるときには,その中で最初の要素(添字が最小のもの)の添字を,またそのような要素がないときには,-1を返すものとする。
まずは,関数仕様をきちんと書くことから始めよう。
int arrayIndex(int array[], int n, int val) { int i; for (i = 0; i < n; i++) { if (array[i] == val) return i; } return -1; }
for 文の途中で array[i] == val であるような要素が見つかれば,for 文の実行を中断し,関数の戻り値を i として関数は終了する. for 文が正常に終了したならば,値が val であるような要素がなかったことになり, -1 を戻り値とする.
関数としては上のもので良いのだが,このくらいの短いことならば,関数にしないで,関数を呼び出すべき所に,そのまま処理を書く(インライン展開)こともある. そのときには, for 文の途中で array[i] == val であるものが見つかった時点で for 文を中断 (break) し,次へ処理を進めればよい.
このとき,for 文がどのようにして終わったのか,すなわち,目的の要素が見つかり中断されたのか,最後まで見つからずに終了したのか,を判断する必要がある.
その一つの方法として,フラグを用いることがある.フラグとは,プログラムの途中で,どのような状況にあるかを表すために用意した変数のことであり,次のプログラム中の find がそれである。
find = 0; for (i = 0; i < n; i++) { if (array[i] == val) { find = 1; break; } } if (find) { printf("%d", i); } else { printf("Not found"); }
for 文に入る前に find を 0 に初期化しておいて,目的の要素が見つければ break する前に find を 1 に変更する.for 文の後で find の値を見れば,目的の要素が見つかったかどうかが分かる.
フラグを用いずに,もっと簡単に済ますこともできる.それは, for 文が終わった後のパラメター i の値を見ることである. break で終わった時には,for 文の繰り返し条件 i < nがまだ満たされていることを用いると,次のように書ける.
for (i = 0; i < n; i++) {
if (array[i] == val) break;
}
if (i < n) {
printf("%d", i);
} else {
printf("Not found");
}