擬似言語の選択処理 if / elseif / else|最初に真になったものだけ【基本情報技術者試験 科目B】

基本情報技術者試験

現行FE シラバス Ver9.2 準拠擬似言語の記述形式は2022年から変更なし最終更新 2026-08-14

条件によって処理を分けるのが if です。書き方そのものは難しくありません。間違いが起きるのは「どれが実行されるか」の判断です。条件が2つ当てはまったらどうなるのか ── そこだけ正確にしておけば、この形式で失点することはなくなります。

正典が定めていること

記述形式の中で、説明がいちばん長いのがこの選択処理です。長い理由は読めば分かります。

出典:擬似言語の記述形式(基本情報技術者試験用)

if (条件式1)
  処理1
elseif (条件式2)
  処理2
elseif (条件式n)
  処理n
else
  処理n+1
endif
選択処理を示す。
条件式を上から評価し,最初に真になった条件式に対応する処理を実行する。以降の条件式は評価せず,対応する処理も実行しない。どの条件式も真にならないときは,処理n+1を実行する。
処理は,0 以上の文の集まりである。
elseif と処理の組みは,複数記述することがあり,省略することもある。
else と処理n+1の組みは一つだけ記述し,省略することもある。

ここに書かれていることを、1つずつ確認します。

①「上から評価し、最初に真になったものだけ」

この一文がすべてです。条件が2つ以上当てはまっても、実行されるのは1つだけです。

上から順に見ていく

整数型: n ← 10

if (n > 5)
  "A" を出力する
elseif (n > 8)
  "B" を出力する
else
  "C" を出力する
endif

n は 10 なので、n > 5n > 8どちらも真です。それでも出力されるのは “A” だけ

1つ目が真になった時点で 処理1 を実行し、endif の次まで一気に飛びます。2つ目の n > 8そもそも調べられません(原文の「以降の条件式は評価せず」)。

順番を変えると結果が変わる

もし n > 8 を先に書いていたら、出力は “B” になります。条件の書かれている順番そのものが、プログラムの意味の一部です。「条件が正しいか」だけでなく「その位置に書かれているか」を見てください。

整数型: n ← 10 のとき、次の選択処理は何を出力しますか。
if (n > 5) で “A” を出力、elseif (n > 8) で “B” を出力、else で “C” を出力します。

② elseif は複数でも0個でもよい/else は1つだけ

部品 いくつ書けるか 省略できるか
if (条件式) 1つ(必ず先頭) できない
elseif (条件式) いくつでも できる
else 1つだけ できる
endif 1つ(必ず最後) できない

だから、いちばん短い選択処理はこの形です。

if (条件式)
  処理
endif

else が無いので、条件が偽なら何もせずに endif の次へ進みます。「偽のときの処理が書いていない=エラー」ではありません。

「0以上の文の集まり」の意味

原文に「各処理は,0 以上の文の集まりである」とあります。中身が1行でも、5行でも、0行でもよいという意味です。if の中に if を書いて入れ子にすることもできます。

整数型: n ← 3 のとき、次は何を出力しますか。
if (n > 5) で “A” を出力し、endif で閉じます。その次の行で “B” を出力します(else はありません)。

③ 分かれ道は必ず endif で合流する

どの枝を通っても、最後は endif の次の行に集まります。長いプログラムで迷子になったら、endif を探して、そこから読み直すのが確実です。

ただし例外が1つあります。枝の中に return があるときです。

if (条件式)
  return x
endif

return は「呼び出した相手に値を返す」でした(G3)。返してしまえば、その関数の仕事は終わりです。次の実際の出題は、まさにその形をしています。

実際の出題ではこう出る

出典:令和6年度 基本情報技術者試験 科目B 公開問題 問1

次のプログラム中の に入れる正しい答えを,解答群の中から選べ。

関数maximum は,異なる三つの整数を引数で受け取り,そのうちの最大値を返す。

〔プログラム〕

○整数型: maximum(整数型: x, 整数型: y, 整数型: z)
  if (  )
    return x
  elseif (y > z)
    return y
  else
    return z
  endif

解答群

ア x > yイ x > y and x > zウ x > y and y > zエ x > zオ x > z and z > yカ z > y

答えだけ先に見る

正解は イ(x > y and x > z)。なぜ比較が2つ必要なのか、そして誤答がどう間違えるのかを、このあと見ていきます。

この問題を解くのに必要な and

解答群に and が出てきます。A and B は「A も B も両方とも真のときだけ真」── ここではこれだけ知っていれば足ります。演算子の全体と優先順位は G8 で扱います。

空欄が決まる仕組み

枝は3つあり、それぞれ xyz を返します。1つ目の枝は「x が最大のとき」に通るべき枝です。

x が最大であるとは、y より大きく、かつ z よりも大きいということ。片方だけでは足りません。

そして elseif (y > z) に来たということは、1つ目が偽だった=x は最大ではないと確定しています。最大は y か z のどちらかなので、あとはその2つを比べるだけで済むわけです。上の条件が偽だったという情報が、下の条件を短くしているのです。

この読み方が正しいか、動かして確かめます。正解()を入れた状態です。どの条件が評価され、どれが評価されないかを見てください。

トレースシミュレータ maximum(3, 9, 5) を追う

出典:令和6年度 科目B 公開問題 問1(正解を入れた状態)


ループ開始前

いま計算していること

まだ計算していません

変数の状態

トレース表(進めると1行ずつ積み上がります)

3つの枝を全部通してみる

引数を変えると、通る枝が変わります。評価されない条件があることに注目してください。

呼び出し if (x>y and x>z) elseif (y>z) 返る値
maximum(7, 2, 5) (7>2 かつ 7>5) 評価されない x = 7
maximum(3, 9, 5) 偽(3>9 が偽) (9>5) y = 9
maximum(3, 2, 5) 偽(3>5 が偽) 偽(2>5 が偽) z = 5

上のプログラムを、もう一度この形で見てください。

if (x > y and x > z)
  return x
elseif (y > z)
  return y

実行が elseif (y > z) の行に来たとき、確実に分かっていることはどれですか。

答え

正解は イ x > y and x > z

ウ x > y and y > z条件が厳しすぎますmaximum(7, 2, 5) では 7>2 は真ですが 2>5 が偽なので、全体が偽になって1つ目の枝に入れません。elseif (2>5) も偽なので else に落ち、5 を返してしまいます(正しくは 7)。x が最大かどうかに yz の大小は関係ありません。

誤答の選択肢は、「比較が足りない」(ア・エ・カ)と「条件が厳しすぎる」(ウ・オ)の2種類に分かれています。どちらの型で間違えたのかを確かめておくと、次に同じ形が出たときに気づけます。

つまずきポイントまとめ

まちがえ方 正しい理解
真になった条件を全部実行すると思う 最初の1つだけ。以降は評価すらしない
条件の順番を入れ替えても同じだと思う 順番が意味の一部。書かれた位置で結果が変わる
else が無いと不完全だと思う else省略できる。偽なら何もせず endif の次へ
elseif の条件を単独で考える 上の条件が偽だと確定した状態で読む
比較を1つで済ませる 3つの中の最大なら2回の比較が要る

次に読む

本記事で引用した出典:擬似言語の記述形式(基本情報技術者試験用)令和6年度 基本情報技術者試験 科目B 公開問題 問1(独立行政法人情報処理推進機構)。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。n ← 10 を使った例は当サイトのオリジナルです。

Copied title and URL