条件分岐と繰り返し:順序と境界でバグが生まれる
条件分岐(if)は「条件が成り立つときだけ実行する」しくみ、繰り返し(for・while)は「同じ処理を何度も実行する」しくみです。回数が決まっているなら for、条件が続くあいだ回すなら while。バグはたいてい判定の順序と境界(以上か、より大きいか)、そして終わらないループで起こります。
このページで学べること
- if・else if・else の使い分けがわかる
- for と while の違いがわかる
- 判定の順序で結果が変わる理由がわかる
- 無限ループの原因を説明できる
前提知識
if と for の基本の形
- if(条件分岐):もし〜なら A、そうでなければ B。段階が増えるときは else if を重ねる
- for(回数の繰り返し):5回・10回など回数が決まっているときに使う
- while(条件の繰り返し):残りが0になるまでなど終わりが条件で決まるときに使う
成績を「80点以上ならA、60点以上ならB、それ以外はC」と分ける場合、判定は厳しい条件から順に書きます。もし「60点以上ならB」を先に書くと、85点も先に条件を満たしてしまい、Aになるはずの人がBになるという重大なバグになります。
境界も要注意です。「60点以上」なら60点は含む(≧)。「60点より上」なら60点は含みません(>)。1点の差でも合否が変わるため、日本語をそのまま記号に置きかえないことが大切です。
繰り返しでは、終わる条件を必ず用意します。while で数を増やす処理を書き忘れると、条件がいつまでも成り立ち無限ループになります。
if(厳しい条件)→ else if(次の条件)→ else(残り全部)図でイメージする(多段の判定)
例題(くわしい手順)
1から10までの整数の合計を、繰り返しで求める流れを追います。
- 準備:合計を入れる変数 total = 0、数を数える i = 1。
- くり返す:i が10以下のあいだ「total = total + i」と「i = i + 1」を実行する。
- 終わる:i が11になった時点で条件(10以下)が成り立たず終了。total は 55。
もし手順2で「i = i + 1」を書き忘れると、i はずっと1のままで条件が成り立ち続け、無限ループになります。ループでは「終わりに近づく処理」が入っているかを必ず確認します。
for と while の違い
| くらべること | for | while |
|---|---|---|
| 向いている場面 | 回数が決まっている | 終わりが条件で決まる |
| 例 | 5人分の点数を順に処理する | 残りが0になるまで引き続ける |
| 無限ループの危険 | 低い(回数で終わる) | 高い(条件が変わらないと終わらない) |
どちらでも書ける場面は多いですが、「回数が言えるなら for」と決めておくと読みやすくなります。
よくある間違い
「60点以上ならB」を先に書くと、85点の人も先にBと判定されてしまいます。厳しい条件(80点以上)から順に書きます。
「60点以上」は ≧(60点を含む)、「60点より上」は >(含まない)。ちょうど60点の人の扱いが変わるため、問題文の日本語を必ず確認します。
while の中で数を増やす処理を忘れると条件が成り立ち続け、無限ループになります。ループを書いたら「何が終わりに近づいているか」を指さして確認しましょう。
練習問題
まず自分で解いてから解説を開きましょう。
「80点以上ならA、60点以上ならB、それ以外はC」という判定で、70点の人はどれになりますか。
解答・解説を見る
答え:B
80点以上ではないので次の条件へ進み、60点以上を満たすのでBです。
i を1から5まで1ずつ増やしながら繰り返すと、処理は何回実行されますか。
解答・解説を見る
答え:5回
i=1,2,3,4,5 の5回です。1から5「まで」なので5も含みます。
total=0 から始めて、1から10までを順に足すと total はいくつになりますか。
解答・解説を見る
答え:55
1+2+…+10=55。(1+10)×10÷2=55 でも確かめられます。
「60点以上ならB」を先に、「80点以上ならA」を後に書いたプログラムで、85点の人はどう判定されますか。
解答・解説を見る
答え:B(バグ)
85点は先に「60点以上」を満たすためBになってしまいます。A の判定に届きません。条件は厳しい順に並べるのが正解です。
よくある質問
Q. 条件分岐(if)とは何ですか?
条件が成り立つかどうかで実行する処理を変えるしくみです。段階が増えるときは else if を重ね、どれにも当てはまらない場合を else で受けます。
Q. for と while の違いは何ですか?
for は回数が決まっている繰り返し、while は条件が成り立つあいだ続く繰り返しです。回数が言えるなら for を使うと読みやすく、無限ループも起きにくくなります。
Q. 無限ループはなぜ起きるのですか?
繰り返しの条件がいつまでも成り立つからです。while の中でカウンタを増やし忘れる、終了条件が一度も満たされない、などが典型的な原因です。
Q. 「80点以上ならA、60点以上ならB」の順番を逆にすると何が起きますか?
85点の人もB判定になります。範囲の広い条件を先に書くと、狭い条件に届く前に決まってしまうので、厳しい条件から順に書きます。
次に学ぶ内容
高等学校「情報I」および基本的なIT知識の範囲を参照し、オリジナルに作成(実在試験問題の転載はありません)。正確性は編集・監修フローで確認しています(仕様書 第11章)。