基本情報技術者試験過去問 令和8年度(2026年)科目B問1
次のプログラム中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
-----------
〔プログラム〕
整数型の配列: data ← {1, 2, 3, 4, 5, 6, 7, 8, 9}
整数型: top, i
整数型: len ← dataの要素数
top ← data[len]
for (i を )
data[i] ← data[i - 1]
endfor
data[1] ← top
-----------
選択肢
- ア:2からlen - 1まで1ずつ増やす
- イ:2からlenまで1ずつ増やす
- ウ:len - 1から2まで1ずつ減らす
- エ:lenから2まで1ずつ減らす
- ア
- イ
- ウ
- エ
正解と解き方・学習ポイント(AI解説)
このプログラムは、配列の末尾の値を変数topに退避してから、各要素を1つ右の位置へコピーし、最後に先頭data[1]へ退避した値を入れる処理です。代入文 data[i] ← data[i - 1] は、左の要素の値を右の要素へ移す操作なので、前から順に実行すると移動元が先に上書きされます。上書きを避けて正しく右にずらすには、iをlenから2まで1ずつ減らす順序で繰り返します。
Point
この問題は、配列の要素をずらす処理において、代入による上書きが起きないようにするためのfor文の回し方(開始値、終了値、増減方向)を理解しているかを確認するものです。
解くために必要な知識
この問題を解くには、配列の要素を代入でずらすときに、ループ方向を誤ると上書きが発生することを理解している必要があります。
用語の整理
| 用語 | 意味 |
|---|---|
| 配列 | 同じ型の値を複数まとめ、要素番号で参照できるデータ構造です。 |
| 要素番号 | 配列の位置を表す番号です。この問題では1から始まります。 |
| len | 配列 data の要素数です。 |
| for文 | 指定した範囲のiについて繰り返し処理を行う構文です。 |
代入文 data[i] ← data[i - 1] が意味すること
代入の方向
- data[i] に data[i - 1] を入れるので、値は左から右へ移動します。
上書きが起きる条件
- 同じ配列の中で、移動元(data[i - 1])が先に書き換わると、元の値を使えなくなります。
正しく右にずらすためのfor文の考え方
原則
- data[i] ← data[i - 1] のように、左の要素を右へコピーする場合は、iを大きい方から小さい方へ動かすのが原則です。
この問題で必要なiの範囲
-
data[len] ← data[len - 1] から data[2] ← data[1] までが必要です。
-
したがって i は len から 2 まで、1ずつ減らします。
問題の解法手順
解く手順
1. 何をしたい処理かを確認します
-
top ← data[len] で末尾要素を退避しています。
-
for文の中の data[i] ← data[i - 1] で、各要素を1つ右へ移します。
-
data[1] ← top で、退避した末尾要素を先頭に入れます。
2. 代入の向き(右へコピー)を確認します
-
data[i] ← data[i - 1] は、i番目に(i-1)番目の値を入れます。
-
つまり、(i-1)番目の値をi番目へ移すので、配列全体として右方向へのシフトになります。
3. 前から処理すると上書きが起きることを確認します
-
iを2から増やすと、先に data[2] が data[1] で上書きされます。
-
その後の data[3] ← data[2] では、元のdata[2]ではなく、上書き後のdata[2]が使われます。
-
このため、正しいシフトになりません。
4. 後ろから処理する範囲を決めます
-
必要な代入は、data[len] ← data[len - 1] から始まり、data[2] ← data[1] までです。
-
よって i は len から 2 まで、1ずつ減らすのが適切です。
選択肢ごとの解説
- ア:不正解
iを2からlen-1まで増やすと、i=2でdata[2]が更新された後、i=3で参照するdata[2]が元の値ではなくなります。またi=lenを処理しないため、data[len] ← data[len-1]が実行されず、末尾の更新が不足します。
- イ:不正解
iを2からlenまで増やすと範囲は満たしますが、前から順にdata[i] ← data[i-1]を実行するため、参照元が先に上書きされます。例えばdata[2]を更新した後にdata[3]でdata[2]を参照すると、元のdata[2]ではなく更新後の値を読んでしまいます。
- ウ:不正解
iをlen-1から2まで減らす方向は上書き防止としては適切ですが、i=lenを処理しないためdata[len] ← data[len-1]が実行されません。その結果、末尾までのシフトが完了しません。
- エ:正解
iをlenから2まで1ずつ減らすことで、末尾から順に data[i] ← data[i-1] を実行できます。参照元が先に書き換えられないため上書きの影響を避けられ、配列を正しく1つ後ろにずらせます。
まとめ
このプログラムは、配列の末尾の値を変数topに退避してから、各要素を1つ右の位置へコピーし、最後に先頭data[1]へ退避した値を入れる処理です。代入文 data[i] ← data[i - 1] は、左の要素の値を右の要素へ移す操作なので、前から順に実行すると移動元が先に上書きされます。上書きを避けて正しく右にずらすには、iをlenから2まで1ずつ減らす順序で繰り返します。
iを2からlen-1まで増やすと、i=2でdata[2]が更新された後、i=3で参照するdata[2]が元の値ではなくなります。またi=lenを処理しないため、data[len] ← data[len-1]が実行されず、末尾の更新が不足します。
iを2からlenまで増やすと範囲は満たしますが、前から順にdata[i] ← data[i-1]を実行するため、参照元が先に上書きされます。例えばdata[2]を更新した後にdata[3]でdata[2]を参照すると、元のdata[2]ではなく更新後の値を読んでしまいます。
iをlen-1から2まで減らす方向は上書き防止としては適切ですが、i=lenを処理しないためdata[len] ← data[len-1]が実行されません。その結果、末尾までのシフトが完了しません。
iをlenから2まで1ずつ減らすことで、末尾から順に data[i] ← data[i-1] を実行できます。参照元が先に書き換えられないため上書きの影響を避けられ、配列を正しく1つ後ろにずらせます。