// google adsence用 電験3種過去問【2020年機械 問18】 | 電気主任技術者のいろは

電験3種過去問【2020年機械 問18】

2022年4月24日

【情報処理】配列の数値を並べ替えるプログラム処理《正誤問題》

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

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

\(\small{\begin{array}{cccc}
&(ア)&(イ)&(ウ)\\
\hline(1)&a[i]>a[j] & a[j]←a[i] & a[i]←m\\
\hline(2)&a[i]>a[j] & a[i]←a[j] & a[j]←m\\
\hline(3)&a[i]<a[j] & a[j]←a[i] & a[i]←m\\
\hline(4)&a[i]<a[j] & a[j]←a[i] & a[j]←m\\
\hline(5)&a[i]<a[j] & a[i]←a[j] & a[j]←m\\
\hline\end{array}}\)

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

(1)3
(2)5
(3)7
(4)8
(5)10

解答と解説はこちら

解答 

(a)の解答:(5)
(b)の解答:(3)

解説

(a)バブルソートと呼ばれる、基本的な並べ替えプログラムである。

大きい順に並べ替えるプログラムであるので、

配列a[1]と、配列a[2]~a[n]までを比較し、a[1]が小さければ比較した配列との値を入替える。

次に、配列a[2]と、配列a[3]~a[n]までを比較し、a[2]が小さければ比較した配列との値を入替える。

これを最後まで繰り返すことで、大きい順に配列の数値を並べ替えることができる。

(ア)部分のa[i]とa[j]を比較( i < j )した時、X部の処理、つまりa[i]とa[j]の値の入替え処理が行われるのは

a[i]がa[j]より小さいとき、すなわちa[i]<a[j]の時である。

(イ)は前処理で\(\fbox{m ← a[i]}\)が行われており、a[i]の値は退避用メモリmへ退避されているので、a[i]←a[j]の処理が行われるのが適切である。

(ウ)は前処理で\(\fbox{a[i] ← a[j]}\)が行われたので、a[j]←mの処理を行い、a[i]とa[j]の値の入替え処理が完了する。

(b)

初期状態(i=j=0),n=5, a[1]~a[5]が読み込まれた状態。

\(\small{\begin{array}{cc|c|c|c|c|c}
\hline i&j&a[1]&a[2]&a[3]&a[4]&a[5]\\
\hline0&0&3&1&2&5&4\\
\hline\end{array}}\)

プログラム実行時のa[1]~a[5]の状態

a[i]<a[j]であれば、\(\bbox[yellow, 5pt, border: 2px dotted red]{Xを実行}\)してa[i]とa[j]を入替える、

a[i]>a[j]であれば、\(\fbox{何もせず}\)次の処理(j←j+1)を実行。

i=1,j=2~5まで実行

\(\small{\begin{array}{cc|c|c|c|c|c}
\hline i&j&a[1]&a[2]&a[3]&a[4]&a[5]\\
\hline1&2&\fbox{3}&\fbox{1}&2&5&4\\
\hline1&3&\fbox{3}&1&\fbox{2}&5&4\\
\hline1&4&\bbox[yellow, 5pt, border: 2px dotted red]{5}&1&2&\bbox[yellow, 5pt, border: 2px dotted red]{3}&4\\
\hline1&5&\fbox{5}&1&2&3&\fbox{4}\\
\hline\end{array}}\)

i=2,j=3~5まで実行

\(\small{\begin{array}{cc|c|c|c|c|c}
\hline i&j&a[1]&a[2]&a[3]&a[4]&a[5]\\
\hline2&3&5&\bbox[yellow, 5pt, border: 2px dotted red]{2}&\bbox[yellow, 5pt, border: 2px dotted red]{1}&3&4\\
\hline2&4&5&\bbox[yellow, 5pt, border: 2px dotted red]{3}&1&\bbox[yellow, 5pt, border: 2px dotted red]{2}&4\\
\hline2&5&5&\bbox[yellow, 5pt, border: 2px dotted red]{4}&1&2&\bbox[yellow, 5pt, border: 2px dotted red]{3}\\
\hline\end{array}}\)

i=3,j=4~5まで実行

\(\small{\begin{array}{cc|c|c|c|c|c}
\hline i&j&a[1]&a[2]&a[3]&a[4]&a[5]\\
\hline3&4&5&4&\bbox[yellow, 5pt, border: 2px dotted red]{2}&\bbox[yellow, 5pt, border: 2px dotted red]{1}&3\\
\hline3&5&5&4&\bbox[yellow, 5pt, border: 2px dotted red]{3}&1&\bbox[yellow, 5pt, border: 2px dotted red]{2}\\
\hline\end{array}}\)

i=4,j=5まで実行

\(\small{\begin{array}{cc|c|c|c|c|c}
\hline i&j&a[1]&a[2]&a[3]&a[4]&a[5]\\
\hline4&5&5&4&3&\bbox[yellow, 5pt, border: 2px dotted red]{2}&\bbox[yellow, 5pt, border: 2px dotted red]{1}\\
\hline\end{array}}\)

したがって、\(\bbox[yellow, 5pt, border: 2px dotted red]{X}\)の実行処理は7回行われていることがわかる。