基本情報技術者(FE)対策
境界の罠
1つずれた選択肢は必ず並んでいる
科目Bの空欄補充では、選択肢がこういう並びになっていることがよくあります。
ア i を 1 から dataの要素数 まで
イ i を 1 から dataの要素数 - 1 まで
ウ i を 2 から dataの要素数 まで
エ i を 2 から dataの要素数 - 1 まで4つとも似ていて、違いは開始値と終了値が1つずれているかどうかだけです。こういう問題を、コードを眺めて雰囲気で選ぶと当たりません。境界の値を実際に入れて、はみ出すかどうかを確かめるのが唯一確実な方法です。この1つずれる誤りを、英語では off-by-one と呼びます。
確かめる手順
手順は3つです。
- ループの中で、添字がいちばん小さくなる式といちばん大きくなる式を探す
- 開始値を入れて、小さいほうの式が 1 以上になるか確かめる
- 終了値を入れて、大きいほうの式が 要素数 以下になるか確かめる
たとえば、中身が data[i] ← data[i + 1] なら、大きいほうの式は i + 1 です。終了値に要素数を入れると 要素数 + 1 になってはみ出します。だから終了値は 要素数 - 1 が正解になります。
中身が data[i] + data[i - 1] なら、小さいほうの式は i - 1 です。開始値に 1 を入れると 0 になってはみ出します。だから開始値は 2 が正解です。
前回までに出てきた2つの形は、どちらもこの手順で説明が付きます。覚えるのは手順だけで、個々のパターンを暗記する必要はありません。
要素数と最後の添字は同じ数
0 から始まる言語に慣れていると、「最後の添字は要素数 - 1」という感覚が残っています。擬似言語ではこれが間違いです。1から始まるので、最後の添字は要素数と同じ数です。
要素数5の配列なら、最後は data[5] です。data[4] は最後から2番目です。ここを取り違えると、末尾の要素だけを1つ取りこぼす答えになります。取りこぼしは合計の値が少しだけ小さくなる形で現れるので、答えを出したあとに検算すると気づけます。
回数の数え方
境界はループの回数にも効きます。i を a から b まで 1 ずつ増やす が回る回数は b - a + 1 です。1 から 5 までなら 5 回、2 から 5 までなら 4 回です。引き算だけで 3 と答えてしまうのがよくある誤りで、最後の + 1 を忘れないでください。
不安なときは、小さい数で数え上げます。1 から 3 までなら、1、2、3 の3回です。式が合っているかを確かめるのに、大きな数で試す必要はありません。
終了条件の等号
while で書かれている場合は、条件の等号が境界になります。i ≦ dataの要素数 なら末尾まで見ますが、i < dataの要素数 なら末尾の1つ手前で止まります。等号があるかないかで処理する要素が1つ変わるので、指で押さえて確認する癖をつけてください。