<問題> 教科書 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); } */ }