令和6年試験問題 [科目B]問4

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
次の記述中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。

 関数 merge は,昇順に整列された整数型の配列 data1 及び data2 を受け取り,これらを併合してできる昇順に整列された整数型の配列を返す。
 関数 merge を merge({2,3},{1,4})として呼び出すと,/*** α ***/ の行は 

〔プログラム〕
b04_1.png

  • 実行されない
  • 1回実行される
  • 2回実行される
  • 3回実行される
正解 問題へ
分野:アルゴリズムとプログラミング
カテゴリ:データ構造及びアルゴリズム
解説
プログラムは3つのwhile文から成り立っています。

最も重要なのは1つ目のwhile文で、ここでは引数の2つの配列(data1、data2)の値を比較して小さいほうを 配列 work に代入することを繰り返します。そして、どちらかが末尾まで達した時点でループを抜けます。
2つ目と3つ目のwhile文は、後処理のようなもので、最初のwhile文でどちらかの配列が最後まで処理された後、もう一方の配列に残っている値を配列 work に追加する処理を行っています。

merge({2,3},{1,4})を呼び出した場合、具体的には次のように処理されていきます。

まず、各変数は以下のように初期化されます。
  1. n1 ← 2
  2. n2 ← 2
  3. work ← {未定義, 未定義, 未定義, 未定義}
  4. i ← 1
  5. j ← 1
  6. k ← 1
//1つ目のループ
  1. ●iが2以下 かつ jが2以下 である間、繰り返す
  2. data1[1] = 2 ≦ data2[2] = 1 はfalse
    work[1] に data2[1] = 1 を代入 //work{1, 未定義, 未定義, 未定義}
    j ← j + 1 //j = 2
    k ← k + 1 //k = 2
  3. data1[1] = 2 ≦ data2[2] = 4 はtrue
    work[2] に data1[1] = 2 を代入 //work{1, 2, 未定義, 未定義}
    i ← i + 1 //i = 2
    k ← k + 1 //k = 3
  4. data1[2] = 3 ≦ data2[2] = 4 はtrue
    work[3] に data1[2] = 3 を代入 //work{1, 2, 3, 未定義}
    i ← i + 1 //i = 3
    k ← k + 1 //k = 4
  5. i=3で、2より大きくなったのでループを抜ける
//2つ目のループ
  1. ●iが2以下である間、繰り返す
  2. i=3で、2より大きいので1回も実行されない
//3つ目のループ
  1. ●jが2以下である間、繰り返す
  2. work[4] に data2[2] = 4 を代入 //αの行 work{1, 2, 3, 4}
    j ← j + 1 //j = 3
    k ← k + 1 //k = 5
  3. j=3で、2より大きくなったのでループを抜ける
戻り値として配列 work を返してプログラムは終了

したがってαの行は「1回実行される」が適切です。

Pagetop