今週の午後問題〔解答〕アルゴリズム 文字列の誤りの検出 2017 年度 秋期

今週の午後問題

このコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています!

今週の午後問題は「文字列の誤りの検出」でしたが、皆さん、手応えはいかがでしょうか?

金曜になりましたので、出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開します。

今週の午後問題
2017 年度 秋期 文字列の誤りの検出

解答と解説

設問 1a

正解

calcCheckCharacter 関数において、論理型の変数 is_even は、変数名から「偶数( even )であるか( is )」を意味していることがわかります。

is_even が空欄 a1 と等しいとき、単に文字の値を足す処理を行っています。説明文に

偶数番目の文字に割り当てた数値は、そのまま全て足し合わせる

とあるので、空欄 a1 は true です。

validateChackCharacter 関数において、論理型の変数 is_odd は、変数名から「奇数( odd )であるか( is )」を意味していることがわかります。

is_odd が空欄 a2 と等しいとき、単に文字の値を足す処理を行っています。説明文に

奇数番目の文字に割り当てた数値は、そのまま全て足し合わせる

とあるので、空欄 a2 は true です。

設問 1b

正解

空欄 b の前にある繰り返し処理で、変数 sum に、説明文の

03. 01 と 02 の結果を足し合わせる

の結果が得られます。

したがって、空欄 b は、説明文の

04. N から 、 03 で求めた総和を N で割った余りを引く。さらにその結果を、 N で割り、余りを求める

に該当します。

したがって、空欄 b は、 (N – sum % N) % N です。

設問 1c

正解

変数 ret_value は、 validateCheckCharacter 関数の戻り値です。空欄 c の条件が true のとき、 ret_value に false が格納されています。

したがって、空欄 c には、検査文字付文字列に誤りがある条件が入ります。説明文に

04. 03 で求めた総和が N で割り切れる場合は、検査文字付文字列に誤りがないと判定する。 N で割り切れない場合は、検査文字付文字列に誤りがあると判定する

とあるので、空欄 c は、 sum % N ≠ 0 です。割り切れないことは、割り算の余りが 0 でないことで判断できます。

設問 2d

正解

説明文に、

複数文字に誤りがある場合には、誤りがないと判定されることがある

とあるので、 ipa␣␣f に対して、複数文字に誤りがある api␣␣f (ケース 2 )、 pia␣␣f (ケース 3 )、 ␣␣apif (ケース 4 )を検証します。

文字
数値
_
0
i
12
p
19
a
4
f
9
api␣␣f (ケース 2 )の検証

f
more_horiz9
more_horiz0 × 2 = 0 、 0 ÷ 30 = 0 あまり 0 、 0 + 0 = 0
more_horiz0
i
more_horiz12 × 2 = 24 、24 ÷ 30 = 0 あまり 24 、 0 + 24 = 24
p
more_horiz19
a
more_horiz4 × 2 = 8 、8 ÷ 30 = 0 あまり 8 、 0 + 8 = 8

すべてを足し合わせると、
9 + 0 + 0 + 24 + 19 + 8 = 60

60 は N = 30 で割り切れるので、誤りがあるのに、誤りがないと判断されます。

pia␣␣f (ケース 3 )の検証

f
more_horiz9
more_horiz0 × 2 = 0 、 0 ÷ 30 = 0 あまり 0 、 0 + 0 = 0
more_horiz0
a
more_horiz4 × 2 = 8 、 8 ÷ 30 = 0 あまり 8 、 0 + 8 = 8
i
more_horiz12
p
more_horiz19 × 2 = 38 、 38 ÷ 30 = 1 あまり 8 、 1 + 8 = 9

すべてを足し合わせると、
9 + 0 + 0 + 8 + 12 + 9 = 38

38 は N = 30 で割り切れないので、誤りがあると適切に判断されます。

␣␣apif (ケース 4 )の検証

f
more_horiz9
i
more_horiz12 × 2 = 24 、 24 ÷ 30 = 0 あまり 24 、 0 + 24 = 24
p
more_horiz19
a
more_horiz4 × 2 = 8 、 8 ÷ 30 = 0 あまり 8 、 0 + 8 = 8
more_horiz0
more_horiz0 × 2 = 0 、 0 ÷ 30 = 0 あまり 0 、 0 + 0 = 0

すべてを足し合わせると、
9 + 24 + 19 + 8 + 0 + 0 = 60

60 は N = 30 で割り切れるので、誤りがあるのに、誤りがないと判断されます。

したがって、誤りがあるのに誤りがないと判断されるのは、ケース 2 とケース 4 です(選択肢オ)。

設問 3e

正解

5 列目を縦に見た ␣s␣␣ という文字列の検査文字を求めます。

more_horiz0 × 2 = 0 、 0 ÷ 2 = 0 あまり 0 、 0 + 0 = 0
more_horiz0
s
more_horiz22 × 2 = 44 、 44 ÷ 30 = 1 あまり 14 、1 + 14 = 15
more_horiz0

すべてを足し合わせると、
0 + 15 + 0 + 0 = 15

30 から、 15 を 30 で割った余りの 15 を引くと、
30 – 15 = 15

この 15 を 30 で割った余りの 15 に対応する l (選択肢ウ)が検査文字になります。

設問 4f

正解

表 4 のケースには、すべて 1 文字以上の誤りがあります。したがって、図 3 の 1 行目に、表 4 のどのケースを入れても、縦方向で 1 文字の誤りが生じる部分が 1 か所以上生じます。

関数 validateCheckCharacter は、誤りが 1 文字であれば、誤りを検出できます。そして、 1 つでも誤りがあると判定された場合は、検査文字列表に誤りがあると判定するのですから、検査文字付表に誤りがないと判定されるケースは、ありません(選択肢カ)。

みんなの解答

ご解答いただいた皆さん、ありがとうございました!

手応えはいかがでしたでしょうか?

 

なお、以下はこの問題の IPA の講評です。今後の参考になれば幸いです。

 問 8 では,検査文字を利用した文字列の誤り検出について出題した。
 設問 1 では, a の正答率は低く,あまり理解されていなかった。プログラムの説明から, is_even の値及び is_odd の値と文字の順番との関係が理解できれば,正答できた。 b , c の正答率は平均的で,おおむね理解されていた。
 設問 2 と設問 3 の正答率は平均的で,おおむね理解されていた。
 設問 4 の正答率は低く,あまり理解されていなかった。いずれのケースでも, “ipa␣␣f” と文字が異なる列位置において,図 3 の縦方向の文字列は,図 2 の縦方向の検査文字付文字列に対して 1 文字誤りがある。このことが分かれば,正答できた。
 実務において,文字列の誤りを検出するプログラムはよく利用されるが,誤りを検出できないケースがあることも理解しておいてほしい。このことを踏まえた上で,用途に応じて適切な検出プログラムを適用する能力が求められるので,身につけておいてほしい。

2022 年度 下期試験向け今週の午後問題はこれで終了です! この連載が過去問題に演習で使われることを願っています !!

label 関連タグ
新制度でも、
午前免除できます。
独習ゼミで科目 A 試験を免除しましょう。
免除試験を受けた 86% の方が、
1 年間の午前免除資格を得ています。
2023 年 春 向けコース
最大 10 % OFF !
info_outline
2023 年 春 向けコース
最大 10 % OFF !
詳しく見てみるplay_circle_filled
label これまでの『今週の午後問題』の連載一覧 label 著者