第41問 さがす数は左から何番目?(線形探索)
配列 data(=[12,7,25,9,30,18])の中から sagasu(=25)と同じ数をさがし、それが左から何番目にあるかを表示しよう。basho は「まだ見つかっていない」というしるしとして0から始めます。配列の番号は data[0] から始まりますが、答えたいのは人が数える「左から何番目」(1から数える)であることに気をつけよう(3か所の穴をうめよう)
難易度:★★★★☆(4/やや難しい)。共通テスト「情報I」で使われるDNCL(共通テスト用プログラム表記)の穴埋め問題です。JavaScriptを有効にすると、このページでプログラムを組み立てて実行しながら解けます。
プログラム
data = [12,7,25,9,30,18]
sagasu = 25
basho = 0
i を 0 から 5 まで 1 ずつ増やしながら繰り返す:
もし data[i] [A] sagasu ならば:
basho = [B]
もし basho [C] 0 ならば:
表示する("見つかりませんでした")
そうでなければ:
表示する("左から" + basho + "番目にあります")
空欄 [A]・[B]・[C] に当てはまるものを、次の選択肢から選びます。
選択肢
==
!=
>=
>
i
i + 1
data[i]
ヒント
配列の番号 i は0から始まるので、「左から何番目」にするには i + 1 とします。0は「まだ見つかっていない」しるしなので、最後は basho == 0 かどうかで見つかったかを判定しよう
解答
- 空欄 [A] …
==
- 空欄 [B] …
i + 1
- 空欄 [C] …
==
よくある間違い
- [A]
== [B]i [C]== … i は配列の番号なので、25 が見つかるのは i が2のときです。でも人が数える「左から何番目」は3番目。番号に1をたして i + 1 にします。さらに i のままだと、data[0] で見つかったときに basho が0のままになり、「見つからなかった」と区別できなくなります
- [A]
== [B]data[i] [C]== … data[i] は見つかった「値」そのもの(25)です。basho に25が入ってしまい、「25番目」と表示されます。ほしいのは値ではなく場所なので i + 1 です
- [A]
!= [B]i + 1 [C]== … != は「ちがうとき」です。これだと sagasu とちがう数のたびに basho が書きかわり、最後に見た18の位置(6番目)が残ってしまいます。同じ数かどうかを調べるのは == です
- [A]
>= [B]i + 1 [C]== … >= だと25以上の数(25と30)が両方あてはまり、あとから来た30の位置(5番目)で上書きされます。ちょうど同じ数だけを見つけたいので == を使います
- [A]
> [B]i + 1 [C]== … > だと「25より大きい数」をさがすことになり、さがしている25そのものが当てはまりません。25と等しいかを調べる == にしましょう
- [A]
== [B]i + 1 [C]!= … basho != 0 は「見つかった」ときに成り立ちます。でも最初の枝は「見つかりませんでした」を表示する側なので、表示が逆になります。0のままかどうかを調べる == を使います
- [A]
== [B]i + 1 [C]> … basho > 0 も「見つかった」という意味なので、こちらも「見つかりませんでした」と「左から○番目」が逆に出てしまいます。0のままかどうかは == 0 で調べます
- [A]
== [B]i [C]!= … 2か所ちがいます。basho には「何番目」を入れたいので i + 1、最後の判定は0のままかどうかを見る == です
ほかの問題