平成29年 春期 基本情報技術者 午後 問09
問09 C言語
次のCプログラムの説明及びプログラムを読んで,設問1,3に答えよ。 マーク式試験の答案を採点するプログラムである。問題と受験者の解答の例を,図1に示す。
図1 問題と受験者の解答の例 ここでは,unsigned int 型のデータは,16 ビットのビット列で表し, 連続する8ビットが全て 0 のときは Ø … Ø,全て 1 のときは 1 … 1 と表記する。 〔プログラムの説明〕 (1) 関数 marking は,1回の実行で受験者1人分の答案を採点する。 (2) 関数 marking の引数の仕様は,次のとおりである。ここで,引数の値に誤りはないものとする。
A 1間当たりの選択肢の個数は 16 個以下である。 B type[] の各要素には,答えを一つマークする問の場合は 1, 複数個マークする問の場合はマークする個数 n(2 ≦ n ≦ 8)が格納されている。 C ansC[] の各要素は,16 ビットのビット列で,図2の例に示すように, 最上位のビットから1ビットずつ順に選択肢 ,,… に対応し, 正答の選択肢に対応するビット位置に1が格納されている。他の全てのビットは 0 である。 D ansE[] の各要素は,ansC[] と同様の形式で,受験者の解答が格納されている。
図2 正答及び受験者の解答の格納形式と格納例
(4) 関数 marking から呼ばれる関数 countMarkBits は,引数の値に含まれる 1 のビットの 個数を返却値として返す。 〔プログラム1〕 void marking(int numQ, int type[], unsigned int ansC[], unsigned int ansE[], int mark[]) { int i; /* α */ for (i = Ø; i < numQ; i++) { mark[i] = Ø; if (type[i] == 1) { if (ansE[i] == ansC[i]) { mark[i] = 1; } } else if((2 <= type[i]) && (type[i] <= 8)) { if (countMarkBits( a ) <= b ) { mark[i] = countMarkBits( c ); } } /* β */ } }
a 〜 c に関する解答群 ウ ansC[i] エ ansC[i] & ansE[i] オ ansC[i] l ansE[i] カ ansE[i] キ type[i] ク type[i]+1
〔プログラム2〕 int countMarkBits(unsigned int ans) { int count = Ø; unsigned int work = ans; while (work != Ø) { count++; work = work & (work - 1); /* γ */ } return count; }コメント /* γ */ を付した行の代入式を実行するとき,実行前の work の値が Ø1Ø1 ØØØØ Ø…Ø であれば, 実行後の work の値は d となる。 コメント /* γ */ を付した行の代入式を, d に関する解答群 ウ Ø1ØØ 1111 1…1 エ 1ØØ1 ØØØØ Ø…Ø e に関する解答群 イ 演算子 && はビットごとの論理積を求めることはしないので,誤った結果を返す ウ 変数 work には実行前の値が保持されたまま変わらないので,無限ループになる
図3 順不同形式の問題,正答及び受験者の解答の例 順不同形式の問題に対する解答を含む答案を採点するために,プログラム1を次のとおり修正した。 (1) プログラム1中のコメント /* α */ の行を, (2) プログラム1中のコメント /* β */ の行を,次の 13 行で置き換える。 else if ((11 <= type[i]) && (type[1] <= 13)) { if (type[i] == 11) { sumC = Ø; sumE = Ø; } sumC = sumC | ansC[i]; if (countMarkBits(ansE[i]) == 1) { sumE = sumE | ansE[i]; } if (typeIi] == 13) { mark[i] = countMarkBits(sumC & sumE) ; } } 順不同形式の問を表す type[] の値は,11 〜 13 である。一組の順不同形式の 問題において,値 11 は先頭の問を表し,値 13 は末尾の問を表す。 値 12 は3問以上から成る順不同形式の問題における中間の問を表す。 図3の順不同形式の問題に対する解答を含む答案を,修正したプログラム1で採点する。 ある受験者の解答の採点例として,関数 marking に渡された各配列要素の内容, 及びこれらの内容に基づく採点結果を,図4に示す。
関数 marking に渡された配列の内容及び採点結果 また,図4に示す解答の採点が完了した時点で, 変数 sunE には値 g が格納されている。 f に関する解答群
g に関する解答群 ウ Ø1Ø1 ØØØØ Ø…Ø エ 1ØØ1 1ØØØ Ø…Ø
[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]
©2004-2024 情報処理試験.jp
|
プライバシーポリシー・著作権・リンク
|
お問合わせ
| ||||||