問1 末尾の値を先頭へ移す繰返しの向き

基本情報​技術者試験 令和8年度 公開問題 科目B、全6問のうちの問1。

出典:令和8年度 基本情報技術者試験 公開問題 科目B 問1(プログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。空欄は[  ]で表した)

次のプログラム中の[  ]に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。

次のプログラムは,整数型の配列 data の末尾の要素の値を先頭の要素に移動する。この際,末尾以外の各要素の値は,一つずつ後ろの要素に移動する。

〔プログラム〕
整数型の配列: 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
  1. ア2 から len - 1 まで 1 ずつ増やす
  2. イ2 から len まで 1 ずつ増やす
  3. ウlen - 1 から 2 まで 1 ずつ減らす
  4. エlen から 2 まで 1 ずつ減らす
答えと解説を開く

正解はエです。

末尾の値は先に top に控えてあります。残りの仕事は、data[i] ← data[i - 1] で各要素を 1 つ後ろへずらすことです。前から (i が 2 から) ずらすと、data[2] に data[1] の 1 が入り、次の data[3] には書き換わったばかりの data[2] の 1 が入ります。こうして全部が 1 になってしまいます。後ろから (i が len から 2 まで) ずらせば、まだ書き換えていない値を順に送れます。i は len から始めないと、末尾の要素に data[len - 1] の値が入りません。正解はエです。

ほかの選択肢が違う理由

  • ア前から順にずらすので、data[1] の値が次々に後ろへ写り、data[2] から data[8] まで 1 になります。len まで回らないので末尾の 9 も残り、{9, 1, 1, 1, 1, 1, 1, 1, 9} になります。
  • イ前から順にずらすので、data[1] の値が次々に後ろへ写り、data[2] から data[9] まで全部が 1 になります。
  • ウ後ろから順にずらす向きは合っていますが、len - 1 から始めるので data[len] ← data[len - 1] が行われず、末尾の要素が 9 のまま残ります。

仕組み

配列の中で値をずらすときは、上書きされる側から先に動かします。後ろへずらすなら後ろから、前へずらすなら前から、と覚えると迷いません。

科目B では、値を表に書いて 1 回ずつ追う (トレースする) のが確実です。data が {1, 2, 3} くらいの短い例で、選択肢ごとに 2、3 回だけ回してみると違いが見えます。

この問に出る言葉