令和5年度の科目B、その2問目です。プログラムは全部で9行、変数も配列も繰返しも条件分岐も出てきません。決め手は2つだけです ── どこから動き始めるかと、呼んだ先が終わったらどこへ帰るか。この記事では、解答群を1度も見ないまま出力の順を自分で書くところまで進みます。
出題
まず原文のまま読んでみてください。記号の読み方は次の節にまとめてありますので、読めなくてもここでは問題ありません。
出典:令和5年度 基本情報技術者試験 科目B 公開問題 問2
次の記述中の に入れる正しい答えを,解答群の中から選べ。
次のプログラムにおいて,手続proc2 を呼び出すと, の順に出力される。
〔プログラム〕
○proc1() "A" を出力する proc3() ○proc2() proc3() "B" を出力する proc1() ○proc3() "C" を出力する
解答群
ア “A”,“B”,“B”,“C”
イ “A”,“C”
ウ “A”,“C”,“B”,“C”
エ “B”,“A”,“B”,“C”
オ “B”,“C”,“B”,“A”
カ “C”,“B”
キ “C”,“B”,“A”
ク “C”,“B”,“A”,“C”
答えだけ先に見る
正解は ク(“C”,“B”,“A”,“C”)です。
この問題に出てくる記号
読めない記号があったときだけ開いてください。いま読めればいいのは4つだけです。
擬似言語の記号 4コ の読み方をひらく
| 書き方 | 読み方 |
|---|---|
○proc1() |
ここから proc1 という手続が1つ始まるという宣言の印です。手続とは、名前を付けてひとまとめにした処理のことをいいます。宣言は置いてあるだけで、呼ばれるまで1行も実行されません |
proc3() |
○ が付いていない、名前だけの行。これは呼び出しで、proc3 の中身へ入る、という意味です |
"C" を出力する |
画面に C を1つ出す。出た順が、そのまま答えになります |
| 字下げ | ○ の行より右へ下げてある行が、その手続の中身です。この問題では、3つの手続がそれぞれ1〜3行の中身をもっています |
記号でつまずいたら、下の教科書から、先にそこだけ読んでください(G3 のような番号は、当サイトの擬似言語の教科書の第何回かを表します)。
○ が付いた行は「宣言」 ── 動き出すのは proc2 の中身だけ
このプログラムには、手続が3つ置いてあります。3つとも ○ から始まる行で宣言されているだけで、書いてある順に上から実行されるわけではありません。問題文は「手続proc2 を呼び出すと」と言っています。だから、動き出すのは proc2 の中身です。proc1 は上に書いてありますが、呼ばれるまで1行も実行されません。
動き出すところ
上から順ではありません。実行が始まるのは、呼び出された proc2 の中身の1行目 ── proc3() です。
手で動かす ── 呼んだ先まで、たどる
呼び出しの行に来たら、その手続の中身へ入り、中身を最後まで実行してから、呼んだ行の次へ帰ってきます。帰ってくることを復帰といいます。入った先でまた呼び出せば、そのぶん深く入ります ── この重なりを入れ子と呼びます。
では、proc2 を呼び出したところから、終わるまでを1行ずつ表に書き出します。見るのはいま、どの手続の中にいるかを書いた列です ── ここが伸びたら中へ入った、短くなったら帰った、という意味になります。
proc2 を呼び出してから、終わるまで
上から時間の順に1行ずつ。いる場所は、そのときどの手続の中にいるかを外側から順に並べたものです。緑=その行で出力が1つ増えたところ。上のプログラムの行番号は当サイトで付けたもので、出題にはありません。
1 ○proc1() 2 "A" を出力する 3 proc3() 4 5 ○proc2() 6 proc3() 7 "B" を出力する 8 proc1() 9 10 ○proc3() 11 "C" を出力する
| いる場所 | 実行する行 | ここまでの出力 |
|---|---|---|
| proc2 | 6行目 proc3() |
— |
| proc2→proc3 | 11行目 "C" を出力する |
C |
| proc2→proc3 | proc3 が終わり、呼んだ6行目の次=7行目へ帰る | C |
| proc2 | 7行目 "B" を出力する |
C B |
| proc2 | 8行目 proc1() |
C B |
| proc2→proc1 | 2行目 "A" を出力する |
C B A |
| proc2→proc1 | 3行目 proc3() |
C B A |
| proc2→proc1→proc3 | 11行目 "C" を出力する |
C B A C |
| proc2→proc1→proc3 | proc3 が終わり、呼んだ3行目へ帰る | C B A C |
| proc2→proc1 | 3行目は proc1 の最後の行。proc1 も終わり、8行目へ帰る | C B A C |
| proc2 | 8行目も proc2 の最後の行。ここで全部終わり | C B A C |
いる場所の列は、手続の中へ入るたびに右へ1つ伸び、その手続が終わるたびに1つ短くなります。いちばん深いのは proc2→proc1→proc3 の2行で、そこから1つずつほどけて終わります。
出力は C B A C の4つ。行が上から下へ流れるのではなく、呼び出しのたびに飛んで、また帰ってくることが、この問題のすべてです。
proc1 の中にも、proc3() の行がありました(3行目)。呼んだ先の中にさらに呼び出しがあれば、そこにも入ります。表でも proc2→proc1→proc3 まで深く入り、そこで C がもう1つ増えています。
空欄に入るものを決める
決めるのは、この3行です。
〔プログラム〕proc2 の宣言と、その中身
○proc2() proc3() "B" を出力する proc1()
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
たどったとおり、proc3() で C、次の行で B、proc1() で A と C。出たのは4つです。
空欄に入るもの
“C”,“B”,“A”,“C”
ここで初めて解答群を見る
この並び “C”,“B”,“A”,“C” は ク だけです。
答え合わせ ── 動かすと C・B・A・C が出る
「次へ」で1行ずつ進めてください。いま光っている行が proc1・proc2・proc3 のあいだを行き来して、上の表と同じ道をたどります。
1行ずつ追う proc2 を呼び出したとき
出典:令和5年度 科目B 公開問題 問2
ループ開始前
いま計算していること
呼び出しの入れ子
出力された順
トレース表(進めると1行ずつ積み上がります)
正解は ク
出力は “C”,“B”,“A”,“C”。proc3 → "B" を出力する → proc1(その中で "A" を出力する → proc3)の順です。
消えた5つのうち、イ(“A”,“C”)だけはありえる出力です ── ただしそれは proc2 ではなく proc1 を呼び出したときの出力で、呼ぶ手続を取りちがえると、ちょうどこれになります。
次に読む
この問題でどこに手間取ったかで、行き先が変わります。
○ の行を「実行する行」と読んでしまった人へ一覧科目B 全44問の解説 ── 同じ形の問題を続けて解きたい人へこの記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

