令和5年度 基本情報技術者試験 科目B 問2の解説|手続の呼出しと復帰・出力の順

基本情報技術者試験

令和5年度 科目B 公開問題 問2擬似言語・手続の呼出しと復帰最終更新 2026-09-11

令和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 を呼び出したときの出力で、呼ぶ手続を取りちがえると、ちょうどこれになります。

次に読む

この問題でどこに手間取ったかで、行き先が変わります。

この記事で引用した資料

いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

Copied title and URL