基本情報 科目B 擬似言語トレースの練習
基本情報技術者試験の科目Bでよくあるのが、「記法(← や endif の意味)は分かるのに、いざ問題を解くと答えが出せない」というつまずきです。原因はほとんどの場合、コードを頭の中だけで追おうとして変数の値を見失う ことにあります。これを防ぐ唯一の確実な方法が トレース(変数の値の変化を表に書き出して1行ずつ追うこと) です。本記事は、合計・最大値・線形探索という科目Bの最頻出アルゴリズムを題材に、トレースを実際にやってみる練習帳です。
本記事は 過去問AI が学習用に作成したオリジナルの例題です。掲載している擬似言語は IPA の過去問・公式サンプルの転載ではなく、説明用に書き起こしたものです。擬似言語の正式な記述形式は必ず IPA 公式ページ で確認してください。記法そのものの読み方は 基本情報 科目Bの擬似言語 記法早見表 にまとめています。
トレースとは「変数の値の変化を表で書く」こと
トレースは難しい技術ではありません。プログラムに出てくる変数を表の列にして、処理が1行進むたびにその時点の値を書く だけです。頭の中で覚えようとするから崩れるのであって、紙に書けば誰でも追えます。本記事では次の前提で例題を進めます(科目Bの標準的な約束ごとです)。
- 代入は ←(右の値を左の変数に入れる)。条件式の中の = は「等しいか?」の比較
- 配列の 要素番号は 1 から始まる。A[1] が先頭、A[要素数] が末尾
- 繰返しは for(回数指定)と while(前判定)を使う。endfor / endwhile / endif が範囲の終わり
記法そのものが不安なら、先に 記法早見表 で ← や endif を確認してから戻ってくると、ここから先がスムーズです。
例1:配列の合計を求める
配列 A = {3, 1, 4, 1, 5}(要素数 5)の合計を求めるコードです。
整数型: 合計 ← 0
整数型: i
for (i を 1 から 5 まで 1 ずつ増やす)
合計 ← 合計 + A[i]
endfor
「合計」を 0 から始め、A[1] から A[5] まで順に足していきます。トレース表は、ループが 1 周するごとに i と そのときの A[i]、足したあとの 合計 を書きます。
| ループ回 | i | A[i] | 合計(処理後) |
|---|---|---|---|
| 開始前 | − | − | 0 |
| 1周目 | 1 | 3 | 0 + 3 = 3 |
| 2周目 | 2 | 1 | 3 + 1 = 4 |
| 3周目 | 3 | 4 | 4 + 4 = 8 |
| 4周目 | 4 | 1 | 8 + 1 = 9 |
| 5周目 | 5 | 5 | 9 + 5 = 14 |
i が 5 を超えた時点でループが終わり、答えは 合計 = 14 です。ポイントは「合計 ← 合計 + A[i]」を 今の合計に足して入れ直す と読むこと。← を = と読むと「合計と A[i] が等しい」という意味不明な式に見えてしまいます。
例2:最大値を求める
同じ配列 A = {3, 1, 4, 1, 5} から最大値を探します。
整数型: 最大 ← A[1]
整数型: i
for (i を 2 から 5 まで 1 ずつ増やす)
if (A[i] > 最大)
最大 ← A[i]
endif
endfor
最初に「最大」を A[1] で仮置きし、2 番目以降を順に比べて、大きければ入れ替えます。i が 2 から始まる こと(1 番目は仮置き済みなので比べ直さない)に注目してください。
| ループ回 | i | A[i] | A[i] > 最大? | 最大(処理後) |
|---|---|---|---|---|
| 開始前 | − | A[1]=3 | − | 3 |
| 1周目 | 2 | 1 | 1 > 3 → 偽 | 3 |
| 2周目 | 3 | 4 | 4 > 3 → 真 | 4 |
| 3周目 | 4 | 1 | 1 > 4 → 偽 | 4 |
| 4周目 | 5 | 5 | 5 > 4 → 真 | 5 |
答えは 最大 = 5。if の条件が偽のときは「最大」を更新せず、そのまま次へ進む——この「何もしない」場合も表の行を必ず書くのが、追い損ねないコツです。
例3:線形探索(指定した値が何番目にあるか)
配列を先頭から順に調べ、探したい値 key と一致する位置を返します。ここでは key = 4 を探します。見つかったら早めにループを抜けるよう、継続条件に工夫を入れています。
整数型: i ← 1
整数型: 位置 ← -1
while ((i ≦ 5) and (位置 = -1))
if (A[i] = key)
位置 ← i
endif
i ← i + 1
endwhile
「位置」を最初は -1(まだ見つかっていない印)にしておき、一致したらそこに番号を入れます。継続条件 (i ≦ 5) and (位置 = -1) は「末尾まで来ておらず、かつ まだ見つかっていない間だけ続ける」という意味です。
| ループ回 | i | A[i] | A[i] = 4? | 位置(処理後) | i(処理後) |
|---|---|---|---|---|---|
| 開始前 | 1 | − | − | -1 | 1 |
| 1周目 | 1 | 3 | 偽 | -1 | 2 |
| 2周目 | 2 | 1 | 偽 | -1 | 3 |
| 3周目 | 3 | 4 | 真 | 3 | 4 |
| 判定 | 4 | − | − | 位置=3 なので継続条件が偽 → 終了 | − |
答えは 位置 = 3(4 は配列の 3 番目)。もし key が配列に無ければ、位置 は最後まで -1 のまま終わり、「見つからなかった」と分かります。配列が 1 始まりなので、返ってくる番号も 1 始まりである点に注意してください。なお、配列が ソート済み(並べ替え済み) のときは、先頭から順に見る線形探索より圧倒的に速い二分探索が使えます。lo・hi・mid の 3 変数を表で追う実演は 二分探索のトレース練習 にまとめました。
トレースで詰まらないための3つのコツ
- 1 行進むごとに、変わった変数の列を必ず書く。「変わらなかった」場合も同じ値を書き写すと、見落としが激減します。
- 配列の境界(1 から 要素数 まで)を最初に確定 させる。0 始まりと混同して A[0] を読もうとするミスが科目Bで最も多い失点源です。
- 条件式の真偽を声に出して読む。「A[i] > 最大、4 は 3 より大きい、真」と言葉にすると、if のどちらに進むか迷いません。
次のステップ
トレースの型ができたら、次は 速度 です。配列の図示・境界値の確定・トレース表という訓練法を体系化した 基本情報科目B|擬似言語アルゴリズム読解の3ステップ訓練法 で読む速度を上げましょう。つまずきが記法なのかトレースなのか切り分けたいときは 科目Bがわからない人へ、科目B 全体の進め方は 基本情報技術者 科目B完全対策 が地図になります。
手を動かす練習台としては、過去問AI の 基本情報 アルゴリズムとプログラミング分野の過去問 が使えます(こちらは科目A 相当の選択式で、科目B そのものの形式ではない点だけ意識してください)。各問題ページの AI コパイロットに「このコードを 1 行ずつトレースして、変数の値の変化を表にして」と頼めば、本記事と同じ追い方を対話でその場で再現できます。
よくある質問
Q. 擬似言語のトレースは紙に書かないとダメですか? 慣れるまでは紙に書くことを強くおすすめします。頭の中だけで追うと、ループが数回回った時点で変数の値を見失い、答えがずれます。本記事のように「変数を列にした表」を作り、1 行進むごとに値を書くだけで正答率が大きく変わります。慣れれば簡単な処理は暗算でも追えるようになります。
Q. 配列の番号はなぜ 1 から数えるのですか? IPA 公開のサンプル問題で、配列の要素番号が 1 から始まる前提で書かれているためです。Python など 0 始まりの言語に慣れていると A[0] を先頭と勘違いしがちで、これが科目Bで最も多い失点源です。「先頭は 1 番、末尾は 要素数 番」と覚え直してください(問題文に別の指定があればそれに従います)。
Q. ループが何回回るか分からなくなります。 for は「初期値から終了値まで何ずつ増やすか」が書いてあるので、回る回数は最初に確定できます。例1の「1 から 5 まで 1 ずつ」なら 5 回です。while は条件が偽になるまで続くので、トレース表に「i(処理後)」「継続条件の真偽」の列を足し、毎回その真偽を書けば、いつ抜けるかが目で分かります。
Q. 線形探索で「見つからなかった」場合はどう表現しますか? 本記事の例では、見つからないと変数「位置」が最初の -1 のまま最後まで変わらず終わります。このように「ありえない値(-1 など)を初期値にしておき、最後まで変わらなければ未発見」と判断するのは擬似言語で頻出のパターンです。トレース表の最終行で位置が -1 のままかどうかを確認しましょう。
まとめ
- トレースは「変数を列にした表に、1 行進むごとに値を書く」だけ。頭で覚えず紙に書く
- 合計は「合計 ← 合計 + A[i]」で足し込む。← は = ではなく代入
- 最大値は A[1] を仮置きし、2 番目以降と比べて大きければ入れ替える
- 線形探索は -1 を初期値にし、一致したら番号を入れる。配列は 1 始まり
- 条件が偽で「何もしない」行も必ず書くと見落としが消える
記法 → トレース → 速度、の順で積み上げれば科目Bは必ず読めるようになります。