電験マンのブログ

電験三種の過去問の回答・解説を掲載します。

電験三種 R2(2020年).機械 問18

[問題]
図は n 個の配列の数値を大きい順(降順)に並べ替えるプログラムのフローチャートである。次の(a)及び(b)の問に答えよ。

(a) 図中の(ア)~(ウ)に当てはまる処理の組合せとして,正しいものを次の(1)~(5)のうちから一つ選べ。



(b) このプログラム実行時の読込み処理において, n=5 とし, a[1]=3 , a[2]=1 , a[3]=2 , a[4]=5 , a[5]=4 とする。フローチャート中の X で示される部分の処理は何回行われるか。
正しいものを次の(1)~(5)のうちから一つ選べ。



[解説・回答]
プログラムに関する問題ですね。電験と関係あるんかとツッコミを入れたくなる問題です。

(a)
(ア)
フローチャートでひし形はある条件による分岐を示します。
このプログラムは配列の数値を降順に並べ替えるものですので、 a[i] <  a[j]のときに入れ替える必要があります。
従って、(ア)は a[i] <  a[j]となります。

(イ)(ウ)
(ア)で a[j]の方が大きかった際の分岐です。
手前の  m←a[i]が何を示しているかというと、 mという変数に、 a[i]を代入しています。
次に、降順に並べるために、 a[i]に a[j]の値を代入します。
その次に、 a[j]に mを代入することで、 a[i]と a[j]の値を入れ替えています。
とうことで、(イ)は a[i]← a[j]、(ウ)は a[j]← mとなります。

(b)
まずは、Xの後の処理を解説します。
jに+1をしていますが、ここではj+1がnより大きいかどうか判断しています。
NOなら繰り返し計算、YESなら下に進みます。
NOの場合は、配列の中で、 a[1]を固定して、 a[2]から a[5]まで a[1]との大小を比較していきます。

j+1がnを超えると、次にi+1とし、n-1との比較をしています。
つまり、ここでは、、 a[2]を固定して、 a[3]から a[5]と比較していきます。
iがn-1を超えるとプログラムの最後まで進み、出力します。

以上を纏めると、このプログラムでは、2つの数値を順番に比較して、左側の方が右側より小さければ入れ替えるという動作を行っています。
全ての比較を記載すると、合計10回となります。

1. a[1]と a[2]の比較
2. a[1]と a[3]の比較
3. a[1]と a[4]の比較
4. a[1]と a[5]の比較
5. a[2]と a[3]の比較
6. a[2]と a[4]の比較
7. a[2]と a[5]の比較
8. a[3]と a[4]の比較
9. a[3]と a[5]の比較
10. a[4]と a[5]の比較

では答えは10かというと、そうはなりません。
Xの処理は、左側の方が右側より小さい場合にのみ発生します。
つまり、上の10回の比較の内、左側の方が右側より小さい場合の回数が答えとなります。

プログラムを順番に見ていきます。
1. a[1 = 3]と a[2 = 1]:Xの処理は発生しない。
2. a[1 = 3]と a[3 = 2]:Xの処理は発生しない。
3. a[1 = 3]と a[4 = 5]:Xの処理発生(1回目)。 a[1 = 5]、 a[4 = 3]
4. a[1 = 5]と a[5 = 4]:Xの処理は発生しない。
5. a[2 = 1]と a[3 = 2]:Xの処理発生(2回目)。 a[2 = 2]、 a[3 = 1]
6. a[2 = 2]と a[4 = 3]:Xの処理発生(3回目)。 a[2 = 3]、 a[4 = 2]
7. a[2 = 3]と a[5 = 4]:Xの処理発生(4回目)。 a[2 = 4]、 a[5 = 3]
8. a[3 = 1]と a[4 = 2]:Xの処理発生(5回目)。 a[3 = 2]、 a[4 = 1]
9. a[3 = 2]と a[5 = 3]:Xの処理発生(6回目)。 a[3 = 3]と a[5 = 2]
10. a[4 = 1]と a[5 = 2]:Xの処理発生(7回目)。 a[4 = 2]と a[5 = 1]

ということで、Xの処理は7回発生します。

答え:(3)