体系学習
擬似言語の読み方
基本情報技術者試験の科目Bにつながる擬似言語の読み方を、制御構造と変数の追跡から身につける。
対象資格:基本情報技術者試験
目安時間:30分
このページで理解できること
- 代入と比較を区別して変数の値を追跡できる
- if・while・forなどの制御構造で実行される行を判断できる
- 配列の添字と要素の更新を正確に追える
- 手続・関数・引数・戻り値の役割を区別できる
- トレース表を使って入れ子の処理や複数変数の変化を整理できる
基本情報技術者試験:代入・条件分岐・繰返し・配列・手続/関数を一行ずつ追跡し、科目Bの擬似言語問題を読める状態を目標にする。
擬似言語問題で重要なのは、コードを眺めて意味を推測することではなく、『今どの行を実行しているか』『変数や配列が何に変わったか』を機械的に追うことです。FEで使用される擬似言語には、代入、if、while、for、配列アクセス、手続・関数などの基本的な記述形式があります。このページでは、読む順序を固定し、短いコードから入れ子の処理まで段階的にトレースします。
擬似言語は5段階で読む
最初から答えを想像せず、状態を順番に更新します。
入力と初期値を書く
変数・配列の最初の値を明示し、未定義のものを勝手に補わないようにします。
制御構造を囲む
if、while、for、手続・関数の範囲を確認し、どこまでが同じ処理ブロックか把握します。
一行ずつ実行する
代入があれば右辺を現在値で計算し、その結果で左辺を更新します。
分岐と繰返しを判定する
条件式を評価し、次に実行する行を決めます。繰返しでは何回目かも記録します。
最後に問いだけを答える
途中で答えを予想せず、トレースした最終状態から選択肢を判断します。
1. まず「代入」を式の等号と混同しない
`x ← 式` は、式の値でxの内容を書き換える操作です。
FEの擬似言語では、変数への代入を左向き矢印で表します。`x ← x + 1` は数学の等式ではなく、『現在のxに1を足した値を、新しいxとして保存する』という順序のある操作です。
同じ変数が左辺と右辺に現れるときは、まず右辺を変更前の値で計算してから左辺を書き換えます。
比較演算の`=`や`<`などは条件式の真偽を求めるための演算であり、代入とは役割が異なります。
代入を順に追う
text
整数型: x
x ← 3
x ← x + 2
x ← x × 4xは3→5→20と変化します。各行で前の値を使って右辺を計算します。
2. ifは条件式を評価して「通る道」を一つ選ぶ
条件式の真偽を決め、実行されない枝は値を変えません。
ifでは条件式を評価し、真なら対応する処理を実行します。elseifがある場合は上から順に評価し、最初に真になった枝を実行します。
elseは、それ以前の条件がすべて偽だった場合に実行されます。選ばれなかった枝の代入は実行されないため、変数の値も変わりません。
複合条件では、and・or・notと比較演算子の関係を整理します。式が長いときは括弧ごとに真偽を求めると追いやすくなります。
条件分岐を追う
text
整数型: x, y
x ← 7
y ← 0
if (x > 5)
y ← 10
else
y ← 20
endifx > 5は真なのでy ← 10だけが実行され、最終的なyは10です。
3. 繰返しは「条件確認→本体→更新」の順序を固定する
何回目のループかと、各回の開始時・終了時の値を分けて記録します。
whileは条件式が真の間、処理を繰り返す前判定の繰返しです。最初から条件が偽なら、本体を一度も実行しません。
do〜whileは本体を実行した後で条件を判定するため、少なくとも一度は本体を実行します。
forは制御記述に従って一定回数などの繰返しを行います。科目Bでは、カウンタ変数の現在値、終了条件、増減のタイミングを意識します。
無限ループに見えるときは、条件式に使われている値が本体のどこで変化するかを探します。
whileをトレースする
text
整数型: i, total
i ← 1
total ← 0
while (i ≦ 3)
total ← total + i
i ← i + 1
endwhile各回終了時の(total, i)は(1,2)→(3,3)→(6,4)となり、i=4で条件が偽になって終了します。
4. 配列は「添字」と「値」を別々に追う
`a[i]`では、まずiの現在値を決め、その位置の要素を読み書きします。
配列の要素は角括弧内の要素番号で指定します。二次元配列では行番号・列番号など複数の要素番号を指定します。
擬似言語問題では配列の要素番号が0から始まるとは限りません。問題文や宣言、例示で開始番号を必ず確認し、普段使うプログラミング言語の癖で決めつけないことが重要です。
`a[i] ← a[i] + 1`のような処理では、現在のiを確認し、対象要素の変更前の値を読み、その要素だけを更新します。i自体は別の代入がない限り変わりません。
| 確認項目 | 例 |
|---|---|
| 添字変数 | i = 3 |
| 参照位置 | a[3] |
| 変更前の値 | a[3] = 8 |
| 実行する式 | a[3] ← 8 + 1 |
| 変更後の値 | a[3] = 9 |
5. 手続・関数は呼出し元と呼出し先を分けて追う
引数で値を渡し、処理後にどこへ戻るかを意識します。
手続や関数を呼び出すと、処理の流れはいったん呼出し先へ移ります。引数は呼出し側から処理に必要な値を渡すために使われます。
関数が値を返す場合、その戻り値が呼出し元の式や代入でどのように使われるか確認します。呼出しが入れ子になる場合は、内側の呼出しから結果を確定すると整理しやすくなります。
変数名が同じでも、呼出し元と関数内部で別の変数として扱われる場合があります。問題文で変数の有効範囲や引数の扱いが定義されているときは、その定義を優先します。
- 呼出し前の状態を残す
- 引数として渡される値を確認する
- 呼出し先を最後まで追う
- 戻り値を呼出し元の式へ戻す
6. トレース表は「変化した値だけ」を記録する
頭の中だけで追わず、変数・添字・配列要素の変化を表にします。
複数の変数や繰返しがある問題では、各行を頭の中だけで保持すると更新前後を混同しやすくなります。行番号や繰返し回数を左端に置き、値が変化する変数だけを列にします。
代入が実行されなかった変数は前の値を引き継ぎます。毎行すべてを書き直す必要はありませんが、『変更なし』と『未確認』を混同しないようにします。
選択肢が最終値を問う場合でも、途中の値を飛ばさず記録します。途中状態を残しておくと、どの行で読み違えたかを逆算できます。
| 回 | i | total | 備考 |
|---|---|---|---|
| 初期 | 1 | 0 | ループ開始前 |
| 1 | 2 | 1 | 1を加算 |
| 2 | 3 | 3 | 2を加算 |
| 3 | 4 | 6 | 3を加算 |
| 終了 | 4 | 6 | 条件 i ≦ 3 が偽 |
7. 入れ子では「内側を完了してから外側へ戻る」
二重ループや分岐入りループは、制御構造の境界を崩さず追います。
forの中にifがある場合は、各繰返しごとに条件式を評価します。ifの中にforがある場合は、その枝を選んだときだけ内側の繰返しが実行されます。
二重ループでは、外側の変数が1回進むごとに、内側のループがどこからどこまで動くか確認します。内側のカウンタを外側と混同しないよう、別々の列で記録します。
途中で配列要素を交換したり、カウンタ以外の変数を更新したりする問題では、更新直後の配列全体または変更された要素を記録すると読み違いを減らせます。
基本情報ではここまでつなげる
- 代入と比較を区別して値を更新できる
- if / elseif / elseで実行される枝を判断できる
- while・do〜while・forの判定タイミングを区別できる
- 配列の開始要素番号を問題文から確認できる
- 手続・関数の呼出し、引数、戻り値を追える
- 二重ループや配列更新をトレース表で追える
- コードを予想で読まず、一行ずつ状態更新できる
擬似言語は「状態更新問題」として読む
- 入力・初期値を固定する
- 制御構造の範囲を確認する
- 右辺を現在値で計算してから代入する
- 条件式の真偽で次の行を決める
- 配列では添字と要素を分けて追う
- 関数呼出しでは呼出し元の位置を残す
- 複雑になったらトレース表へ逃がす
擬似言語は、プログラミング言語の文法を暗記する問題ではありません。実行順序と状態変化を正確に追う練習を重ねると、初見の処理でも同じ手順で読み解けるようになります。