基本情報技術者試験の令和6年度の公開問題(科目B)を解いてみよう。
正解:エ
この問題は、2進数の文字列を10進数に変換する処理を行う関数 convDecimal において、ループ内でどのように計算すればよいかを問う問題である。
まず問題の目的を整理しよう
入力の例
“10010”
これは 2進数 である。10進数で表すと、
1×2⁴ + 0×2³ + 0×2² + 1×2¹ + 0×2⁰ = 16 + 0 + 0 + 2 + 0 = 18
となる。
プログラムの流れを見てみよう
○整数型: convDecimal(文字列型: binary)
整数型: i, length, result ← 0
length ← binaryの文字数
for (i を 1 から length まで 1 ずつ増やす)
result ← □
endfor
return result
ここで result ← □ に入るべき式を選ぶことになる。
2進数 → 10進数 の計算方法の基本
一般的に、左から右に順に見ていく場合、次のように計算する。
例:binary = “10010”
処理の流れ
1. 初期値: result = 0
2. ‘1’ → result = 0×2 + 1 = 1
3. ‘0’ → result = 1×2 + 0 = 2
4. ‘0’ → result = 2×2 + 0 = 4
5. ‘1’ → result = 4×2 + 1 = 9
6. ‘0’ → result = 9×2 + 0 = 18
これを見ると、「result × 2 + 現在の文字の数値(0または1)」という形で計算していることがわかる。
それでは、各選択肢を確認しよう
ア:result + int(binary の (length - i + 1)文字目の文字)
→ 単なる足し算。×(不正解)
イ:result + int(binary の i文字目の文字)
→ 単なる足し算。×(不正解)
ウ:result × 2 + int(binary の (length - i + 1)文字目の文字)
→ 正しい式だが、右から左(下位桁から)処理する形になっている。
プログラムは i = 1 to length(つまり左から)なので、順序が合っていない。×(不正解)
エ:result × 2 + int(binary の i文字目の文字)
→ 正しい式で、左から順に処理する形にも合っている。○(正解)
したがって、正しい選択肢は、
エ result × 2 + int(binary の i文字目の文字)
である。
コメント