基本情報技術者試験 科目Bの「令和4年度 サンプル問題 問12」(式の読解・配列の類似度 simRatio)を、図解で解説します。穴埋めの中身は、cnt が何を数えている変数なのかを、戻り値の式と照らし合わせる だけで決まります。
動画で見たい方はこちら▼
問題(令和4年度 サンプル問題 問12)
次のプログラム中の【 】に入れる正しい答えを,解答群の中から選べ。
ここで,配列の要素番号は 1 から始まる。
関数 simRatio は,引数として与えられた要素数1以上の二つの文字型の配列 s1 と s2 を比較し,要素数が等しい場合は,配列の並びがどの程度似ているかを示す指標として,(要素番号が同じ要素の文字同士が一致する要素の組の個数 ÷ s1 の要素数)を返す。すべて一致すれば戻り値は1,一致しなければ0,要素数が異なる場合は −1 を返す。
表 関数 simRatio に与える s1,s2 及び戻り値の例
| s1 | s2 | 戻り値 |
|---|---|---|
| { “a”, “p”, “p”, “l”, “e” } | { “a”, “p”, “p”, “l”, “e” } | 1 |
| { “a”, “p”, “p”, “l”, “e” } | { “a”, “p”, “r”, “i”, “l” } | 0.4 |
| { “a”, “p”, “p”, “l”, “e” } | { “m”, “e”, “l”, “o”, “n” } | 0 |
| { “a”, “p”, “p”, “l”, “e” } | { “p”, “e”, “n” } | −1 |
○ 実数型: simRatio(文字型の配列: s1, 文字型の配列: s2)
整数型: i, cnt ← 0
if (s1の要素数 ≠ s2の要素数)
return −1
endif
for (i を 1 から s1の要素数 まで 1 ずつ増やす)
if (【 】)
cnt ← cnt + 1
endif
endfor
return cnt ÷ s1の要素数 /* 実数として計算する */
解答群
ア s1[i] ≠ s2[cnt] イ s1[i] ≠ s2[i] ウ s1[i] = s2[cnt] エ s1[i] = s2[i]
本番さながらの環境で解いてみたい方はこちら↓
解説
正解は エ s1[i] = s2[i] です。
①解答群を整理
解答群を整理すると、以下の2点が問われています。
=か≠かs2[i]かs2[cnt]か
②【 】が真のとき何が起こるか
IF の中の処理は cnt ← cnt + 1。つまり【 】が真のときに cnt を1増やす、とわかります。
③cnt が何を指すかを式と照合
cnt は最後に return cnt ÷ s1の要素数 で使われています。
問題文より、戻り値は「要素番号が同じ要素の文字同士が一致する要素の組の個数 ÷ s1 の要素数」なので、この式と照らし合わせます。
| 問題文 | 要素番号が同じ要素の文字同士が一致する要素の組の個数 ÷ s1の要素数 |
|---|---|
| プログラム | cnt ÷ s1の要素数 |
cnt は「要素番号が同じ要素の文字同士が一致する組の個数」に該当します。
つまり「要素番号が同じ位置で文字が一致」したときに cnt を増やせばよいので、条件は s1[i] = s2[i]、合致する選択肢は エ です。
Point: プログラム全体を理解する必要はない
正解さえ分かれば、表の全例や「要素数が異なる場合は −1」がプログラムのどこに対応するか、までは追わなくて構いません。正解することが目的。情報の取捨選択は実務でも大切です。
Memo: 式と解答群を同時に見える状態に
式読解は、式と解答群を 同時に見える状態 にすると格段に解きやすくなります。本番の CBT 画面はズームや欄幅調整ができるので、スクロールを減らしてから解き始めましょう。
関連リンク

関連動画
式の読解の基礎が学べる、同じ章の動画です。
講座の全動画はこちら(プレイリスト)。

