条件分岐と繰り返し:順序と境界でバグが生まれる
条件分岐(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(残り全部)「80点以上ならA、60点以上ならB」を、順番を逆にして書いたとします。85点の人を判定すると、最初の「60点以上か?」ですでに条件を満たしてしまうので、そこでBに決まって終わりです。
if の並びは上から順に調べ、最初に当てはまった枝で止まります。だから範囲の広い条件を先に書くと、あとの狭い条件にはいつまでもたどり着けません。エラーは出ず、静かにまちがった結果が出るのがやっかいなところです。狭い(厳しい)条件から順に書くと決めておけば、この事故は防げます。
図でイメージする(多段の判定)
例題(くわしい手順)
例題1:繰り返しで1から10までの合計を求める
1から10までの整数の合計を、繰り返しで求める流れを追います。
- 準備:合計を入れる変数 total = 0、数を数える i = 1。
- くり返す:i が10以下のあいだ「total = total + i」と「i = i + 1」を実行する。
- 終わる:i が11になった時点で条件(10以下)が成り立たず終了。total は 55。
- 確かめる:1 から 10 までの合計は (1 + 10) × 10 ÷ 2 = 55。たどった結果と一致します。
もし手順2で「i = i + 1」を書き忘れると、i はずっと1のままで条件が成り立ち続け、無限ループになります。ループでは「終わりに近づく処理」が入っているかを必ず確認します。
例題2:境界の書き方で結果が変わる
「60点以上なら合格」と「60点より上なら合格」で、ちょうど60点の人の結果はどうちがいますか。
- 記号に直す:「以上」は ≧(その値をふくむ)、「より上」は >(その値をふくまない)。
- 60点で判定する:60 ≧ 60 は成り立つので合格。60 > 60 は成り立たないので不合格。
- ちがいが出る場所を確かめる:差が出るのはちょうど境界の値のときだけです。59点や61点なら、どちらの書き方でも同じ結果になります。
- だから試し方も決まる:境界のバグを見つけるには、境界そのものの値(この場合60)で試すのがいちばん確実です。
「以上・以下・より大きい・未満」を記号に置きかえるとき、日本語をそのまま流し込まないこと。1点の差で合否が変わるので、境界の値で必ず試します。
for と while の違い
| くらべること | for | while |
|---|---|---|
| 向いている場面 | 回数が決まっている | 終わりが条件で決まる |
| 例 | 5人分の点数を順に処理する | 残りが0になるまで引き続ける |
| 無限ループの危険 | 低い(回数で終わる) | 高い(条件が変わらないと終わらない) |
どちらでも書ける場面は多いですが、「回数が言えるなら for」と決めておくと読みやすくなります。
よくある間違い
「60点以上ならB」を先に書くと、85点の人も先にBと判定されてしまいます。厳しい条件(80点以上)から順に書きます。
「60点以上」は ≧(60点を含む)、「60点より上」は >(含まない)。ちょうど60点の人の扱いが変わるため、問題文の日本語を必ず確認します。
while の中で数を増やす処理を忘れると条件が成り立ち続け、無限ループになります。ループを書いたら「何が終わりに近づいているか」を指さして確認しましょう。
練習問題
まず自分で解いてから解説を開きましょう。
「80点以上ならA、60点以上ならB、それ以外はC」という判定で、70点の人はどれになりますか。
解答・解説を見る
i を1から5まで1ずつ増やしながら繰り返すと、処理は何回実行されますか。
解答・解説を見る
total=0 から始めて、1から10までを順に足すと total はいくつになりますか。
解答・解説を見る
「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知識の範囲を参照し、オリジナルに作成(実在試験問題の転載はありません)。正確性は編集方針にそって確認しています。