基本情報技術者試験 科目Bの「令和4年度 サンプル問題 問14」(整列済み配列を要約する findRank・関数から関数の呼び出し)を、図解トレースで解説します。変数iが両方にあるので、区別がつく形でトレースしましょう。
動画で見たい方はこちら▼
問題(令和4年度 サンプル問題 問14)
次の記述中の〔 〕に入れる正しい答えを,解答群の中から選べ。
ここで,配列の要素番号は 1 から始まる。
要素数が 1 以上で,昇順に整列済みの配列を基に,配列を特徴づける五つの値を返すプログラムである。関数 summarize を summarize({0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1}) として呼び出すと,戻り値は〔 〕である。
○実数型: findRank(実数型の配列: sortedData, 実数型: p)
整数型: i
i ← (p × (sortedData の要素数 − 1)) の小数点以下を切り上げた値
return sortedData[i + 1]
○実数型の配列: summarize(実数型の配列: sortedData)
実数型の配列: rankData ← {} /* 要素数0の配列 */
実数型の配列: p ← {0, 0.25, 0.5, 0.75, 1}
整数型: i
for (i を 1 から p の要素数 まで 1 ずつ増やす)
rankData の末尾に findRank(sortedData, p[i]) の戻り値を追加する
endfor
return rankData
解答群
ア {0.1, 0.3, 0.5, 0.7, 1}
イ {0.1, 0.3, 0.5, 0.8, 1}
ウ {0.1, 0.2, 0.3, 0.7, 1}
エ {0.1, 0.3, 0.4, 0.6, 1}
オ {0.1, 0.3, 0.4, 0.7, 1}
カ {0.1, 0.3, 0.4, 0.8, 1}
キ {0.1, 0.4, 0.6, 0.7, 1}
ク {0.1, 0.4, 0.6, 0.8, 1}
本番さながらの環境で解いてみたい方はこちら↓
解説
正解は ク {0.1, 0.4, 0.6, 0.8, 1} です。
①配列表の作成
sortedData
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|
| 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1.0 |
p
| 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| 0 | 0.25 | 0.5 | 0.75 | 1 |
②トレース表の作成
| i | i-f | p |
|---|---|---|
③1周目 i を 1 から p の要素数 まで 1 ずつ増やす
| i (1〜5) | i-f | p |
|---|---|---|
| 1 |
rankData の末尾に findRank(sortedData, p[i]) の戻り値を追加する の findRank(sortedData, p[i]) をトレースします。定義上は findRank(sortedData, p) なので、p に p[i] を代入します。
(なお、pも両方の関数にありますが、片方は配列なのでトレース表上にそのままpで問題ありません)
| i (1〜5) | i-f | p |
|---|---|---|
| 1 | 0 |
(findRank)i ←(p ×(sortedData の要素数 − 1))の小数点以下を切り上げた値
i ←(0 ×(10 − 1))の小数点以下切り上げ
i ← 0
| i (1〜5) | i-f | p |
|---|---|---|
| 1 | 0 |
0 |
(findRank)return sortedData[i + 1]
(summarize)rankData の末尾に findRank(sortedData, p[i]) の戻り値を追加する
なので、
rankData
| 1 |
|---|
0.1 |
④2周目
| i (1〜5) | i-f | p |
|---|---|---|
| 1 | 0 |
0 |
| 2 | 3 |
0.25 |
(findRank)return sortedData[i + 1]
(summarize)rankData の末尾に findRank(sortedData, p[i]) の戻り値を追加する
| 1 | 2 |
|---|---|
0.1 |
0.4 |
⑤3〜4周目
| i (1〜5) | i-f | p |
|---|---|---|
| 1 | 0 |
0 |
| 2 | 3 |
0.25 |
| 3 | 5 |
0.5 |
| 4 | 7 |
0.75 |
rankData
| 1 | 2 | 3 | 4 |
|---|---|---|---|
0.1 |
0.4 |
0.6 |
0.8 |
最後に求めるのは rankData の値です。ここまでで合致するのは ク {0.1, 0.4, 0.6, 0.8, 1} のみです。
関連リンク

関連動画
関数から関数を追う基礎が学べる、同じ章の動画です。
