科目Bのプログラムは、たいてい ○ で始まる行から始まります。ここが「ひとまとまりの処理」の入口です。そして処理の途中で別のまとまりを呼び出し、終わったら呼んだ場所へ戻ってきます。この行ったり来たりを追えるようになると、読める問題が一気に増えます。
第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コンストラクタ
この試験の出題では
プログラムは2〜4個の部品でできています。呼び出しの深さも浅く、部品の中からさらに別の部品を呼ぶのは、せいぜい1段です。
そして問題文が「どのまとまりから始めるか」を必ず指定してくれます。どこから読み始めるかで迷う場面はありません。迷うのは「戻ったあと、どの行から続けるか」だけです。
部品 ── プログラムは、いくつかのまとまりに分かれている
ここまでの回で読んできたプログラムは、上から下へ一続きでした。ところが実際の出題は、処理がいくつかのまとまりに分かれています。
まとまりには名前が付いていて、名前を書くと、そのまとまりが動きます。動き終わったら、呼んだ場所へ戻ってきます。
syori()
この1行は「syori というまとまりを、いまここで動かす」という意味です。これを呼び出しといいます。
このまとまりには、手続と関数という2つの呼び名があります。違いは、呼んだ側に値が返ってくるかどうかだけです。見分け方はG3-3で扱います。この回では、どちらも同じ「部品」として読みます。
呼ぶと、どう動くのか
いちばん小さい形で、実際に追ってみます。渡すものも、返ってくるものもありません。まとまりが2つあるだけです。
○aisatsu() "こんにちは" を出力する ○main() "はじめ" を出力する aisatsu() "おわり" を出力する
main を呼び出したとします。上から順に追うと、こうなります。
| 実行した行 | いまどこにいるか | 出力 |
|---|---|---|
"はじめ" を出力する |
main | はじめ |
aisatsu() |
main → aisatsu へ移る | — |
"こんにちは" を出力する |
aisatsu | こんにちは |
| (aisatsu が終わる) | aisatsu → main へ戻る | — |
"おわり" を出力する |
main | おわり |
呼び出しで起きること
① そこで止まる呼び出しの行まで来たら、いったん中断する
② 呼ばれた側へ移るその中身を、最後の行まで実行する
③ 戻ってくる止めた行の続きから再開する
出力は はじめ → こんにちは → おわり。"おわり" がちゃんと出るのがポイントです。呼び出しは寄り道であって、そこで終わりではありません。
呼び出しは寄り道。戻るのは呼んだ行で、そこから続きを実行する
呼び出しの行に出会ったときの手順
- その行を書き留める(戻ってくる場所になる)
- 呼ばれた部品の1行目へ移る
- その部品を最後の行まで実行する
- 書き留めた行に戻り、その次の行から続ける
次のプログラムで main を呼び出しました。出力される順はどれですか。
○log() "*" を出力する ○main() log() "A" を出力する log() "B" を出力する
宣言 ── ○ は、部品の始まりを示す見出し
出典:IPA「擬似言語の記述形式」
- ○手続名又は関数名
- 手続又は関数を宣言する。
- 手続名又は関数名(引数, …)
- 手続又は関数を呼び出し,引数を受け渡す。
○ が付いた行は「ここから proc1 という処理が始まりますよ」という見出しです。実行されるわけではありません。実行されるのは、呼び出されたときだけです。
プログラムに ○proc1() ○proc2() ○proc3() と3つ並んでいても、上から順に実行されるわけではありません。問題文が「手続proc2 を呼び出すと」と指定していれば、proc2 の中身から始まります。
プログラムを読むときは、まず問題文が「どれを呼び出す」と言っているかを確認してください。
○proc1() のように括弧の中が空になり、呼び出しも proc1() と書きます。括弧が省略されることはありません。括弧の中に何かが書かれている形は、G3-2で扱います。
問題文に「手続proc2 を呼び出すと」と書かれていました。出力されるのはどれですか。
○proc1() "A" を出力する ○proc2() "B" を出力する
1行ずつ動かして確かめる
部品を3つにして、呼ばれた側からさらに別の部品を呼ぶ形にします。ここまでの3つ(止まる・移る・戻る)だけで追えます。
○ho() "ほ" を出力する ○ha() "は" を出力する ho() ○main() ho() "ま" を出力する ha()
追いかける前に ─ このプログラムは何をする?
main から始めます。やることは3つ並んでいるだけです。
① ho()寄り道して「ほ」を出し、戻ってくる
② "ま" を出力するそのまま「ま」を出す
③ ha()「は」を出したあと、その中からさらに ho() を呼ぶ
出力は ほ → ま → は → ほ。ho は2回呼ばれます。
同じ部品を何度呼んでもかまいません。そして呼ばれた側の中から、さらに別の部品を呼ぶこともできます(この試験ではせいぜい1段です)。
紙の上では、いま自分がどの部品にいるかを書き留めながら読むのが確実です。「呼出しの流れ」の欄が、それにあたります。
呼び出して、戻ってくる
当サイトオリジナルの例題
ループ開始前
いま計算していること
変数の状態
出力(ここまで)
トレース表(進めると1行ずつ積み上がります)
ha の中に ho() があることを見落とすと、出力は ほ → ま → は で止まってしまいます。
呼び出しの行は、それ自体が「まだ続きがある」という合図です。部品の最後の行まで目を通してから戻ってください。
呼ばれた部品が最後の行まで終わりました。次に実行されるのはどこですか。
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
| 宣言を上から順に実行してしまう | ○ の行は見出し。実行されるのは呼び出されたときだけ |
| 呼び出した行で止まらず読み進める | 呼ばれた側を最後までやってから、止めた行の次に戻る |
| 戻ってくるのを忘れる | 呼ばれた側が終わったら必ず呼んだ場所に戻る。残りの行がある |
| 同じ部品は1回しか呼べないと思う | 何度でも呼べる。そのたびに1行目から実行される |
| いまどの部品にいるか分からなくなる | 呼んだ行を書き留めてから移る |
次に読む
この記事で引用した資料
- 擬似言語の記述形式 科目Bの公開問題・サンプル問題の各冊子に掲載。冊子上の名称は年度により「基本情報技術者試験用」と「基本情報技術者試験,応用情報技術者試験用」があるが、本文は同一
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
本文の例題と練習問題は当サイトのオリジナルです。

