基本情報技術者過去問題 平成27年春期 午後問8 設問1 解説

問題文は他のサイトを別ウインドウで開いてご覧ください。

プログラムの1行目で要求されている引数を用意します。

まずはプログラムに入力する数値を集めます。
このプログラムは1行目で x[ ]、n、k を要求しています。
すべて揃わないとプログラムは動作しません。
設問1の値を利用します。

引数
x[1 2 3 4 5 6 7] n k
3 5 6 4 7 2 1 7 3



初期値を設定します。

3行目 Top←1
4行目 Last←n なので Last は 7

表1
Top Last
1 7

6行目 Pivot←x[k] なので Pivot は 6
7行目 i←Top なので i は 1
8行目 j←Last なので j は 7

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 6 4 7 2 1 6 1 7




1回目

10行目で X[1] すなわち 3 と Pivot すなわち 6 を比べるのですがこれは頭の中で行います。
結果はTrueです。

11行目 i←i + 1 は書き換えなので表に書き込みます。

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 6 4 7 2 1 6 1 7
2

10行目に戻って x[2] すなわち 5 と Pivot すなわち 6 を比べます。
Trueなので i を書き換えます。

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 6 4 7 2 1 6 1 7
2
3

10行目に戻って x[3] と Pivot を比べます。
Falseなのでループを抜けます。

13行目 Pivot と x[7] を比べます。
Falseなのでループを抜けます。

16行目はFalseなので17行目は実行しません。

19から21行目は三角交換です。
x[ i ] と x[ j ] を交換します。
書き換えなので表に書き込みます。

22行目、i に 1 を足します。
23行目、j から 1 を引きます。
書き換えなので表に書き込みます。

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 6 4 7 2 1 6 1 7
2
3
3 5 1 4 7 2 6 4 6

10行目に戻って x[4] と Pivot を比べます。
Trueなので i を書き換えます。

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 6 4 7 2 1 6 1 7
2
3
3 5 1 4 7 2 6 4 6
5

10行目に戻って x[5] と Pivotを比べます。
Falseなのでループを抜けます。

13行目 Pivot と x[6] を比べます。
Falseなのでループを抜けます。

16行目はFalseなので17行目は実行しません。

19から21行目は三角交換です。
x[ i ] と x[ j ] を交換します。
書き換えなので表に書き込みます。

22行目 i に 1 を足します。
23行目 j から 1 を引きます。
書き換えなので表に書き込みます。

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 6 4 7 2 1 6 1 7
2
3
3 5 1 4 7 2 6 4 6
5
3 5 1 4 2 7 6 6 5

10行目に戻って x[6] と Pivot を比べます。
Falseなのでループを抜けます。

13行目 Pivot と x[5] を比べます。
Falseなのでループを抜けます。

16行目はtrueなので17行目でループからbreakします。

25行目 i と k を比べます。
Falseなので26行目は実行しません。

28行目 k と j を比べます。
Trueなので29行目を実行します。

Last が 5 になりました。




2回目の初期値

表1
Top Last
1 5

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 1 4 2 7 6 1 1 5

よって設問1の「a」は「ア」です。




2回目

内側のループの1回目でできる表はこうなります。

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 1 4 2 7 6 1 1 5
4
3
1 5 3 4 2 7 6 2 2

さてここが問題の部分です。
さっきと同じであとはループをBreakするだけだろうと思い込み、トレースを省略してしまうと誤回答してしまいます。
プログラムには無駄な行は一行もないので、省略できる処理はありません。全部やりきる覚悟が必要です。

では処理を見てみましょう。
10行目に戻って x[2] と Pivot を比べます。
Falseなのでループを抜けます。

13行目 Pivot と x[2] を比べます。
True!! なので j を書き換えます。

表2
x[1 2 3 4 5 6 7] Pivot i j
3 5 1 4 2 7 6 1 1 5
4
3
1 5 3 4 2 7 6 2 2
1

13行目に戻って Pivot と x[1] を比べます。
Falseなのでループを抜けます。

16行目はtrueなので17行目でループからbreakします。

25行目 i と k を比べます。
Trueなので26行目を実行します。

28行目 k と j を比べます。
Falseなので29行目は実行しません。

Top が 2 になりました。

3回目の初期値

表1
Top Last
2 5

表2
x[1 2 3 4 5 6 7] Pivot i j
1 5 3 4 2 7 6 3 2 5

よって設問1の「b」は「ウ」です。
設問はこれで終了ですが、処理を続けます。



3回目

10行目 x[2] と Pivot を比べます。
Falseなのでループを抜けます。
13行目 Pivot と x[5] を比べます。
Falseなのでループを抜けます。

16行目はFalseなので17行目は実行しません。

19から21行目は三角交換です。
x[i] と x[j] を交換します。
22行目、i に 1 を足す。
23行目、j から 1 を引く。

表2
x[1 2 3 4 5 6 7] Pivot i j
1 5 3 4 2 7 6 3 2 5
1 2 3 4 5 7 6 3 3 4

10行目 x[3] と Pivot を比べます。
Falseなのでループを抜けます。
13行目 Pivot と x[4] を比べます。
Trueなので j から 1 を引く。

表2
x[1 2 3 4 5 6 7] Pivot i j
1 5 3 4 2 7 6 3 2 5
1 2 3 4 5 7 6 3 3 4
3

13行目 Pivot と x[3] を比べます。
Falseなのでループを抜けます。

16行目はtrueなので17行目でループからbreakします。

25行目 i と k を比べます。
Trueなので26行目を実行します。

28行目 k と j を比べます。
Trueなので29行目を実行します。

Top が 4 、Last が 2 になりました。

4回目の初期値

表1
Top Last
4 2

5行目の Top<Last がFalseなのでLoopを抜けます。

32行目 x[k] をreturnします。

x[k] は「3」なので、7個のデータの中で3番目に小さい値は「3」です。


ホームに戻るボタン↓