サンプル問題 科目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です。
つまり、答えはカ