科目Bの条件分岐問題の解き方|どの枝を通るかを表で追う
if と elseif が何段も続くと、どの枝を通ったのか分からなくなる。
科目Bの問題で、条件を上から順に読んでいるうちに、途中で頭が真っ白になったことはありませんか?
1つの if なら迷わないのに、elseif が3つ、4つと並ぶと急に自信がなくなる。そんな経験をした人は多いのではないでしょうか。
大丈夫です。条件分岐の問題で必要なのは、入力ごとに通る枝を1つだけ選び、それを表に書き残すことです。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務で出会う不具合のかなりの部分は、条件分岐の境目で起きています。
たとえば、会員ランクの判定で以上と超えるを取り違えただけで、本来とは違う割引が適用されてしまう。そんな小さなずれを探すとき、私は入力値ごとにどの枝を通るかを表に書き出して確かめています。
この記事では、条件分岐の問題を、科目Bの解き方に合わせて5つの段階で紹介します。科目B全体の中で、こうした問題がどこに位置するのかを先に知っておきたい人は、親記事から読むと流れがつかみやすくなります。
【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説
条件分岐の問題は何を聞いているのか¶
最初に、問題文が何を求めているのかを整理しておきましょう。条件分岐が中心になる問題は、聞かれ方によっていくつかの型に分かれます。
よく見かける型を表にまとめました。
| 問われ方 | 具体的な聞かれ方 | 主に見る場所 |
|---|---|---|
| 結果を答える | ある値を入力したとき、返る値や出力はどれか | 入力値が通る枝 |
| 空欄を埋める | 目的どおりに分類されるように、空欄に入る条件式はどれか | 条件の並び順と境界 |
| 誤りを見つける | ある入力で正しく動かない原因はどこか | 条件が重なっている部分 |
| 実行回数を答える | ある行が何回実行されるか | ループの中の if |
どの型でも、根っこにある問いは同じです。この入力は、どの枝を通るのか。
問題文を読んだら、まずどの型なのかを決めましょう。型が決まれば、コードのどこに目を向ければよいかも自然に決まります。
条件分岐は仕様を読む問題でもある¶
科目Bの条件分岐の問題には、たいてい問題文の中に仕様の説明があります。何点以上ならA、何歳未満なら子ども料金、といった決まりごとです。
コードだけを読んで答えを出そうとすると、条件の意図を見落としやすくなります。仕様の文章とコードの条件式を1つずつ対応させながら読むのが、遠回りに見えていちばん確実な方法です。
if や elseif の書き方そのものをもう一度確かめたい場合は、こちらの記事で整理しておくと安心です。
【関連記事】擬似言語のifで迷子になる人へ。擬似言語の条件分岐をスラスラ追う読み方
まず目を付ける場所¶
問われ方が分かったら、次はコードのどこから読むかを決めます。条件分岐の問題では、目を付ける場所が3つあります。
ひとつ目は条件の並び順、ふたつ目は境界の値、みっつ目は else が受け止める範囲です。この順番で見ていくと、分岐の全体像がはっきりします。
条件は上から順に調べ、最初に当てはまった枝で終わる¶
if と elseif が並んでいるとき、条件は必ず上から順に調べられます。そして、最初に当てはまった枝だけが実行され、残りの条件は調べられません。
ここが、条件分岐の問題でいちばん大事なポイントです。下の elseif の条件にも当てはまる値であっても、上で先に当てはまれば、下の枝には進みません。
つまり、elseif の条件には、それより上の条件がすべて偽だったという前提が隠れています。この隠れた前提を意識できるかどうかで、読みやすさが大きく変わります。
境界の値に印を付ける¶
次に見るのは、条件式に出てくる境界の値です。以上を表す ≥ なのか、より大きいを表す > なのかで、境界ちょうどの値がどちらの枝に入るかが変わります。
条件式を読んだら、境界の数字に丸を付け、その数字ちょうどの場合はどちらに入るのかをメモしておきましょう。選択肢は、まさにこの境目を狙って作られることが多いからです。
最後に else を確かめます。else は、それより上のどの条件にも当てはまらなかった値をすべて受け止める枝です。
例題:点数から評価を決める¶
ここからは、実際の例題で追い方を確かめます。この記事の例題は説明のために作成したもので、IPA の公開問題そのものではありません。
次の関数は、点数を受け取って評価の文字を返します。80点以上なら A、60点以上なら B、40点以上なら C、それ未満なら D という仕様です。
○文字列型: judge(整数型: score)
文字列型: result
if (score ≥ 80)
result ← "A"
elseif (score ≥ 60)
result ← "B"
elseif (score ≥ 40)
result ← "C"
else
result ← "D"
endif
return result
2つ目の条件は score ≥ 60 としか書かれていません。それなのに、なぜ 85点が B にならないのでしょうか?
答えは、上から順に調べるという決まりにあります。85点は1つ目の条件 score ≥ 80 で先に当てはまるので、2つ目の条件は調べられないのです。
隠れた前提を書き足して読む¶
elseif の行を読むときは、隠れた前提を頭の中で書き足してみましょう。2つ目の枝は、実際には score が 80 未満で、かつ 60 以上の場合を表しています。
同じように、3つ目の枝は 60 未満で 40 以上、else は 40 未満です。こうして範囲に言い換えると、各枝が受け持つ点数の帯がはっきり見えてきます。
この言い換えは、and を使った複合条件の読み方とつながっています。and や or が入った条件式で迷う場合は、こちらの記事も参考にしてください。
【関連記事】擬似言語の論理演算(and・or・not)の読み方|複合条件で迷わないコツを解説
トレース表で通る枝を追う¶
頭の中だけで条件を追うと、どの条件まで調べたのかを見失いがちです。そこで、入力値1つにつき1行を使うトレース表を書きます。
ポイントは、条件ごとに真か偽かを書く列を用意し、真になった時点でその右側の列は空けておくことです。調べられなかった条件を空欄にしておくと、上から順に調べる動きが目で見えるようになります。
judge 関数に6つの点数を入れて、通る枝を表にしました。
| score | score ≥ 80 | score ≥ 60 | score ≥ 40 | 通る枝 | 戻り値 |
|---|---|---|---|---|---|
| 85 | 真 | ― | ― | 1つ目の if | A |
| 80 | 真 | ― | ― | 1つ目の if | A |
| 79 | 偽 | 真 | ― | 1つ目の elseif | B |
| 60 | 偽 | 真 | ― | 1つ目の elseif | B |
| 40 | 偽 | 偽 | 真 | 2つ目の elseif | C |
| 39 | 偽 | 偽 | 偽 | else | D |
80 と 79、60 と 59、40 と 39 のように、境界ちょうどの値とその1つ手前を並べるのがコツです。ここで結果が仕様と一致していれば、条件の向きと並び順は正しいと判断できます。
表の書き方そのものに慣れていない場合は、こちらの記事で基本の形を確かめてから例題に戻ってみてください。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
条件が重なる例:うるう年の判定¶
もう少し手ごわい例も見ておきましょう。うるう年の判定は、条件の並び順がそのまま答えを左右する代表的な題材です。
うるう年の決まりは、4で割り切れる年はうるう年、ただし100で割り切れる年はうるう年ではない、さらに400で割り切れる年はうるう年、というものです。これを擬似言語にすると、次のように書けます。
○論理型: isLeapYear(整数型: year)
if (year mod 400 が 0 と等しい)
return true
elseif (year mod 100 が 0 と等しい)
return false
elseif (year mod 4 が 0 と等しい)
return true
else
return false
endif
ここでは、例外の強い順、つまり400、100、4の順に条件を並べています。この順番だからこそ、1つの枝に当てはまった時点で正しい答えが確定します。
4つの年で、通る枝を確かめてみましょう。
| year | mod 400 = 0 | mod 100 = 0 | mod 4 = 0 | 戻り値 |
|---|---|---|---|---|
| 2000 | 真 | ― | ― | true |
| 1900 | 偽 | 真 | ― | false |
| 2024 | 偽 | 偽 | 真 | true |
| 2023 | 偽 | 偽 | 偽 | false |
1900 は 4 でも 100 でも割り切れますが、先に 100 の条件で false が返ります。条件が重なる値ほど、どの条件で先に止まるかを丁寧に確かめる必要があります。
間違いやすい選択肢の見分け方¶
条件分岐の問題では、読み方の小さな取り違えを狙った選択肢が並びます。どんな誤りが用意されやすいのかを知っておけば、選択肢を見た瞬間に候補を絞れます。
よくある誤りを表にまとめました。
| 誤りの種類 | 起きること | 見分け方 |
|---|---|---|
| 条件の順番を入れ替える | 広い条件が先に当たり、狭い条件の枝に届かない | 上の条件が下の条件を飲み込んでいないか確かめる |
| ≥ と > を取り違える | 境界ちょうどの値が隣の枝に入る | 境界の値とその1つ手前をトレースする |
| 当てはまった後も下の条件を調べる | 複数の枝が実行されたと考えてしまう | 真になった列より右は空欄にする |
| else の範囲を見落とす | 想定外の値の行き先が分からなくなる | 上の条件をすべて否定した範囲を書き出す |
| and と or を取り違える | 片方だけ満たす値の結果が逆になる | 片方だけ真になる値を1つ試す |
この中でも、特によく狙われるのが条件の順番と境界値です。順番に見ていきましょう。
条件の順番を入れ替えた選択肢¶
空欄補充の問題では、条件式そのものは正しいのに、並び順だけが違う選択肢がよく登場します。たとえば judge 関数で、score ≥ 40 を一番上に置いた場合を考えてみましょう。
if (score ≥ 40)
result ← "C"
elseif (score ≥ 60)
result ← "B"
elseif (score ≥ 80)
result ← "A"
else
result ← "D"
endif
このコードに 85点を入れると、1つ目の score ≥ 40 で先に当てはまり、C が返ってしまいます。2つ目と3つ目の枝には、どんな点数を入れても届きません。
範囲の広い条件が上にあると、下の狭い条件はすべて飲み込まれてしまいます。≥ で並べるなら大きい境界から、< で並べるなら小さい境界から、と覚えておくと判断が速くなります。
空欄に入る条件式を選ぶ問題の考え方は、こちらの記事でも詳しく扱っています。
【関連記事】基本情報技術者試験の科目Bの空欄補充問題の解き方を解説|擬似言語で見る判断ポイント
境界の1つ手前で確かめる¶
≥ と > の取り違えを見抜くには、境界ちょうどの値と、その1つ手前の値の2つを試すのがいちばんです。仕様が80点以上なのに、選択肢が score > 80 になっていれば、80点ちょうどで結果が変わります。
選択肢を2つまで絞れたのに決めきれないときは、この2つの値を両方のコードに入れてみてください。結果が分かれたところが、正解と不正解の境目です。
ループの中の if は回数に注意¶
条件分岐がループの中にある問題では、何回目の繰り返しでどの枝を通ったかを数える力も問われます。この場合は、トレース表に繰り返しの回数の列を1つ足しておくと整理しやすくなります。
ループと組み合わさった問題でつまずいている場合は、こちらの記事で繰り返しの追い方を確かめておくと安心です。
【関連記事】科目Bの繰返し問題が解けない人へ|ループ回数を追うコツ
Giji Academy のシミュレーターで動かす¶
紙のトレース表で通る枝をつかんだら、最後は実際に動かして確かめましょう。条件分岐は、入力を1つ変えるだけで通る道が変わるので、動かして見る効果がとても大きい分野です。
Giji Academy の擬似言語シミュレーターでは、擬似言語のコードを1行ずつ実行し、どの行が実行されたかと、変数の値が変わる様子を目で確かめられます。自分で書いたトレース表と見比べながら進めると、どの条件で予想とずれたのかがすぐに分かります。
試すときは、この記事の judge 関数を少しずつ変えてみるのがおすすめです。境界の 80 を 70 に変えたり、≥ を > に書き換えたり、条件の順番を入れ替えたりして、結果がどう変わるかを予想してから動かしてみてください。
予想と結果が一致すれば、その読み方は身についています。ずれた場合は、どの条件の真偽を読み違えたのかを探すことが、いちばんの練習になります。
まずはGiji Academy の擬似言語シミュレーターで講座を選び、入力を変えたときに通る枝が切り替わる様子を確かめてみてください。
まとめ¶
科目Bの条件分岐の問題は、難しい仕組みを問うものではありません。条件を上から順に調べ、最初に当てはまった枝で止まる、という決まりを守って表に書けば必ず解けます。
この記事でお伝えした5つの段階を振り返っておきましょう。
| 段階 | やること |
|---|---|
| 1 設問を読む | 結果・空欄・誤り・実行回数のどれが問われているかを決め、仕様と条件式を対応させる |
| 2 目を付ける | 条件の並び順、境界の値、else が受け止める範囲を順に見る |
| 3 トレースする | 入力1つを1行にして、条件ごとの真偽と通る枝を書く |
| 4 選択肢を見分ける | 順番の入れ替え、≥ と > の違い、and と or の違いを確かめる |
| 5 動かす | 境界や順番を変えたコードをシミュレーターで動かす |
最初は、この記事の judge 関数のように、枝が4つほどの短いコードで十分です。境界ちょうどの値と1つ手前の値を必ずセットで試す練習を続けるうちに、枝がいくつ並んでいても落ち着いて追えるようになります。
条件の境目を丁寧に確かめる習慣は、科目Bだけでなく、実務で不具合を防ぐときにもそのまま役立つ力です。次に elseif がずらりと並んだ問題に出会ったら、まずは境界の数字に丸を付けるところから始めてみてください。