基本情報技術者試験(科目B)の擬似言語を特訓!例題で基礎を学ぶ

基本情報技術者試験対策

基本情報技術者試験 科目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

while文の問題の解答
よって、正解は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 は次のように変化します。
2分探索の特訓の解答

正解は、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]です。

コメント

タイトルとURLをコピーしました