プログラムは9行で、for が1つだけ。コードが何をしているかが分かれば解けます。この記事では、配列の中身が1行ごとにどう変わるかを見せながら、それを確かめていきます。
難易度 ★(当サイトの目安)── 同じ足し算を5周するだけ。4段階の決め方は科目B 最短合格の戦略にあります。
出題
出典:基本情報技術者試験 科目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
答えだけ先に見る
正解は カ(17)です。
この問題に出てくる記号
読めない記号があったときだけ開いてください。
擬似言語の記号 6コ の読み方をひらく
| 書き方 | 読み方 |
|---|---|
○整数型の配列: makeNewArray(整数型の配列: in) |
ここから関数が1つ始まるという印。整数の配列を1つ受け取って in という名前を付け、整数の配列を1つ返します |
整数型の配列: out ← {} |
整数の配列 out を用意し、中身が1つも無い状態(要素数0)にする |
in[1] |
配列 in の1番目の要素。要素番号は1から数えます |
outの末尾 に ◯ を追加する |
out のいちばん後ろに ◯ を1つ付け足す。要素数が1つ増えます |
for (i を 2 から inの要素数 まで 1 ずつ増やす)endfor |
i を 2, 3, 4, … と1ずつ増やしながら、あいだの行をくり返す。i が inの要素数 を超えたら終わり |
return out |
out を返して、関数を終える |
記号でつまずいたら、下の教科書から、先にそこだけ読んでください(G4 のような番号は、当サイトの擬似言語の教科書の第何回かを表します)。
コードは何をしているか ── out の後ろに1つずつ付け足す
このプログラムがしているのは、空の配列 out の後ろに、1つずつ値を付け足していくことだけです。in = {3, 2, 1, 6, 5, 4} で、はじめの3回を1行ずつ見ます。
1行ずつ実行すると、out はこう変わる
琥珀=読んだ値 / 緑=付け足した値
① for の前 ── in[1] をそのまま入れる
整数型の配列: out ← {} // 要素数0の配列
整数型: i, tail
outの末尾 に in[1]の値 を追加する
in
13
22
31
46
55
64
out(前)
out{} 空
out(後)
13
out は空で始まり、in の1番目の 3 が、そのまま1番目に入ります。
② i = 2 の周 ── 後ろの 3 に in[2] の 2 を足す
tail ← out[outの要素数]
outの末尾 に (tail + in[i]) の結果を追加する
out(前)
13
変数
tail3
in
13
22
31
46
55
64
out(後)
13
25
outの要素数 は 1 なので、out[1] = いちばん後ろの 3 が tail へ。3 + 2 = 5 を後ろに付け足して、out は2つになりました。
③ i = 3 の周 ── 後ろの 5 に in[3] の 1 を足す
tail ← out[outの要素数]
outの末尾 に (tail + in[i]) の結果を追加する
out(前)
13
25
変数
tail5
in
13
22
31
46
55
64
out(後)
13
25
36
今度は要素数が 2 なので、out[2] = いちばん後ろの 5。5 + 1 = 6 を付け足します。tail が読む場所は、out が伸びるたびに1つ右へずれていきます。
i が 4、5、6 の周も、②③と同じ2行のくり返しです。for の前に1つ入れてあるので、i の値が、その周で作る out の番号になります。問われている5番目は、i が 5 の周でできます。
コードがしていること
tail は out のいちばん後ろの値。それに in[i] を足して、out の後ろへ付け足す ── これを i が 6 になるまでくり返します。
1周ずつ追って、要素番号5 の値を決める
見るのは、光っている行と、in と out の枡、tail の箱です。1周終わるたびに、いちばん下の表に1行ずつ積み上がります。
1行ずつ追う makeNewArray({3, 2, 1, 6, 5, 4})
出典:科目B サンプル問題 問3
ループ開始前
配列
いま計算していること
変数の状態
return で返した配列
トレース表(進めると1行ずつ積み上がります)
できあがった out は {3, 5, 6, 12, 17, 21}。要素番号5 は 17 です。
表を縦に見ると、out の各要素は in を先頭からそこまで足した合計になっています。5番目なら 3 + 2 + 1 + 6 + 5 = 17。毎周、前の合計に次の1つを足して付け足しているので、こうなります。
答え合わせ
要素番号5 の 17 は、解答群の カ です。
取り違えやすいのは エ(11)です。tail を out の最後の値ではなく1つ前の in と読むと、5番目は in[4] + in[5]、つまり 6 + 5 = 11 になります。tail が読んでいるのは out のほうです。
次に読む
この問題でどこに手間取ったかで、行き先が変わります。
この記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

