STEP 2.1(探索/検索)
線形探索 (リニアサーチ)

<問題> 教科書 71ページ- 73ページ
(1) 1桁の整数の乱数を10個、配列sに格納
(2) 探索キー(1〜9)を入力する
(3) 配列を表示する
(4) 配列sに、探索キーと等しい要素があるかどうかを調べる(探索する/検索する)

あれば(そこで終了し)どこにあるかを出力する。ない場合は、ないと出力する。
(以下では、教科書にあわせて、英語のメッセージを出力する)


STEP2 を、以下の方針で書き直してみよう。



<実行例>
探索キーを入力してください(1-9) :6
s[0] = 2
s[1] = 9
s[2] = 4
s[3] = 2
s[4] = 1
s[5] = 1
s[6] = 6
s[7] = 6
s[8] = 9
s[9] = 1
6 is found in s[6]  (← a[7]以降は調べていない)

探索キーを入力してください(1-9) :5
s[0] = 2
s[1] = 4
s[2] = 8
s[3] = 3
s[4] = 4
s[5] = 3
s[6] = 7
s[7] = 7
s[8] = 9
s[9] = 3
The element 5 is not in s (← 最悪。N個(最後まで)調べて、ない)



解答例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 10 /* 要素数 */ /* C2	定数が、どんな情報を表現しているか */

int s[N]; /* 大域変数 よくわかるC p46 有効範囲はプログラム全体 */ /* C1	変数やデータ構造が、どんな情報を表現しているか */

/* よくわかるC p43 から  関数宣言 */
void generate_data (void); /* 乱数配列の生成 戻り値なし、引数なし*/
void print_data (void); /* 配列のプリント */
int linear_search (int); /* 引数はintのキー。 見つけた場合の添え字を戻す。(戻り値とかreturn値とかよぶ) */

int main(void) {
    int x; /* キー */ /C1 変数やデータ構造が、どんな情報を表現しているか */
    int i; /* 戻り値をキープする変数 */ /* C3	変数が、プログラムが表現している手続きの中で、どのような役割をしているか */

    generate_data(); /* 関数呼び出し、生成せよ。引数がなくても、()をお忘れなく */

    printf("探索キーを入力してください(1-9) :");
    scanf("%d", &x);

    print_data(); /* 配列を表示せよ */

    i = linear_search(x); /* 検索せよ。戻り値をiに代入 */

    /* iの値をチェック */
    if(i == -1 ) /* 見つけていない。ループを終了して -1をリターンされているとき */
         printf("The element %d is not in s\n", x);
    else /* ループ 途中で発見。添え字をreturn した場合 */
         printf("%d is found in s[%d]\n", x,i);

/*  -1ではなく、添え字をリターンして、判別する作戦もある 
    if(i < N) // Nより前に見つけているのだから 
         printf("%d is found in s[%d]\n", x,i);
    else // 見つけていない
         printf("The element %d is not in s\n", x);

*/
    return 0;
}


void generate_data (void) {
    int i;

    srand((unsigned int)time(NULL));

    for (i = 0; i < N; i++)
        s[i]= rand()%9 + 1;
}


void print_data (void) {
    int i;

/* 配列要素を表示 配列処理 定番のforループをどうぞ */ 
    for (i = 0; i < N; i++)
        printf("s[%d] = %d \n", i, s[i]);
}


int linear_search (int x) {
    int i = 0;

/* この関数を作ってみよう return文をお忘れなく */

    while (i < N) {
        if (s[i] == x)
            return (i);
        i++;
    }

    return (-1);

/*  添え字を返す。main関数では戻り値がNより<かをチェック
    while (i < N) {
        if (s[i] == x)
            break;
        i++;
    }

    return (i);
}

*/
}