基本情報技術者試験対策(42)「擬似言語(03)」

スポンサーリンク
IT系

前回はif文とelse節による条件分岐を扱った。今回は、複数の条件を順番に判定していく elseif を扱う。ネストしたif文をすっきり書き換えられる構文であり、試験問題でも登場する重要な構文である。。

elseifが必要になる場面

前回、「正の偶数・正の奇数・0以下の数」を判定する処理をif文のネストで書いた。

if (n が 0 より大きい)
 if ((n mod 2) が 0 と等しい)
  kekka を "正の偶数" とする
 else
  kekka を "正の奇数" とする
 endif
else
 kekka を "0以下の数" とする
endif

このように「3パターン以上に分岐する」処理を素直なif〜elseだけで書こうとすると、ネストが深くなり読みにくくなる。こうしたケースで使うのが elseif である。

elseifの基本構文

if (条件式1)
 処理1
elseif (条件式2)
 処理2
elseif (条件式3)
 処理3
else
 処理4
endif

上から順番に条件式が評価され、最初に真になった条件式に対応する処理だけが実行される。一つでも真になった時点で、それ以降の条件式は一切評価されない。すべての条件式が偽だった場合にのみ、else の処理が実行される。

具体例:点数による評価判定

得点に応じて評価を返す処理を考える。

○文字列型: hyouka(整数型: ten)
 文字列型: kekka
 if (ten が 90 以上)
  kekka を "A" とする
 elseif (ten が 70 以上)
  kekka を "B" とする
 elseif (ten が 50 以上)
  kekka を "C" とする
 else
  kekka を "D" とする
 endif
 return kekka

ここで注意すべき点は、elseif (ten が 70 以上) は「70以上90未満」を意味しているわけではなく、その前の条件(90以上)が偽だった場合に限って評価されるという点である。つまり、この行に到達している時点で、すでに ten が 90 以上ではない ことが確定している。したがって、elseif (ten が 70 以上) が真になった時点で、自動的に「70以上90未満」の範囲であることが保証される。

トレースで挙動を確認する

hyouka(75) を実行した場合の流れを追ってみる。

ten = 75
if (ten が 90 以上) → 75 は 90 以上ではないので偽
elseif (ten が 70 以上) → 75 は 70 以上なので真 → ここで確定
kekka を "B" とする
(以降のelseif、elseは評価されない)
return "B"

このように、一度真になった条件が見つかった時点で残りの分岐が無視されるという点は、試験のひっかけ問題として非常によく狙われる。「複数の条件に該当しそうに見えるが、実際に実行されるのは最初に真になった1つだけ」ということを常に意識する必要がある。

if文の単純な並びとの違い

elseifを使わず、独立したif文を複数並べた場合との違いを比較してみる。

/* 独立したif文を並べた場合との違い */
if (ten が 90 以上)
 kekka を "A" とする
endif
if (ten が 70 以上)
 kekka を "B" とする
endif
if (ten が 50 以上)
 kekka を "C" とする
endif

この書き方では、例えば ten が 95 の場合、最初のif文で kekka を "A" とした後も、2番目・3番目のif文の条件(70以上、50以上)もそれぞれ真になってしまうため、最終的に kekka は上書きされ続けて "C" になってしまう。これは意図した動作(Aと判定したい)とは異なる結果である。

elseif を使う場合と、独立したif文を並べる場合とでは、このように結果が変わってしまうことがある。この違いを理解しているかどうかが、試験問題でよく問われるポイントである。

学習のポイント

  1. elseifは上から順に評価され、真になった時点で以降は評価されないことを理解する
  2. ある elseif に到達した時点で、それより前の条件がすべて偽だったことが確定していると考える
  3. elseifの並びと、独立したif文の並びは動作が異なる場合があることに注意する
  4. 境界値(等号を含むかどうか、90以上か90より大きいかなど)を1つずつ丁寧に確認する

まとめ

elseifは、複数の条件を順番に判定し、最初に真になった処理だけを実行するための構文である。ネストしたif文をすっきり書き換えられる一方で、「上から順に評価される」という性質を理解していないと誤った判断をしてしまいやすい。次回は、繰り返し処理の基本である while文 を扱う。

コメント

タイトルとURLをコピーしました