サンプル問題 科目B 問3

問題

次の記述中の [ ] に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。 
 
関数 makeNewArray は,要素数 2 以上の整数型の配列を引数にとり,整数型の配列を返す関数である。関数 makeNewArray を makeNewArray({3, 2, 1, 6, 5, 4})として呼び出したとき,戻り値の配列の要素番号 5 の値は [ ] となる。 
 
〔プログラム〕 
○整数型の配列: makeNewArray(整数型の配列: in) 
  整数型の配列: out ← {}  // 要素数0の配列 
  整数型: i, tail 
  outの末尾 に in[1]の値 を追加する 
  for (i を 2 から inの要素数 まで 1 ずつ増やす) 
  tail ← out[outの要素数
  outの末尾 に (tail + in[i]) の結果を追加する 
  endfor 
  return out 

 

解答群 
ア:5  イ:6  ウ:9  エ:11  オ:12
カ:17  キ:21

出典:基本情報技術者試験 サンプル問題 科目B

解き方

プログラムを見てもゴチャゴチャして分かりにくいので、人間がCPUの代わりになって、1ステップずつ実行してみます。

次の表はその様子を示します。#はステップ番号、iとかtailとかoutは変数の値です。色が赤くなっているところは、値が変化したところです。

#1 初期化

まず、配列outを初期化します。

#2 配列outの末尾に追加

以下のループで必要になる値である配列in[1]を、配列outに追加しておきます。

#3 配列inの要素数だけループする

入力された配列inの要素数だけループします。ただし、in[1]は#2で処理済みなので、in[2]から処理するよう、ループ制御変数iの初期値は2にしています。

#4 配列outの末尾の値を取得

変数tailに配列outの末尾の値を代入します。

#5 配列outの末尾に追加

配列outの末尾に、tail + in[2]を追加します。

tailの値がどこから来たか考えると、#4で配列outの末尾を代入していて、この配列outの末尾は#2でin[1]を代入しています。

つまり、tail + in[2] = in[1] + in[2] です。

#6~8 ループ2週目

ループの2週目で、#8で配列outの末尾にやはり値を追加します。

この値は、tail(#5で配列outに追加した値) + in[3] = (in[1] + in[2]) + in[3]になります。

#9~11 ループ3週目

#11で配列outの末尾に追加します。

tail=in[1] + in[2] + in[3]なので、追加するのは (in[1] + in[2] + in[3]) + in[4]になります。

どうやら、このプログラムで行うことが分かってきました。

#12~14 ループ4週目

#14で配列outの末尾に追加します。

追加するのは (in[1] + in[2] + in[3] + in[4]) + in[5]になります。

#15~17 ループ5週目

ループ制御変数iの値が配列inの要素数と等しくなるので、これがループの最後です。

#17で配列outの末尾に追加します。

追加するのは (in[1] + in[2] + in[3] + in[4] + in[5]) + in[6]になります。

答え

ここまで分かって、最後に追加したのは21だから答えは21でキ、と回答すると間違いです。

問題をよく見ると、戻り値の配列の要素番号5の値を問われているので、out[5]=17です。

つまり、答えはカ