問題(令和8年 問67)
手続sortは,要素数が2以上の整数型の配列を引数numberArrayで受け取り,その要素を昇順に並べ替えた結果を出力する。手続sort の動作確認のために,処理の途中でjの値とworkArrayの全ての要素を出力する。配列numberArrayを{3, 5, 1, 2,4}とし,手続sortをsort(numberArray)として呼び出したとき, jの値が3と出力された直後のworkArrayの全ての要素の出力はどれか。ここで,配列の要素番号は1から始まる。
| {プログラム} | 説明 | ||||||||
| 〇sort (整数型の配列: numberArray) | |||||||||
| 整数型: minIndex, j, k | 変数として minlndex, j, kを使う | ||||||||
| 整数型の配列: workArray← numberArray // 配列の複製を作る | |||||||||
| for (j を1から(workArrayの要素数ー1)まで1ずつ増やす) | workArrayの要素が5個あるので、j=1から4まで繰り返す | ||||||||
| // j番目から末尾までの要素の中で最も小さい値をもつ要素の要素番号を //一つ求める | 繰り返し処理で行う処理の説明 | ||||||||
| minlndex← j | jの値をminlndexに代入する | ||||||||
| for (kを(j+ 1)から workArrayの要素数まで 1ずつ増やす) | workArrayの要素が5個あるので、k=j+1から5まで繰り返す | ||||||||
| if (workArray[k]がworkArray[minlndex]より小さい) | workArray[k]がworkArray[minlndex]より小さいとき | ||||||||
| minlndex← k | kの値をminlndexに代入する | ||||||||
| end if | 判別処理の終了 | ||||||||
| end for | 繰返し処理の終了 | ||||||||
| workArray[j]とworkArray[minlndex]の値を入れ替える | |||||||||
| //動作確認のために, jの値とworkArrayの全ての要素を出力する | 途中経過確認の処理を説明 | ||||||||
| jの値を出力する | 繰返し処理の段階を示している | ||||||||
| workArrayの全ての要素を先頭から順にコンマ区切りで出力する | workArrayの出力(途中経過) | ||||||||
| end for | 繰返し処理の終了 | ||||||||
| workArrayの全ての要素を先頭から順にコンマ区切りで出力する | workArrayの出力(最終結果) | ||||||||
ア 1, 2, 3, 4, 5
イ 1, 2, 3, 5, 4
ウ 4, 5, 3, 2, 1
エ 5, 4, 3, 2, 1
解き方(令和8年 問67)
問題の要点を読み取る
はじめに、問題文から、次のことを読み取ります。
| 問題文 | → | 読み取れること | |
| 手続sortは,要素数が2以上の整数型の配列を(2)引数numberArrayで受け取り,(1)その要素を昇順に並べ替えた結果を出力する。手続sort の動作確認のために,処理の途中でjの値と(3)workArrayの全ての要素を出力する。配列(4)numberArrayを{3, 5, 1, 2,4}とし,手続sortをsort(numberArray)として呼び出したとき,(5) jの値が3と出力された直後のworkArrayの全ての要素の出力はどれか。ここで,配列の要素番号は1から始まる。 | (1)手続sort: 入力した数字の並びを、昇順(小→大)に並べ替えて出力するプログラム | ||
| (2)手続sortの入力(引数): numberArray | |||
| (3)手続sortの出力(戻り値): workArray | |||
| (4)(5)この問題で求めるもの: 入力{3, 5, 1, 2,4}について、 j=3のときの、workArrayの数字の並び (ただし、jが何を示すか、問題文に説明なし) | |||
プログラム処理のおおよそをつかむ
次に、プログラムが何をしているのか、処理のおおよそをつかみましょう。
プログラム中のfor~end for、出力などの用語を手がかりにして、かんたんな図で表すと、処理がわかりやすくなります。
図から「j は、並べ替えのために繰り返す回数」と読み取れます。
| {プログラム} | 説 | ||||||||
| 〇sort (整数型の配列: numberArray) | |||||||||
| 整数型: minIndex, j, k | |||||||||
| 整数型の配列: workArray← numberArray // 配列の複製を作る | |||||||||
| for (j を1から(workArrayの要素数ー1)まで1ずつ増やす) | |||||||||
| // j番目から末尾までの要素の中で最も小さい値をもつ要素の要素番号を //一つ求める | |||||||||
| minlndex← j | |||||||||
| for (kを(j+ 1)から workArrayの要素数まで 1ずつ増やす) | |||||||||
| if (workArray[k]がworkArray[minlndex]より小さい) | |||||||||
| minlndex← k | |||||||||
| end if | |||||||||
| end for | |||||||||
| workArray[j]とworkArray[minlndex]の値を入れ替える | |||||||||
| //動作確認のために, jの値とworkArrayの全ての要素を出力する | |||||||||
| jの値を出力する | |||||||||
| workArrayの全ての要素を先頭から順にコンマ区切りで出力する | |||||||||
| end for | |||||||||
| workArrayの全ての要素を先頭から順にコンマ区切りで出力する | |||||||||
手続 sortの動作をイメージする
さらに、詳しくプログラムを見ると、2つのfor~end for(背景色:黄と背景色:青)とIF文(背景色:赤)があることに気が付きます。
頭の中で、動画のような動作をイメージしましょう。
問題演習を重ねると、頭の中でイメージできるようになります。
プログラムの確認
手続 sortについて、おおよそのイメージがわかったので、プログラムを一行ごとに確認しましょう。
| プログラム | 説明 | ||||||||
| 〇sort (整数型の配列: numberArray) | 手続sortに配列numberArrayを入力する | ||||||||
| 整数型: minIndex, j, k | 変数として minlndex, j, kを使う | ||||||||
| 整数型の配列: workArray← numberArray // 配列の複製を作る | numberArrayの値をworkArrayにコピーする | ||||||||
| for (j を1から(workArrayの要素数ー1)まで1ずつ増やす) | workArrayの要素が5個あるので、j=1から4まで繰り返す | ||||||||
| // j番目から末尾までの要素の中で最も小さい値をもつ要素の要素番号を //一つ求める | 繰り返し処理で行う処理の説明 | ||||||||
| minlndex← j | jの値をminlndexに代入する | ||||||||
| for (kを(j+ 1)から workArrayの要素数まで 1ずつ増やす) | workArrayの要素が5個あるので、k=j+1から5まで繰り返す | ||||||||
| if (workArray[k]がworkArray[minlndex]より小さい) | workArray[k]がworkArray[minlndex]より小さいとき | ||||||||
| minlndex← k | kの値をminlndexに代入する | ||||||||
| end if | 判別処理の終了 | ||||||||
| end for | 繰返し処理の終了 | ||||||||
| workArray[j]とworkArray[minlndex]の値を入れ替える | |||||||||
| //動作確認のために, jの値とworkArrayの全ての要素を出力する | 途中経過確認の処理を説明 | ||||||||
| jの値を出力する | 繰返し処理の段階を示している | ||||||||
| workArrayの全ての要素を先頭から順にコンマ区切りで出力する | workArrayの出力(途中経過) | ||||||||
| end for | 繰返し処理の終了 | ||||||||
| workArrayの全ての要素を先頭から順にコンマ区切りで出力する | workArrayの出力(最終結果) | ||||||||
プログラムを追って、出力を確認する
最後に、プログラムを追って出力を確認します。
j=1のとき
| j | k | minlndex | 条件:workArray[k]が workArray[minlndex]より小さい | |||||
| 1 | 2 (j+ 1から 始める) | 1 (minlndex← j から始める) | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 3(小) | 5(大) | 1 | 2 | 4 | ||||
| ← 偽 → | ||||||||
| 1 | 3 (kを1増やした) | 1 | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 3(大) | 5 | 1(小) | 2 | 4 | ||||
| ←――― 真 ―――→ | ||||||||
| 1 | 4 | 3 (minlndex← k を実行した) | ||||||
| 1 | 4 (kを1増やした) | 3 | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 3 | 5 | 1(小) | 2(大) | 4 | ||||
| ← 偽 → | ||||||||
| 1 | 5 (kを1増やした) | 3 | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 3 | 5 | 1(小) | 2 | 4(大) | ||||
| ← ―――偽 ―ー-→ | ||||||||
| 1 | 5 | 3 | → 要素を 入替 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 3 ↓ 1 | 5 | 1 ↓ 3 | 2 | 4 | ||||
| 1 | 5 | 3 | 途中経過 出力 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 5 | 3 | 2 | 4 | ||||
jは1なので1を足して、もう一度、for~end for(背景色:青)実行します。
j=2のとき
| j | k | minlndex | 条件:workArray[k]が workArray[minlndex]より小さい | |||||
| 2 | 3 (j+ 1から 始める) | 2 (minlndex← j から始める) | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 5(大) | 3(小) | 2 | 4 | ||||
| ← 真 → | ||||||||
| 2 | 3 | 3 (minlndex← k を実行した) | ||||||
| 2 | 4 (kを1増やした) | 3 | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 5 | 3(大) | 2(小) | 4 | ||||
| ← 真 → | ||||||||
| 2 | 4 | 4 (minlndex← k を実行した) | ||||||
| 2 | 5 (kを1増やした) | 4 | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 5 | 3 | 2(小) | 4(大) | ||||
| ← 偽 → | ||||||||
| 2 | 5 | 4 | → 要素を 入替 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 5 ↓ 2 | 3 | 2 ↓ 5 | 4 | ||||
| 2 | 5 | 4 | 途中経過 出力 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 2 | 3 | 5 | 4 | ||||
jは2なので1を足して、さらに、for~end for(背景色:青)実行します。
j=3のとき
| j | k | minlndex | 条件:workArray[k]が workArray[minlndex]より小さい | |||||
| 3 | 4 (j+ 1から 始める) | 3 (minlndex← j から始める) | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 2 | 3(小) | 5(大) | 4 | ||||
| ← 偽 → | ||||||||
| 3 | 5 (kを1増やした) | 3 | → 要素を 比較 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 2 | 3(小) | 5 | 4(大) | ||||
| ←――― 偽 ―――→ | ||||||||
| 3 | 5 | 3 | → 要素を 入替 (変化なし) | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 2 | 3 ↓ 3 | 5 | 4 | ||||
| 3 | 5 | 3 | 途中経過 出力 | workArray[1] | workArray[2] | workArray[3] | workArray[4] | workArray[5] |
| 1 | 2 | 3 | 5 | 4 | ||||
jの値が3と出力されました。
求めるのは、このときのworkArrayの値です。
よって、正解は イ です。
説

コメント