擬似言語トレース練習(1行ずつ動かす)
科目Bの擬似言語は、読めるのに答えが合わないのがいちばん厄介です。 文法は分かっているのに、ループが何回まわったかを数え間違える。 原因は知識ではなく頭の中でやっているトレースが途中でぼやけることなので、 その作業を画面に出しました。1行ずつ進めて、変数と配列がどう変わるかを目で追ってください。
使い方
- 先に自分で答えを出す。いきなり進めず、まず問題文を読んで頭の中で答えを決めてください。
- 「1行進む」で追う。光っている行がいま実行された行で、右の表がその直後の変数の値です。 配列は矢印の位置(lo・hi・i・j)も一緒に出ます。
- 最後まで進むと問題が出ます。最初に決めた答えと合っていたかを確認してください。 ずれた場合は、どの行で自分の想像と違ったかを戻りながら探します。
※プログラムはIT資格ラボのオリジナルです(過去問の転載ではありません)。キーボードの左右キーでも進められます。
問1:配列を逆順に並べ替える(ループは半分で終わる)
前から見る位置 lo と後ろから見る位置 hi を中央へ寄せながら、要素を交換していきます。5要素の配列を逆順にするとき、交換は何回起きるでしょうか。数える前に、まず1行ずつ動かしてみてください。
- ○reverse(整数型の配列: data)
- 整数型: lo, hi, tmp
- lo ← 1
- hi ← data の要素数
- while (lo < hi)
- tmp ← data[lo]
- data[lo] ← data[hi]
- data[hi] ← tmp
- lo ← lo + 1
- hi ← hi - 1
- endwhile
| lo | hi | tmp |
|---|---|---|
| — | — | — |
5要素の配列を逆順にするあいだに、要素の交換(tmp を使う3行)は何回実行されたか。
lo と hi は1回の交換ごとに1つずつ近づくので、すれ違うまでの回数=要素数の半分で終わります。5要素なら lo=1・hi=5 と lo=2・hi=4 の2回だけで、3回目は lo も hi も 3 になって条件が偽になり、中に入りません。「要素の数だけ回る」と思い込むと、この形のループは必ず数え間違えます。中央の要素は動かさなくてよい、と気づけるかが分かれ目です。
問2:do 〜 while は、条件が偽でも1回は実行される
別紙2にある記述形式のうち、いちばん見落とされるのが後判定の do 〜 while です。n = 2 を渡したとき、戻り値はいくつになるでしょうか。前判定の while との違いが、そのまま答えの違いになります。
- ○整数型: countdown(整数型: n)
- 整数型: c
- c ← 0
- do
- n ← n - 3
- c ← c + 1
- while (n > 0)
- return c
| n | c |
|---|---|
| — | — |
countdown(2) の戻り値はどれか。
do 〜 while は後判定なので、条件を見る前に必ず1回は中の処理が動きます。n は 2 - 3 = -1 になり c は 1。そのあとで初めて条件を判定して偽になり、1 を返します。もし前判定の while だったら、最初の判定の時点で n はまだ 2 なので中に入り、同じ処理でも回数が変わります。コードを読んだ瞬間に「必ず1回は通るのか、0回で終わりうるのか」を見分けられるようにしておくと事故が減ります。
問3:二重ループ(内側の回数が毎回変わる)
隣り合う要素を比べて交換する並べ替えです。外側が1回進むごとに内側の上限が減るので、内側の回数は毎回変わります。ステップ数が多いので「最後まで」も使いながら、交換が何回起きたかを数えてみてください。
- ○bubble(整数型の配列: data)
- 整数型: i, j, tmp
- for (i を 1 から data の要素数 - 1 まで 1 ずつ増やす)
- for (j を 1 から data の要素数 - i まで 1 ずつ増やす)
- if (data[j] > data[j + 1])
- tmp ← data[j]
- data[j] ← data[j + 1]
- data[j + 1] ← tmp
- endif
- endfor
- endfor
| i | j | tmp |
|---|---|---|
| — | — | — |
{4, 2, 3, 1} を並べ替えるあいだに、要素の交換は何回実行されたか。
比較の回数と交換の回数は別物です。内側のループは i = 1 のとき3回、i = 2 のとき2回、i = 3 のとき1回まわるので、比較は合計6回。そのうち条件が真になって実際に交換されたのは、i = 1 で3回、i = 2 で1回、i = 3 で1回の合計5回でした。「二重ループだから要素数の2乗」と暗記していると外しますし、比較回数と交換回数を混ぜても外します。内側の上限が「要素数 - i」である以上、回数は外側の進み方に従って減っていきます。
トレースで落とすのは、たいていこの3か所
上の3問は、それぞれ別の落とし穴を狙って作ってあります。 いずれも「文法を知らない」ではなく「回数を数え間違える」タイプで、 解説を読んで納得しても、次に自力で解くとまた同じところで落ちます。
| つまずき | 何が起きるか | 確かめる場所 |
|---|---|---|
| ループが要素数の半分で終わる | 5要素の配列を逆順にしても、交換は2回しか起きない。「要素の数だけ回る」と思い込むとずれる | 問1 |
| 後判定は必ず1回通る | do 〜 while は条件が最初から偽でも1回実行される。前判定の while なら0回。カウンタが1ずれる | 問2 |
| 内側のループ回数が毎回変わる | 内側の上限が「要素数 - i」なので3回→2回→1回と減る。比較6回に対して交換は5回で、両者は別物 | 問3 |
「疑似言語」と「擬似言語」はどちらが正しいのか
検索するとどちらの表記も出てきますが、IPAが使っているのは「擬似言語」のほうです。 仕様の原典は「試験で使用する情報技術に関する用語・プログラム言語など」(Ver.5.1)に付いている 別紙2で、これはA4で2ページしかありません。 表記ゆれを気にするより、9種類の記述形式を覚えて、あとは手を動かすほうが早いです。
※検索結果には1つ前のVer.5.0のPDFも出てきますが、当サイトで両方を突き合わせたところ、 基本情報向けの中身は変わっていませんでした。詳しくは 科目Bの解き方ガイドに整理しています。
よくある質問
本番でも、ここまで丁寧に全部の行をトレースするのですか?
本番では時間が足りません。科目Bは20問を100分=1問あたり5分の計算になるので、全行の変数を書き出す余裕はないと考えてください。このページで身につけたいのは「どの行で何が変わるか」を目で追える状態そのものです。慣れてくると、変数が変わる行と分岐だけを拾って残りは読み飛ばせるようになります。練習では丁寧に、本番では要点だけ、が現実的な使い分けです。
配列の要素番号は 1 から数えるのですか、0 からですか?
このページのプログラムは 1 から数えています。ただし本番では必要な前提が問題文のほうで示されるので、そこに書かれている定義に必ず従ってください。要素番号が 1 始まりか 0 始まりかを取り違えると答えが1つずれますが、選択肢にはその「1つずれた値」がたいてい用意されているので、そのまま失点につながります。読み飛ばしやすい注記ほど先に確認する癖をつけると安全です。
科目Bでアルゴリズムの問題は何問出るのですか?
IPAが科目Bのサンプル問題で示している出題割合は、アルゴリズムとプログラミングが8割、情報セキュリティが2割です。科目Bは20問なので、目安としてアルゴリズムが16問・セキュリティが4問という配分になります。つまり科目Bの合否はほぼこのトレース力で決まり、セキュリティの4問は科目Aの学習と重なる取りやすい枠、という位置づけになります。
出典・ご注意
本ページのプログラムはIT資格ラボが独自に作成したオリジナルです(IPA公式の過去問題の転載ではありません)。擬似言語の記法はIPAの別紙2「擬似言語の記述形式」に寄せていますが、画面表示の都合で不等号などの記号を全角にしているほか、細部は簡略化している場合があります。配列の要素番号は1から数えていますが、実際の試験では問題文に示される定義に従ってください。試験制度・出題形式は変更されることがあるため、必ずIPA公式をご確認ください。
最終更新日: