2017年5月8日月曜日

[平成29年度春] 午後 問9解説

[問題文・解答]


平成29年度4月に実施された基本情報技術者試験の午後試験の問題・解答はIPA公式ページからダウンロード出来ます。(以下リンク)

[問題概要]


この問題は、選択問題で問9〜問13のうち1問を選択する必要がありますです。
出題分野はソフトウェア開発(C)で、問題の題材はマーク式試験の答案の採点です。


[設問1]

プログラム1では、関数markingが実装されています。空欄のあるelse if節の部分は、表1の答えを複数個マークする問の部分の処理に相当します。表1によると、ansE[i]中の1のビットの個数がn+1個以上ならば0、n個以下ならばansC[i]とansE[i]の対応するビットが共に1である個数をmark[i]に格納します。また、nはtype[i]に格納されています。

a,b) P.42(4)より関数countMarkBitsは引数の値に含まれる1のビットの個数を返す関数であり、a,bの行ではansE[i]中の1のビットの個数がn個以下かどうかを判定する部分です。
従って、aには「ansE[i]」、bには「type[i]」が当てはまります。

c) cの行では、ansC[i]とansE[i]の対応するビットが共に1である個数をmark[i]に代入しています。ここで、ビット演算子&を用いることでansC[i]とansE[i]の各ビットを比較し、ともに1である部分のみ1となる値が求められます。その値をcountMarkBitsの引数とすることでmark[i]に代入すべき値が求められるので、cには「ansC[i] & ansE[i]」が当てはまります。

[答] a) カ b) キ c) エ

[設問2]

d) プログラム2では関数countMarkBitsが実装されています。γの行では、workに含まれる1のビットのうち最も位の小さいビットを0にして、workを更新しています。最初にwork引数ansで初期化し、この処理を繰り返しながら、workが0となるまでカウントアップしていくことで、ansに含まれる1のビットの個数が求められます。
workが0101 0000 0…0の時のγの行の実行時の各値は以下の通りです。
work:0101 0000 0…0
work-1:0100 1111 1…1
work & (work-1):0100 0000 0…0
よって、実行後のworkは「0100 0000 0…0」となります。

e) &&は論理積を求める演算子であるため、求めている結果とは異なる結果を返すため「イ」が正解です。

[答] d) イ e) イ

[設問3]

f) P.45(2)のプログラムを見れば分かるように、markに値を代入するのはtype[i]が13の時つまり順不同形式の末尾の問に対してのみです。従って、type[i]が11、12の場合はmark[i]は0となるため、図4のmark[20]及びmark[21]は0となります。
次の末尾の問には、順不同形式の問全体の正解数を代入します。図4のansCを見ると、正解は右から2,4,5ビット目となります。一方、ansEを見るとansE[20]とansE[21]はいずれも5ビット目を解答しているため、正解数としては1問となります。ansE[22]は選択肢を2つ選んでいるため無効解答扱いとなります(P.45(2)のif(countMarkBits)〜の部分)
よって、mark[22]には1が入るため、「ア」が正解です。

g) 採点完了時点のsumEには有効な解答の部分のみ1となっているため、右から5ビット目のみ1で、他は全て0となります。よって「イ」が正解です。

[答] f) ア g) イ

上記の解説は問題と解答を元に自分なりの考え方を記述しており、間違っている部分もあるかと思いますので、ご了承願います。また、誤りについては正しい考え方をご指摘・ご教授頂けると助かります。

0 件のコメント:

コメントを投稿