ITパスポート 過去問
令和8年度
問67 (テクノロジ系 問13)

このページは閲覧用ページです。
履歴を残すには、 「新しく出題する(ここをクリック)」 をご利用ください。

問題

ITパスポート試験 令和8年度 問67(テクノロジ系 問13) (訂正依頼・報告はこちら)

手続sortは、要素数が2以上の整数型の配列を引数numberArrayで受け取り、その要素を昇順に並べ替えた結果を出力する。手続sortの動作確認のために、処理の途中での値とworkArrayの全ての要素を出力する。配列numberArrayを{3、5、1、2、4}とし、手続sortをsort(numberArray)として呼び出したとき、jの値が3と出力された直後のworkArrayの全ての要素の出力はどれか。ここで、配列の要素番号は1から始まる。

[プログラム]
◯sort(整数型の配列:numberArray)
 整数型:minIndex, j, k
 整数型の配列:workArray ← numberArray//配列の複製を作る
 for(jを1から(workArrayの要素数−1)まで1ずつ増やす)
  //j番目から末尾までの要素の中で最も小さい値をもつ要素の要素番号を
  //一つ求める
  minIndex ← j
  for(kを(j+1)からworkArrayの要素数まで1ずつ増やす)
   if(workArray[k]がworkArray[minIndex]より小さい)
    minIndex ← k
   endif
  endfor
  workArray[j]とworkArray[minIndex]の値を入れ替える

  //動作確認のために、jの値とworkArrayの全ての要素を出力する
  jの値を出力する
  workArrayの全ての要素を先頭から順にコンマ区切りで出力する
 endfor
 workArrayの全ての要素を先頭から順にコンマ区切りで出力する
  • 1,2,3,4,5
  • 1,2,3,5,4
  • 4,5,3,2,1
  • 5,4,3,2,1

正解!素晴らしいです

残念...

この過去問の解説 (3件)

01

この手続は、未整列部分から最小値を選び、先頭側へ順に移す選択ソートです。j回目の処理後には、先頭からj個の要素が小さい順に確定します。

選択肢1. 1,2,3,4,5

j=3の処理後には先頭3要素の1、2、3までは確定しますが、末尾の4と5はまだ入れ替わっていないため、この並びにはなりません。

選択肢2. 1,2,3,5,4

正しいです。初期値3,5,1,2,4から、j=1で1,5,3,2,4、j=2で1,2,3,5,4となります。j=3では未整列部分3,5,4の最小値が既に3なので、1,2,3,5,4のままです。

選択肢3. 4,5,3,2,1

この並びは小さい値を先頭へ移す選択ソートの途中結果になっておらず、昇順に確定していく先頭部分とも一致しません。

選択肢4. 5,4,3,2,1

これは降順の並びであり、最小値を先頭から順に置くこの手続の動作と反対です。

まとめ

各周回で未整列部分の最小値をj番目に置くと追跡します。

参考になった数3

02

設問の関数を順を追って見ていきます。

 

まず、for文 jが1から4まで繰り返します(workArrayの要素数が5のため)

 minIndex に j をセットする → minIndex=1、j=1

 次のfor文 kが2から5まで繰り返します(workArrayの要素数が5のため)

  workArray[2]:5 が workArray[1]:3 より小さい →小さくないため処理をスキップ

  workArray[3]:1 が workArray[1]:3 より小さい →小さい

   minindex に k をセットする → minIndex=3

  workArray[4]:2 が workArray[3]:1 より小さい →小さくないため処理をスキップ

  workArray[5]:4 が workArray[3]:1 より小さい →小さくないため処理をスキップ

 内側のfor文が終了

 workArray[j] と workArray[minIndex] を入れ替える

 → workArray[1]:3 と workArray[3]:1を入れ替えるため

   workArrayは、[1、5、3、2、4] となり、この時は j=1 です。

 

次に、外側のfor文 jが2の場合

 minIndex に j をセットする → minIndex=2、j=2

 for文 kが3から5まで繰り返します(workArrayの要素数が5のため)

  workArray[3]:3 が workArray[2]:5 より小さい →小さい

   minindex に k をセットする → minIndex=3

  workArray[4]:2 が workArray[3]:3 より小さい →小さい

   minindex に k をセットする → minIndex=4

  workArray[5]:4 が workArray[4]:2 より小さい →小さくないため処理をスキップ

 内側のfor文が終了

 workArray[j] と workArray[minIndex] を入れ替える

 → workArray[2]:5 と workArray[4]:2を入れ替えるため

   workArrayは、[1、2、3、5、4] となり、この時は j=2 です。

次に、外側のfor文 jが3の場合

 minIndex に j をセットする → minIndex=3、j=3

 for文 kが4から5まで繰り返します(workArrayの要素数が5のため)

  workArray[4]:5 が workArray[3]:3 より小さい →小さくないため処理をスキップ

  workArray[5]:4 が workArray[3]:3 より小さい →小さくないため処理をスキップ

 内側のfor文が終了

 workArray[j] と workArray[minIndex] を入れ替える

 → workArray[3]:3 と workArray[3]:3を入れ替えるが、結果としてそのままです。

   workArrayは、[1、2、3、5、4] となり、この時は j=3 です。


よって、j=3のあとに表示されるのは、[1、2、3、5、4]になります。
 

選択肢1. 1,2,3,4,5

不正解です。

選択肢2. 1,2,3,5,4

正解です。

選択肢3. 4,5,3,2,1

不正解です。

選択肢4. 5,4,3,2,1

不正解です。

参考になった数1

03

本問ではプログラムの読み取りが問われています。

まず、設問より「手続sortは、要素数が2以上の整数型の配列を引数numberArrayで受け取り、その要素を昇順に並べ替えた結果を出力する。」とあるので、設問でのプログラムでは数字を昇順(小さい順)に並べ替えるプログラムを作りたい、と読めます。

 

プログラムでは

for(jを1から(workArrayの要素数−1)まで1ずつ増やす)
  //j番目から末尾までの要素の中で最も小さい値をもつ要素の要素番号を一つ求める

とあります。

jは今何回目の作業をしているかを数える箱とイメージできるので、

1〜(workArrayの要素数−1)の回数分操作を繰り返すと表現されています。

今回は{3、5、1、2、4}を並べ替えるので、要素の数は5個となり、1〜4回まで操作を繰り返す、と言う意味になります。

「j番目から末尾までの要素の中で最も小さい値をもつ要素の要素番号を一つ求める」

とあるので、

1回目の操作では、1番目から末番までの中で一番小さい数を1番目に

2回目の操作では、2番目から末番までの中で一番小さい数を2番目に…

と操作を繰り返すと言う意味になります。

 

実際に{3、5、1、2、4}を並び替えることを考えましょう。

1回目の操作では、1番目から末番までの中で一番小さい数を1番目に

 →並び順は1番小さい1が1番目に来るので 1、3、5、2、4

2回目の操作では、2番目から末番までの中で一番小さい数を2番目に

 →並び順は2〜5番目のなかで1番小さい2が2番目に来るので 1、2、3、5、4

3回目の操作では、3番目から末番までの中で一番小さい数を3番目に

 →並び順は3〜5番目のなかで1番小さい3が3番目に来るので 1、2、3、5、4となります。

 

以上より、「1,2,3,5,4」の選択肢が正答となります。

参考になった数0