擬似言語のifで迷子になる人へ。擬似言語の条件分岐をスラスラ追う読み方
擬似言語のコードで、ifが出てくると急に読むスピードが落ちる。
elseifが2つ3つと連なると、今どの道を歩いているのかわからなくなる。
そんな経験、ありませんか。
条件分岐は、擬似言語の中でもっとも基本的な構文です。それなのに、いや、基本だからこそ、ここでの読み間違いはすべての問題に波及します。
でも安心してください。条件分岐の読み方には、迷子にならないための明確なルールがあります。
この記事では、if・elseif・elseの読み方を、分かれ道の地図として整理します。
条件分岐は、駅の改札のようなもの¶
if文の本質を、たとえで掴みます。
条件分岐は、駅の改札だと思ってください。
ICカードの残高が足りていれば通れる。足りなければ、はじかれて別の通路(チャージ機)へ。
プログラムのデータも同じです。条件を満たすデータは中の処理へ進み、満たさないデータは別ルートへ流れる。
擬似言語では、この改札をこう書きます。
if (点数 ≧ 60)
結果 ← "合格"
else
結果 ← "不合格"
endif
条件が成り立てばifの直後へ、成り立たなければelseの側へ。
どんなデータも、必ずどちらか片方だけを通ります。両方通ることも、どちらも通らないこともありません。
この、必ず一本道、という感覚が、迷子にならないための第一歩です。
elseifの鉄則:上から順に、最初に当たった扉だけ¶
問題は、分かれ道が3つ以上になったときです。
if (点数 ≧ 80)
評価 ← "A"
elseif (点数 ≧ 60)
評価 ← "B"
elseif (点数 ≧ 40)
評価 ← "C"
else
評価 ← "D"
endif
ここで質問です。点数が90のとき、評価はどうなるでしょう。
90は、80以上でもあり、60以上でもあり、40以上でもあります。じゃあ評価はAでもBでもCでもある…?
いいえ。答えはAだけです。
elseifの鉄則は、上から順に判定して、最初に成り立った扉だけを通ること。
一度どこかの扉を通ったら、残りの条件は見向きもされずに、endifまで一気に飛びます。
| 点数 | 通る扉 | 評価 |
|---|---|---|
| 90 | 最初のif(≧80) | A |
| 75 | 2番目(≧60) | B |
| 50 | 3番目(≧40) | C |
| 30 | else | D |
この、最初に当たった扉だけ、を忘れると、複数の条件に当てはまる値で必ず混乱します。
elseifを見たら、上から順、一発勝負、と唱えてください。
ネストしたifは、インデントを定規にする¶
条件分岐が難しくなるもうひとつのパターンが、ifの中にifがある、入れ子(ネスト)構造です。
if (会員である)
if (誕生月である)
割引率 ← 20
else
割引率 ← 10
endif
else
割引率 ← 0
endif
外側の分かれ道の先に、さらに分かれ道がある構造です。
ここで頼りになるのが、行頭の字下げ、インデントです。
同じ深さのif、else、endifは、必ず同じ縦のラインに並んでいます。elseを見たら、同じ深さのifまで縦にさかのぼる。この動きで、どのifに対するelseなのかを見失わなくなります。
読みにくいと感じたら、対応するifとendifを線で結んでしまうのも有効です。CBT方式ではメモ用紙が使えるので、構造だけ書き出す作戦も使えます。
私がバグ調査で学んだ、条件分岐との付き合い方¶
エンジニア歴10年の私にとって、条件分岐は今でも、いちばんバグが出る場所です。
意外に思いますか。ループや難しいアルゴリズムではなく、素朴なif文がバグの温床なのです。
代表例が、境界値の扱いです。
60点以上で合格、という仕様を、うっかり「>60」と書いてしまう。すると、ちょうど60点の人だけが不合格になる。この手のバグを、私は何度も見てきましたし、自分でも書いたことがあります。
だから現場では、条件式を見たらちょうど境界の値を代入して確かめるのが鉄則です。
60 ≧ 60 → 成立、合格。59 ≧ 60 → 不成立、不合格。この2行の確認で、以上と超えるの取り違えは根絶できます。
科目Bの選択肢も、まさにこの、≧と>の違い、を突いてきます。試験対策と実務の鉄則が、ここでも一致しているのです。
読み方の総仕上げは、値を入れて通り道をなぞること¶
条件分岐の読解力を仕上げる練習は、ひとつだけです。
具体的な値をひとつ決めて、その値がどの道を通るかを指でなぞる。
90点ならこの道。60点ぴったりならこの道。値を変えるたびに、通り道が変わる様子を確認します。
特に、境界ぴったりの値と、elseに落ちる値。この2種類は必ず試してください。出題者が狙うのは、いつもこの2か所です。
そして、なぞった結果が正しいかは、実際に動かせば一発でわかります。
擬似言語学習サイトのGiji Academyでは、擬似言語の条件分岐をブラウザ上で動かして、値ごとの結果を確認できます。自分のなぞりと実行結果が一致する快感を、ぜひ体験してください。
なぞる作業を表で記録する方法、つまりトレースの基本はこちらで解説しています。
【関連記事】擬似言語の勉強方法とは?IT初心者でも無理なく身につく学習ステップを解説
条件分岐でよくあるミスを先回りで潰す¶
最後に、受験者がやりがちなミスをまとめて予防しておきます。
| ミス | 何が起きるか | 予防策 |
|---|---|---|
| ≧と>の取り違え | 境界値の答えがずれる | 境界ぴったりの値で確認 |
| elseifで複数の扉を通したつもりになる | 評価が重複する誤読 | 上から順、一発勝負と唱える |
| elseの相方を見誤る | ネストの構造が崩れる | インデントを縦にさかのぼる |
| elseがない場合の見落とし | 条件不成立時に何も起きないことを忘れる | 不成立ルートも必ずなぞる |
4つ目は盲点になりやすいので補足します。
elseのないif文では、条件が成り立たなかったとき、何もせずに素通りします。変数は変化しません。
この、何も起きない、という結果も、立派な処理結果です。トレース表には、変化なし、と書く癖をつけましょう。
こうした細かい読み落としが積み重なると、本番で、わかっていたのに落とした、が起きます。落ちる人の共通パターンも知っておくと予防が効きます。
【関連記事】基本情報技術者試験の科目Bに落ちる人の特徴とは?擬似言語でつまずく原因と対策
まとめ:条件分岐は、値を決めて道をなぞれば迷わない¶
条件分岐は、データが通る改札です。
elseifの連なりは、上から順に判定して、最初に成り立った扉だけを通る一発勝負。ネストはインデントを定規にして、elseの相方を縦にさかのぼって探す。
そして、読解の仕上げは、具体的な値を入れて通り道をなぞること。境界ぴったりの値と、elseに落ちる値は必修です。
≧と>の違いに敏感になった人から、条件分岐のひっかけは効かなくなります。
擬似言語学習サイトのGiji Academyで、いろいろな値を流して、分かれ道の感覚を体に入れてしまいましょう。
迷路が地図に変わる瞬間は、すぐそこです。