基本情報技術者 過去問題形式

基本情報技術者 擬似言語 問題集|過去問題形式で8問

科目Bの擬似言語は、コードを「実行するつもりで」1行ずつ追う練習が近道です。たとえば配列 {3, 1, 4, 1, 5} の合計を求める処理を、変数の中身がどう変わるかを机の上で書き出しながら追ってみましょう。基本情報技術者 プログラミング基礎&擬似言語「変数・条件分岐・繰り返し・オブジェクト指向・2進数・配列トレース」の練習問題8問です。

 

擬似言語、頭の中で1行ずつ追えていますか

擬似言語のトレースで変数の変化を1行ずつ追うイメージ

合計を求めるループでは、繰り返しのたびに変数の値が更新されます。変数の変化を1ステップずつ書き出すのが、トレースの基本動作です。配列 A={3, 1, 4, 1, 5} に対して、合計を入れる変数を 0 から始めて全要素を足すと、次のように動きます。

初期値 0 → 1周目 0+3=3 → 2周目 3+1=4 → 3周目 4+4=8 → 4周目 8+1=9 → 5周目 9+5=14。ループが終わったときの値 14 が答えです。条件分岐(もし〜ならば)や繰り返し(〜の間)の境界、たとえば「ループが何回回るか」「境界が『未満』か『以下』か」を取り違えると、答えが1つずれます。

 

トレースでつまずく3点
・繰り返しの回数 … 「0 から n 未満」と「1 から n 以下」で回数が変わる。
・変数の初期値 … 合計は 0、積は 1 から始めるのが定石。
・配列の添字 … 先頭を 0 とするか 1 とするかを最初に確認する。

 

擬似言語の設問で間違えるときは、ロジックそのものより「境界の1回」を数え違えていることがほとんどです。焦って読み飛ばさず、変数の表を作って埋めていけば確実に追えます。まずは8問で、どの制御構造でつまずくかを探ってみましょう。解けなかった設問は、解説の下に載せたリンクから解説記事へ進めます。

 

Q1. 次の擬似言語を実行したとき、変数 a に最後に入っている値はどれですか?

整数型: a ← 10
整数型: b ← 4
a ← a + b

回答

解説

正解は「D」です。

IPA 擬似言語の「」は代入を表します。まず a に 10、b に 4 が入ります。次の a ← a + b は、右辺 a + b(10 + 4 = 14)を計算してから左辺 a に入れ直すという意味です。よって a は 14 になります。代入は「右辺を計算してから左辺へ入れる」と覚えると間違いにくくなります。

A は b の値、B は更新前の a、C は引き算した結果で、いずれも a の最終値とは異なるため誤りです。

擬似言語の基礎とはを見る

 

Q2. 次の擬似言語を実行したとき、変数 result に入る値はどれですか?

整数型: x ← 7
整数型: result
もし x ≧ 5 ならば
  result ← 1
そうでなければ
  result ← 0

回答

解説

正解は「A」です。

x に 7 が入った状態で、条件「x ≧ 5」を確かめます。7 ≧ 5 はなので「もし」側の分岐に入り、result ← 1 が実行されます。条件分岐の問題は、条件式が真か偽かを先に判定してから、どちらの代入が動くかを追うのが鉄則です。

B は「そうでなければ」側で条件が偽のときの値、C は x の値そのものを取り違えた誤りです。

擬似言語の基礎とはを見る

 

Q3. 次の擬似言語を実行したとき、変数 sum に入る値はどれですか?

整数型: sum ← 0
整数型: i
i を 1 から 3 まで 1 ずつ増やしながら繰り返す
  sum ← sum + i

回答

解説

正解は「C」です。

i を 1 から 3 まで動かしながら sum に足していきます。i=1 のとき sum は 0+1=1、i=2 のとき 1+2=3、i=3 のとき 3+3=6 となり、最終的に sum は 6 です。繰り返しの問題は、ループ変数と累積変数の値を1回ごとに表にして追うとミスが減ります。

A は i の最終値、B は途中の値、D は別の範囲(1〜4 など)で足した結果で、いずれもこのループの結果とは異なるため誤りです。

擬似言語の基礎とはを見る

 

Q4. オブジェクト指向の「カプセル化」の説明として、もっとも適切なものはどれですか?

回答

解説

正解は「B」です。

カプセル化は、データ(属性)とそれを操作する手続き(メソッド)を1つのオブジェクトにまとめ、内部の詳細を外から直接いじれないように隠す考え方です。外部とは決められた窓口(メソッド)を通じてやり取りするため、安全性と保守性が高まります。

A は継承、C は多態性(ポリモーフィズム)の説明で、いずれもカプセル化とは別の概念のため誤りです。

オブジェクト指向プログラミングとはを見る

 

Q5. クラスとインスタンスの関係として、もっとも適切なものはどれですか?

回答

解説

正解は「A」です。

クラスはオブジェクトの設計図で、どんな属性と操作を持つかを定義します。その設計図をもとに実際にメモリ上へ作られた実体がインスタンスです。「たい焼きの型がクラス、焼き上がった1個1個のたい焼きがインスタンス」とイメージするとつかみやすくなります。

B は設計図と実体が逆、C は両者は別の概念なので誤り、D はクラスもインスタンスも変数や関数1個に限定されないため誤りです。

オブジェクト指向プログラミングとはを見る

 

Q6. 2進数 1010 と 0110 の論理積(AND)をビットごとに計算した結果はどれですか?

回答

解説

正解は「C」です。

論理積(AND)は、対応するビットが両方とも 1 のときだけ 1、それ以外は 0 になります。1010 と 0110 を上位の桁から順に見ると、1と0→0、0と1→0、1と1→1、0と0→0 となり、結果は 0010 です。

A の 1110 は論理和(OR)の結果、B の 1100 は排他的論理和(XOR)の結果で、AND の結果ではないため誤りです。

2進数と論理回路とはを見る

 

Q7. 配列 data の要素が data[1]=3, data[2]=8, data[3]=5 のとき、次の擬似言語を実行すると max に入る値はどれですか?

整数型: max ← data[1] 整数型: i
i を 2 から 3 まで 1 ずつ増やしながら繰り返す
  もし data[i] > max ならば max ← data[i]

回答

解説

正解は「B」です。

これは配列の最大値を求める定番処理です。まず max に data[1]=3 を入れます。i=2 で data[2]=8 > 3 が真なので max は 8 に更新。i=3 で data[3]=5 > 8 は偽なので更新なし。よって max は 8 です。

A は初期値のまま更新されなかった場合、C は最後の要素をそのまま入れてしまった場合の誤りです。

擬似言語の基礎とはを見る

 

Q8. プログラムを「関数(手続き)」に分けて書くことの利点として、もっとも適切なものはどれですか?

回答

解説

正解は「D」です。

関数(手続き)は、まとまった処理に名前を付けて切り出したものです。共通の処理を1か所にまとめておけば、必要なときに呼び出すだけで再利用でき、修正も1か所で済みます。結果としてコードが読みやすく、保守しやすくなります。

A は分割が速度を確実に上げるとは限らないため誤り、B は関数ごとに局所変数を持てるため誤り、C は再利用できるのが関数の利点なので誤りです。

擬似言語の基礎とはを見る

 

試験全体の流れを俯瞰したい時は、基本情報技術者 試験全体概要 に戻れます。

学習の全体像と次に進む分野は、基本情報技術者 学習ロードマップ で確認できます。