プログラミングの基礎(擬似言語のトレース)

÷ は除算で、整数型の変数(引数を含む)に代入するときは小数点以下を切り捨てる。次のプログラムは、昇順に整列された整数型の配列 data(要素番号は1から始まる)で、x 以上の値が最初に現れる要素番号を lo に求める。x は data の最後の要素以下とする。プログラム中の【a】に入れる字句はどれか。

整数型: lo ← 1, hi ← dataの要素数, mid
while (lo < hi)
  mid ← (lo + hi) ÷ 2
  if (data[mid] < x)
    lo ← 【a】
  else
    hi ← mid
  endif
endwhile
  1. Amid
  2. Bmid − 1
  3. Cmid + 1
答えと解説を見る

正解:C. mid + 1

data[mid] < x なら、data[mid] とそれより前の要素はすべて x 未満なので、答えは mid + 1 以降にあります。そうでなければ data[mid] ≧ x で、答えは mid 以前にあるので hi ← mid とします。lo ← mid + 1 なら範囲は毎回確実に狭まり、lo = hi になったところが答えです。lo ← mid にすると、lo と hi が隣り合ったときに mid = lo となり、data[mid] < x なら範囲が狭まらずに繰返しが終わりません。

  • A. lo と hi が隣り合い data[lo] < x のとき、mid = lo のまま範囲が狭まらず、繰返しが終わりません。例えば data = {3, 8, 12, 17, 23, 31}、x = 31 では lo = 5、hi = 6 のまま止まりません。
  • B. 答えより手前に lo を戻してしまい、範囲が狭まらないことがあります。data = {3, 8, 12, 17, 23, 31}、x = 4 では lo が0になり、繰返しが終わりません。
  • C. 正しい。x 未満と分かった mid を範囲から除き、範囲を確実に狭めます。
この分野を解く 分野ページへ

関連する計算ツール

プログラミングの基礎(擬似言語のトレース)の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

プログラミングの基礎(擬似言語のトレース)のほかの問題

  1. 要素数5の整数型の配列 st と整数型の変数 top でスタックを表す。st の要素はすべて0、top は0から始める。push(v) は top に1を加えてから st[top] ← v を行い、pop() は st[top] の値を返してから top から1を引く(st の要素は変えない)。次のプログラムを実行した後の top と st の組はどれか。
  2. 要素数4の文字列型の配列 q を環状に使うキューがある。head と tail の初期値は1で、enq(v) は q[tail] ← v の後に tail ← tail mod 4 + 1 を行い、deq() は q[head] の値を返した後に head ← head mod 4 + 1 を行う。次のプログラムを実行したとき、「E」が格納される q の要素はどれか。
  3. 次のプログラムは、配列 next で要素どうしをつないだ連結リストを、要素番号1の要素から順にたどって出力する。配列の要素番号は1から始まる。next の値0はリストの終わりを表す。出力される値の並びはどれか。
  4. 次のプログラムは、配列 next でつないだ連結リスト A → C → E → D → B の「C」(要素番号3)の直後に、val[6] の「F」を挿入してから、要素番号1の要素から順にたどって出力する。配列の要素番号は1から始まる。next の値0はリストの終わりを表す。出力が A, C, F, E, D, B となるように【a】に入れる処理はどれか。
  5. 制御変数を5ずつ増やす次の for 文を実行した後の c の値はどれか。