配列 練習問題1解答解説

練習問題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) の仕様
整数型配列 array の最初の n 個の要素,array[0] から array[n-1] までの中から指定された値 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");
    }

Valid HTML 4.01!