条件によって処理を分けるのが 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 > 5 も n > 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 以上の文の集まりである」とあります。中身が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つあり、それぞれ x、y、z を返します。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 が最大かどうかに y と z の大小は関係ありません。
誤答の選択肢は、「比較が足りない」(ア・エ・カ)と「条件が厳しすぎる」(ウ・オ)の2種類に分かれています。どちらの型で間違えたのかを確かめておくと、次に同じ形が出たときに気づけます。
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
| 真になった条件を全部実行すると思う | 最初の1つだけ。以降は評価すらしない |
| 条件の順番を入れ替えても同じだと思う | 順番が意味の一部。書かれた位置で結果が変わる |
else が無いと不完全だと思う |
else は省略できる。偽なら何もせず endif の次へ |
elseif の条件を単独で考える |
上の条件が偽だと確定した状態で読む |
| 比較を1つで済ませる | 3つの中の最大なら2回の比較が要る |
次に読む
本記事で引用した出典:擬似言語の記述形式(基本情報技術者試験用)/令和6年度 基本情報技術者試験 科目B 公開問題 問1(独立行政法人情報処理推進機構)。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。n ← 10 を使った例は当サイトのオリジナルです。

