《機械》〈情報伝送及び処理〉[H29:問18]アルゴリズムに関する論説問題

【問題】

【難易度】★★★★★(難しい)

図のフローチャートで表されるアルゴリズムについて,次の(a)及び(b)の問に答えよ。変数は全て整数型とする。
このアルゴリズム実行時の流込み処理において,\(n=5\)とし,\(a[1]=2\),\(a[2]=3\),\(a[3]=8\),\(a[4]=6\),\(a[5]=5\)とする。

(a) 図のフローチャートで表されるアルゴリズムの機能を考えて,出力される\(a[5]\)の値を求めよ。その値として正しいものを次の(1)~(5)のうちから一つ選べ。

 (1) 2  (2) 3  (3) 5  (4) 6  (5) 8

(b) フローチャート中のXで示される部分の処理は何回行われるか。正しいものを次の(1)~(5)のうちから一つ選べ。

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

【ワンポイント解説】

アルゴリズムの問題でパズルゲームを解いているような問題です。ただし,問題を解くのにかなりの時間を要する上,ケアレスミスも発生しやすい問題なので,90分しかない試験時間でこの問題は選択しない方が良いと思います。

【解答】

(a)解答:(5)
下記プログラムの青字の通り,出力される\(a[5]\)は\(8\)となります。
(b)解答:(1)
下記プログラムの赤字の通り,Xの回数は3回です。

図1のように各プロセスに番号をつけ,アルゴリズムに沿って解いていきます。
①\(n\)を「読込み」します。⇒\(n=5\)
②\(a[1]~a[n]\)を「読込み」します。⇒\(a[1]=2\),\(a[2]=3\),\(a[3]=8\),\(a[4]=6\),\(a[5]=5\)
③\(i\)を\(1\)とします。⇒\(i=1\)
④\(j\)を\(i+1\)とします。⇒\(j=2\)
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[1]=2<a[2]=3\)なのでNOへ
⑦\(j\)を\(j+1\)とします。⇒\(j=3\)
⑧\(j>n\)かどうかを確認します。⇒\(j=3<n=5\)なのでNOへ
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[1]=2<a[3]=8\)なのでNOへ
⑦\(j\)を\(j+1\)とします。⇒\(j=4\)
⑧\(j>n\)かどうかを確認します。⇒\(j=4<n=5\)なのでNOへ
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[1]=2<a[4]=6\)なのでNOへ
⑦\(j\)を\(j+1\)とします。⇒\(j=5\)
⑧\(j>n\)かどうかを確認します。⇒\(j=5=n=5\)なのでNOへ
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[1]=2<a[5]=5\)なのでNOへ
⑦\(j\)を\(j+1\)とします。⇒\(j=6\)
⑧\(j>n\)かどうかを確認します。⇒\(j=6>n=5\)なのでYESへ
⑨\(i\)を\(i+1\)とします。⇒\(i=2\)
⑩\(i>n-1\)かどうかを確認します。⇒\(i=2<n-1=4\)なのでNOへ
④\(j\)を\(i+1\)とします。⇒\(j=3\)
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[2]=3<a[3]=8\)なのでNOへ
⑦\(j\)を\(j+1\)とします。⇒\(j=4\)
⑧\(j>n\)かどうかを確認します。⇒\(j=4<n=5\)なのでNOへ
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[2]=3<a[4]=6\)なのでNOへ
⑦\(j\)を\(j+1\)とします。⇒\(j=5\)
⑧\(j>n\)かどうかを確認します。⇒\(j=5=n=5\)なのでNOへ
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[2]=3<a[5]=5\)なのでNOへ
⑦\(j\)を\(j+1\)とします。⇒\(j=6\)
⑧\(j>n\)かどうかを確認します。⇒\(j=6>n=5\)なのでYESへ
⑨\(i\)を\(i+1\)とします。⇒\(i=3\)
⑩\(i>n-1\)かどうかを確認します。⇒\(i=3<n-1=4\)なのでNOへ
④\(j\)を\(i+1\)とします。⇒\(j=4\)
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[3]=8>a[4]=6\)なのでYESへ
⑥\(m\)を\(a[i]\)として\(a[i]\)を\(a[j]\)として\(a[j]\)を\(m\)とします⇒\(a[3]=6\),\(a[4]=8\)
⑦\(j\)を\(j+1\)とします。⇒\(j=5\)
⑧\(j>n\)かどうかを確認します。⇒\(j=5=n=5\)なのでNOへ
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[3]=6>a[5]=5\)なのでYESへ
⑥\(m\)を\(a[i]\)として\(a[i]\)を\(a[j]\)として\(a[j]\)を\(m\)とします⇒\(a[3]=5\),\(a[5]=6\)
⑦\(j\)を\(j+1\)とします。⇒\(j=6\)
⑧\(j>n\)かどうかを確認します。⇒\(j=6>n=5\)なのでYESへ
⑨\(i\)を\(i+1\)とします。⇒\(i=4\)
⑩\(i>n-1\)かどうかを確認します。⇒\(i=4=n-1=4\)なのでNOへ
④\(j\)を\(i+1\)とします。⇒\(j=5\)
⑤\(a[i]>a[j]\)かどうかを確認します。⇒\(a[4]=8>a[5]=6\)なのでYESへ
⑥\(m\)を\(a[i]\)として\(a[i]\)を\(a[j]\)として\(a[j]\)を\(m\)とします⇒\(a[4]=6\),\(a[5]=8\)
⑦\(j\)を\(j+1\)とします。⇒\(j=6\)
⑧\(j>n\)かどうかを確認します。⇒\(j=6>n=5\)なのでYESへ
⑨\(i\)を\(i+1\)とします。⇒\(i=5\)
⑩\(i>n-1\)かどうかを確認します。⇒\(i=5>n-1=4\)なのでYESへ
⑪\(a[1]~a[n]\)を「出力」します。⇒\(a[1]=2\),\(a[2]=3\),\(a[3]=5\),\(a[4]=6\),\(a[5]=8\)