擬似言語のトレースのやり方
飛岡拓希公開
トレースとは、プログラムを1行ずつ動かして、変数の値を書き出す作業です。 頭の中で追うと、3つ目の変数あたりで崩れます。手順は4つだけです。
- 1. 変数の箱を、紙に並べる
- 2. 上から1行ずつ動かし、代入のたびに値を書き換える
- 3. 分岐は、条件の真偽を先に書いてから進む
- 4. 繰り返しは、周回ごとの表にする
手順1:変数の箱を並べる
宣言されている変数を、紙の上に横に並べます。引数も変数です。 この時点では値を入れません(未定義のままにしておきます)。
箱を先に作るのは、途中で「この変数なんだっけ」と戻らないためです。 戻ると、それまで追った内容が頭から消えます。
手順2:1行ずつ動かす
上から順に実行します。← は代入で、 右側を計算してから左の箱に入れます。値が変わったら、古い値を消さずに横に書き足すと、 あとで「どこで変わったか」を追えます。
飛ばしてよい行はありません。宣言だけの行も、箱が増えた印として書きます。
この手順だけで解ける問題:if-else の分岐をトレースして戻り値を求める(基本文法とトレース・登録なしで解けます)
手順3:分岐は真偽を先に書く
if に来たら、条件式に今の値を当てはめて、真か偽かを先に紙に書きます。 そのうえで、通る側のブロックだけを動かします。
通らなかった側を読んでしまうのが、いちばん多い事故です。else の中身は、条件が偽のときだけ動きます。
endif の後ろにある行は、 どちらを通っても実行されます。ここを分岐の中だと誤読すると、答えが変わります。
手順4:繰り返しは表にする
ループは、周回ごとに1行の表を作ります。列は「何周目」と、変化する変数です。
| 周 | i | sum |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 3 |
| 3 | 3 | 6 |
表にすると、終了条件を満たした瞬間の値が見えます。 ループを抜けた後の値を聞かれることが多いので、 「最後に通った周」と「抜けた後」を分けて書いておくと間違えません。
配列とループの問題:配列を右に1つずらす巡回シフトを穴埋めする(配列・登録なしで解けます)
再帰は、積んでから戻す
再帰呼出しは、上から下へは追えません。呼び出しを縦に積んでいき、止まったところから逆に戻します。
calc(4) = 4 + calc(3) ← 積む calc(3) = 3 + calc(2) calc(2) = 2 + calc(1) calc(1) = 1 ← ここで止まる(基底条件) calc(2) = 2 + 1 = 3 ← 戻す calc(3) = 3 + 3 = 6 calc(4) = 4 + 6 = 10
止まる条件(基底条件)を先に探すのがコツです。それが無い再帰は終わりませんので、必ずどこかにあります。
処理が呼び出しの前か後かで結果が逆になる形や、自分を2回呼ぶ形は再帰のトレースのやり方にまとめています。
積んで戻す練習:再帰関数の戻り値をトレースする(再帰・登録なしで解けます)
つまずきやすい記法
プログラミング言語の経験がある人ほど、手が覚えている記号で読んでしまいます。
| 見かけるもの | 意味 |
|---|---|
| ← | 代入。比較の「等しい」は =(== は使わない) |
| mod | 剰余。記述形式に % はありません |
| ≠ ≦ ≧ | 等しくない・以下・以上(!= <= >= ではない) |
| 配列の要素番号 | 問題文に「ここで、配列の要素番号は 1 から始まる。」と毎回書かれます。記述形式そのものの決まりではないので、その一文を必ず読むこと |
| . | メンバ変数やメソッドへのアクセス |
| 字下げ | ブロックの範囲そのもの。どこまでが if の中かは字下げで読む |
記号の一覧は擬似言語の記法にまとめています。
手を動かして確かめる
読むだけでは速くなりません。手順を試せる問題を、分野ごとに置いています。
スタックとキュー:二つのスタックでキュー(FIFO)を実現する(リスト・スタック・キュー・登録なしで解けます)
木構造:二分探索木で範囲内のノード数を数える(木構造・グラフ・登録なしで解けます)
整列・探索:二分探索で探索範囲を更新する(整列・探索・登録なしで解けます)
文字列処理:文字列の各文字を2回繰り返す処理を穴埋めする(文字列処理・登録なしで解けます)
分野ごとの一覧は練習問題のページにあります。
解いたあとに解説を読む
このサイト(極とれ)の問題は、解いたあとにトレースの手順と、 選択肢ごとに「なぜ違うか」が開きます。登録なしで解けます。
練習問題を見る記法は IPA が公開しているサンプル問題・公開問題の記述形式に基づいています。 出題形式は改訂されることがあるため、受験の際は IPA の公表内容をご確認ください。
この記事について
書いているのは飛岡拓希です。基本情報技術者試験の科目B だけを扱う学習サービス「極とれ」を 1人で作って運営しています。試験には高校3年生のときに合格しました(そのときの記録)。
数字を載せるときは、出典の資料を自分で開いて数えた値だけを使い、いつ時点のものかを本文に書いています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。読んだ感想はフォームからも送れます。