前回は、呼び出すときに渡すものを見ました。今回は帰りに持ってくるものです。ここまで名前だけ出していた手続と関数も、この回で見分けられるようになります。
第1部 擬似言語の教科書 地図+20回
G1擬似言語の地図(入口)G2-1変数と宣言G2-2データ型G2-3代入「←」G3-1部品を呼ぶ/戻るG3-2引数G3-3戻り値・手続と関数G4-1配列と要素番号G4-2配列の読み書きG5選択処理 ifG6-1繰返し forG6-2配列を for で回すG7繰返し whileG8-1算術演算子と優先順位G8-2and / or / notG9-12次元配列G9-22重ループG10大域変数と局所変数G11未定義G12-1演算子 . の読み方G12-2クラスとはG12-3コンストラクタ
この回で分かること
呼ばれた部品が帰りに値を持ってくると、呼び出しを ← の右に書けるようになります。
持ってくるのが関数、持ってこないのが手続。見分けるのは、宣言の1か所だけです。
戻り値 ── 呼んだ側へ、値を1つ返す
2つ受け取って、足した結果を返す部品です。
○整数型: tasu(整数型: a, 整数型: b) return a + b
return は「この値を、呼び出した相手に返す」という意味です。tasu(2, 3) なら a が 2、b が 3 なので、2 + 3 = 5 が返ります。
返ってきた値は、そのまま箱に入れられます。
整数型: g ← tasu(2, 3)
矢印の右に呼び出しが書けるのは、そこから値が返ってくるからです。返ってきた 5 が、そのまま g に入ります。
前回、引数を「自動販売機に入れるお金」にたとえました。戻り値は、出てくるジュースです。入れたら、何かが出てくる ── これが関数。
いっぽう照明のスイッチは、押せば部屋は明るくなりますが、手元には何も出てきません。これが手続です。
手を出したときに、何か受け取れるかどうか。違いはそこだけです。
渡して、中で使って、返す。この3つが1本につながっている
1本の流れとして読む
① 渡すtasu(2, 3) の 2 と 3 が、a と b に入る
② 中で使うa + b = 5 を計算する
③ 返すreturn で 5 が呼んだ場所へ戻り、g に入る
呼び出しの1行 整数型: g ← tasu(2, 3) の中で、この3つが全部起きています。
○整数型: tasu(…) の 整数型 が、返ってくるものの型です。括弧の中が入口、名前の前が出口と覚えると迷いません。
(令和8年度 基本情報技術者試験 科目B 公開問題 問2)実際の出題では ○8ビット型: complement(8ビット型: x) の中に return y があり、問題文が「x に加算すると00000000 になる値を返す」と説明しています。宣言の先頭の型と、問題文の説明 ── 手がかりはこの2つです。
return は記述形式の表に載っていない
IPAが定めた記号の一覧に return の行はありません。それでもプログラムには出てきます。上の2つの手がかりで読めるように作られているので、表に無いことは気にしなくて構いません。
返す値が無い部品には、return が出てきません。最後の行まで実行したら、呼んだ場所へ戻ります。
大域: と書かれた変数は、どの部品からも同じ1つの箱として読み書きできます。書かれていない変数は、その部品の中だけの箱です。
次のプログラムで main を呼び出しました。何が出力されますか。
○整数型: tasu(整数型: a, 整数型: b) return a + b ○main() 整数型: g ← tasu(4, 6) g ← tasu(g, 1) g を出力する
手続と関数 ── 違いは、値が返るかどうかだけ
tasu は値を返しました。返さないものもあります。並べてみます。
○整数型: tasu(整数型: a, 整数型: b) ← 返す ○hyouji(整数型: n) ← 返さない
違いは○ と名前の間に型があるかどうかだけです。tasu には 整数型: があり、hyouji には何もありません。
手続 ── 呼んで、手ぶらで戻ってくる
関数 ── 呼んで、値を持って戻ってくる
宣言を見て、手続か関数かを決める手順
- 行の先頭の
○を見つける ○のすぐ次を読む- そこがいきなり名前なら手続。呼び出しは1行で完結する
- そこに
整数型:のような型があれば関数。呼び出しは←の右に書ける
これは変数の宣言(整数型: x)と同じ「コロンの前が型」の形が、そのまま使われているだけです。新しい記号を覚える必要はありません。
手続は処理をひとまとめにしたもの、関数はそれに加えて値を1つ返すもの。返す値の型が、名前の前に書かれます。
実際の出題に出てくる宣言を、同じ見方で並べておきます。
| 実際に出てくる宣言 | 呼び出しの書き方 | 呼んだあと、どうなるか |
|---|---|---|
○proc1() |
proc1() |
中の処理が動く。返ってくるものは無い |
○putRelatedItem(文字列型: item) |
putRelatedItem("A") |
item に "A" が入って動く。返ってくるものは無い |
○整数型: maximum(整数型: x, 整数型: y, 整数型: z) |
m ← maximum(3, 9, 5) |
m に 9 が入る(3つのうち最大の値が返る) |
○論理型: add(整数型: value) |
flag ← add(3) |
flag に true か false が入る |
宣言の実例はいずれも令和5〜8年度 科目B 公開問題より
次のプログラムで main を呼び出すと 5 が出力されました。空欄に入るのはどれですか。
○整数型: tasu(整数型: a, 整数型: b) return a + b ○hyouji(整数型: n) n を出力する ○main() 整数型: g ← hyouji(g)
関数を呼んでおきながら、返ってきた値を使わないことがあります。実際の出題から引きます。
出典:令和5年度 基本情報技術者試験 科目B 公開問題 問4(プログラムの一部)
○論理型: add(整数型: value)
…
○test()
add(3)
add(18)
add(11)
add は宣言に 論理型: が付いているので関数です。それなのに test の中では、flag ← add(3) ではなく add(3) と1行で呼んでいます。
返ってきた true / false を使わずに捨てているだけで、関数であることは変わりません。種類を決めるのは呼び出し方ではなく、宣言のほうです。
1行ずつ動かして確かめる
tasu(返す)と hyouji(返さない)を、1本の中で続けて呼びます。いまどこにいるかと、g に何が入るかを並べて追ってください。
返す部品と、返さない部品を続けて呼ぶ
当サイトオリジナルの例題
ループ開始前
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
大域変数 ── 引数で渡されていないのに使える箱
部品が使う値は、ふつう引数で渡されてきます。ところが実際の出題には、渡されていないのに使われている変数が出てきます。
出典:令和7年度 基本情報技術者試験 科目B 公開問題 問2(プログラムの一部)
大域: 整数型: stackPos ← 3
宣言の頭に 大域: と付いた変数は、どの部品からも読み書きできます。だから引数で受け取っていなくても、部品の中に名前だけ出てきます。
部品の中を読んでいて宣言が見当たらない変数が出てきたら、プログラムのいちばん上に 大域: の行がないかを探してください。たいていそこにあります。
読むために必要なのは、ここまでです。大域変数がいつまで残るのか、部品の中だけの変数と何が違うのかは、G10 大域変数と局所変数で扱います。
次のプログラムで main を呼び出しました。何が出力されますか。
大域: 整数型: cnt ← 3 ○fuyasu() cnt ← cnt + 1 ○main() fuyasu() cnt を出力する
トレース ── 呼び出しがあるときは、居場所と戻り先も書く
G2-3 では、変数を横に並べて値を書き足していきました。呼び出しが出てくると、それだけでは足りません。いま自分がどの部品を読んでいるのか、そして終わったらどの行に戻るのかが分からなくなるからです。
足す列は2つだけです。「いまどこ」と「戻り先」。次のプログラムで実際に書いてみます。
○calc() 整数型: a ← add(2, 3) 整数型: b ← a + 1 ○整数型: add(整数型: x, 整数型: y) return x + y
| 実行した行 | いまどこ | 戻り先 | a | b | x | y |
|---|---|---|---|---|---|---|
a ← add(2, 3) |
calc | — | — | — | — | — |
| add に移る | calc → add | a ← add(2, 3) |
— | — | 2 | 3 |
return x + y |
calc → add | a ← add(2, 3) |
— | — | 2 | 3 |
| calc に戻る | calc | — | 5 | — | 消える | 消える |
b ← a + 1 |
calc | — | 5 | 6 | — | — |
引数(x と y)は、その部品の中だけのものです。add が終わった瞬間に消え、calc からは見えません。だからトレース表でも、部品を出たところで打ち切って構いません。
いっぽう大域変数は、部品が変わっても消えません。だから表のいちばん左に固定して置くのが実戦的です。どちらがいつまで残るのかを、書く位置で分けてしまうわけです。
戻り先の列は、呼び出しが1段なら書かなくても間に合います。ただし部品の中からさらに別の部品を呼ぶ形になると、戻り先を控えていないと必ず迷子になります。この積み重なりを本格的に扱うのが再帰で、第2部で扱います。
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
| 手続と関数の区別がつかない | ○ と名前の間に型があれば関数、無ければ手続 |
| 呼び出し方で種類を決めてしまう | 関数でも1行で呼んで値を捨てることがある。決めるのは宣言 |
手続の呼び出しを ← の右に書く |
返るものが無いので入れられない。1行で完結する |
return を記述形式の表で探す |
表には載っていない。宣言の先頭の型と問題文の説明で読む |
| 大域変数も戻ると消えると思う | 消えるのは引数。大域変数は部品が変わっても残る |
次に読む
この記事で引用した資料
- 擬似言語の記述形式 科目Bの公開問題・サンプル問題の各冊子に掲載。冊子上の名称は年度により「基本情報技術者試験用」と「基本情報技術者試験,応用情報技術者試験用」があるが、本文は同一
- 令和5年度 基本情報技術者試験 科目B 公開問題(2023年7月6日公開)
- 令和6年度 基本情報技術者試験 科目B 公開問題(2024年7月5日公開)
- 令和7年度 基本情報技術者試験 科目B 公開問題(2025年7月4日公開)
- 令和8年度 基本情報技術者試験 科目B 公開問題(2026年7月1日公開)
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

