基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成29年 春期 基本情報技術者 午後 問09
問09   C言語

 

 次のCプログラムの説明及びプログラムを読んで,設問1,3に答えよ。

 

 マーク式試験の答案を採点するプログラムである。問題と受験者の解答の例を,図1に示す。

 

図1 問題と受験者の解答の例

 

 ここでは,unsigned int 型のデータは,16 ビットのビット列で表し, 連続する8ビットが全て 0 のときは Ø … Ø,全て 1 のときは 1 … 1 と表記する。

 

〔プログラムの説明〕

(1) 関数 marking は,1回の実行で受験者1人分の答案を採点する。

(2) 関数 marking の引数の仕様は,次のとおりである。ここで,引数の値に誤りはないものとする。

 

 

@ 問の数は,numQ である。引数である各配列の要素数も,numQ である。

A 1間当たりの選択肢の個数は 16 個以下である。

B type[] の各要素には,答えを一つマークする問の場合は 1, 複数個マークする問の場合はマークする個数 n(2 ≦ n ≦ 8)が格納されている。

C ansC[] の各要素は,16 ビットのビット列で,図2の例に示すように, 最上位のビットから1ビットずつ順に選択肢 ,… に対応し, 正答の選択肢に対応するビット位置に1が格納されている。他の全てのビットは 0 である。

D ansE[] の各要素は,ansC[] と同様の形式で,受験者の解答が格納されている。

 

図2 正答及び受験者の解答の格納形式と格納例

 

(3) 関数 marking は,各問(要素番号 i:0, 1, …, nunQ−1)について, 表1に示す解答形式に応じた採点方法で採点する。採点結果は mark[i] に格納する。

 

表1 解答形式に応じた各間の採点方法

 

(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(  ) <=  ) {
            mark[i] = countMarkBits(  );
         }
      }
      /* β */
   }
}

 

設問1  プログラム1中の に入れる正しい答えを, 解答群の中から選べ。

 

a 〜 c に関する解答群 ア 2        イ 3

ウ ansC[i]        エ ansC[i] & ansE[i]

オ ansC[i] l ansE[i]        カ ansE[i]

キ type[i]        ク type[i]+1

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

基本情報技術者試験


設問2  関数 countMarkBits のプログラムを,プログラム2に示す。次の記述中の に入れる正しい答えを,解答群の中から選べ。

 

〔プログラム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 の値は となる。

 コメント /* γ */ を付した行の代入式を,

work = work && (work - 1); と変更して,プログラム2の実行を試みた場合,

 

d に関する解答群 ア ØØØ1 ØØØØ Ø…Ø        イ Ø1ØØ ØØØØ Ø…Ø

ウ Ø1ØØ 1111 1…1        エ 1ØØ1 ØØØØ Ø…Ø

 

e に関する解答群 ア 演算子 && と & とは実行する演算の内容が同じなので,正しい結果を返す

イ 演算子 && はビットごとの論理積を求めることはしないので,誤った結果を返す

ウ 変数 work には実行前の値が保持されたまま変わらないので,無限ループになる

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます

基本情報技術者試験


設問3  次の記述中の に入れる正しい答えを, 解答群の中から選べ。

 解答形式に,順不同形式を追加する。順不同形式とは,答えを一つマークする問が 2問以上連続していて,共通の解答群から答えを選んでいくが,その選択の順序は 入れ替わってもよい形式である。図3の例では,問 21,22,23 の順に 正答 が設定されているが, これを受験者の解答の例のように異なる順序で解答してもよい。 正しい答えが幾つ選択されたかによって,採点結果が決まる。

 

図3 順不同形式の問題,正答及び受験者の解答の例

 

 順不同形式の問題に対する解答を含む答案を採点するために,プログラム1を次のとおり修正した。

(1) プログラム1中のコメント /* α */ の行を,

  unsigned int sunC, sunE:

(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 には値 が格納されている。

 

f に関する解答群

 

g に関する解答群 ア Ø…Ø Ø…Ø       イ ØØØØ 1ØØØ Ø…Ø

ウ Ø1Ø1 ØØØØ Ø…Ø       エ 1ØØ1 1ØØØ Ø…Ø

解答 f ←クリックすると正解が表示されます

解答 g ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]