基本情報技術者試験 科目Bの擬似言語問題を解けるようになりたい人向けに例題で特訓、解説、レベルアップ問題を出します。
変数・条件分岐・繰返し・配列・探索・ソートを問題形式で練習し、アルゴリズムを読み解く力を身につけます。
本書は擬似言語やアルゴリズムの基礎知識が必要です。不安な方は以下のページで学習をおすすめします。
科目Bの擬似言語を特訓しよう
基本情報技術者試験の科目Bでは、プログラムの処理内容を読み取り、実行結果や処理の流れを考える問題が出題されます。
「変数の値を追う」「条件を確認する」「繰り返し処理を追う」といった基本から少しずつ練習することで、擬似言語を読み解く力を身につけることができます。
擬似言語を解くために必要な力
科目Bの擬似言語問題を解くためには、次のような力が重要です。
- 変数の値の変化を追う力
- 条件分岐によって処理がどう変わるか判断する力
- 繰り返し処理を正確に追う力
- 配列の要素を正しく読み取る力
まずは簡単な問題から
慣れないうちは、擬似言語の問題を解くにに苦労します。
最初から難しい問題に挑戦するのではなく、少しずつ難易度を上げていくことで無理なく上達できます。大切なのは諦めずに何度も問題を解くことです。
本ページは条件分岐や繰り返し → 配列 → 探索アルゴリズム → ソートアルゴリズムというように、少しずつ難易度を上げていきます。
変数の値を追跡する特訓
複数の変数
a と b の値はいくつでしょうか。
a ← 4
b ← 7
a ← a + b
b ← a + b
a ← b – a

よって、正解はa = 7、b = 18
変数の値を入れ替える問題
x と y の値はいくつでしょうか。
x ← 10
y ← 20
temp ← x
x ← y
y ← temp

よって、正解はx = 20、y = 10
xとyが入れ替わっています。
分岐問題
result の値はいくつでしょうか。
x ← 12
y ← 20
if x >= 10 and y < 20
result ← 1
else
if x < 10 or y >= 20
result ← 2
else
result ← 3
endif
endif

よって、正解は2
while文の問題
最後の x と count の値はいくつでしょうか。
x ← 1
count ← 0
while x < 10
x ← x + 2
count ← count + 1
endwhile

よって、正解はx = 11、count = 5
繰り返しと条件分岐の総合問題
最後の sum はいくつでしょうか。
sum ← 0
for i ← 1 to 5
if i mod 2 = 1
sum ← sum + i
endif
endfor

よって、正解はsum=9
頭の中だけで処理せず、「i」や「sum」などの変数や、計算結果を表に書き出して、1回ずつ処理を追うことがポイントです。
配列の特訓
処理内容を当てる問題
下は何をしている処理か、配列aとxを使って説明せよ。
x ← a[1]
for (i を 2 から aの要素数 まで 1 ずつ増やす)
if a[i] > x
x ← a[i]
endif
endfor
実際に適当な値を配列にセットしてトレースすると分かりやすいです。
例えば、配列 a = [3, 8, 5, 6] の場合でトレースします。
配列 a の各要素を順番に調べ、現在の x より大きい値が見つかったら x を更新します。
そのため、処理終了後の x には配列 a の最大値が格納されます。
正解は「配列 a の中で最も大きい値(最大値)を変数 x に求める処理」
配列や変数値を表にしてトレースすると、処理を追いやすくなります。
条件に合う値の合計を求める
最後のsumはいくつでしょうか。
a[1] ← 12
a[2] ← 5
a[3] ← 8
a[4] ← 15
a[5] ← 20
sum ← 0
for i ← 1 to 5
if a[i] >= 10
sum ← sum + a[i]
endif
endfor
forで1から5まで繰り返して、変数sumへ足しこんでいることが分かりますが、配列条件「a[i] >= 10」があります。10以上の値だけを合計します。
よって、12、15、20を対象にsumへ足されます。
正解は、47です。
探索アルゴリズムの特訓
線形探索を特訓
次の処理を実行したとき、戻り値はいくつでしょうか。
a[1] ← 15
a[2] ← 8
a[3] ← 23
a[4] ← 23
a[5] ← 30
target ← 23
for i ← 1 to 5
if a[i] = target
return i
endif
endfor
この処理は配列を先頭から確認します。
4番目(i=4)にも23がありますが、見つかったらreturnとなっているので、3番目で終了となります。
正解は、3です。
二分探索の特訓
A[mid] = X となって探索が終了するまでに、mid はどのように変化するか。
a = [3, 8, 12, 17, 25, 31, 42, 56, 63, 71]
left ← 1
right ← 10
target ← 42
while left <= right
mid ← (left + right) ÷ 2
if a[mid] = target
return mid
elseif a[mid] < target
left ← mid + 1
else
right ← mid – 1
endif
endwhile
return -1
二分探索なので、mid は次のように変化します。
正解は、5 → 8 → 6です。
ソートの特訓
ソート後の配列を求める
処理終了後の配列はどうなっているでしょう。
a[1] ← 4
a[2] ← 1
a[3] ← 3
for i ← 1 to 2
for j ← 1 to 3 – i
if a[j] > a[j + 1]
temp ← a[j]
a[j] ← a[j + 1]
a[j + 1] ← temp
endif
endfor
endfor
これは 「バブルソート(隣り合う要素を比較して並べ替える処理)」 の問題です。
正解は、[1, 3, 4]です。

コメント