今回は平成20年度 機械科目 B問題18を解説します。情報34(令和4年度下期B問題18)と同一テーマ・同一アルゴリズム構造の問題で、配列d(30)を使って最大値・平均値を出力する流れ図(図1)の空欄(ア)〜(エ)を求める(a)と、降順に並べ替える流れ図(図2)の空欄(オ)〜(キ)を求める(b)から構成されます。
解き方は情報34と同じ考え方です。(a)は最大値・合計の初期化とループ開始位置、最大値更新の判定式を求め、(b)は単純交換法型の二重ループで退避用変数wを使った3ステップの交換処理を穴埋めします。
平成20年度 機械科目 B問題18:問題文と選択肢
まずは、実際の試験問題を確認してみましょう。

出典:一般財団法人 電気技術者試験センター「平成20年度 第三種電気主任技術者試験」機械科目 B問題18
電験3種 機械科目 【情報】 平成20年度 B問題18
30件分の使用電力量のデータ処理について,次の(a)及び(b)に答えよ。
(a) 図1は,30件分の使用電力量の中から最大値と30件分の平均値を出力する一つのプログラムの流れ図を示す。図1中の(ア),(イ),(ウ)及び(エ)に当てはまる処理として,正しいものを組み合わせたのは次のうちどれか。
(b) 図2は,30件の使用電力量を大きい順(降順)に並べ替える一つのプログラムの流れ図を示す。図2中の(オ),(カ)及び(キ)に当てはまる処理として,正しいものを組み合わせたのは次のうちどれか。
(ア) (イ) (ウ) (エ) (1) d(1)→t 0,k,1 d(i)<s d(i)→s (2) 0→t 2,k,1 d(i)>s d(i)→s (3) d(1)→t 2,k,1 d(i)<s s→d(i) (4) d(1)→t 2,k,1 d(i)>s d(i)→s (5) 0→t 0,k,1 d(i)<s s→d(i)
(オ) (カ) (キ) (1) d(i)<d(j) d(i)→d(j) w→d(j) (2) d(i)<d(j) d(j)→d(i) w→d(j) (3) d(i)<d(j) d(i)→d(j) w→d(i) (4) d(i)>d(j) d(j)→d(i) w→d(j) (5) d(i)>d(j) d(i)→d(j) w→d(i)

出題のポイント:最大値を探すアルゴリズム
(a)は「最大値と平均値を求める」流れ図——定番のアルゴリズムなので、型を覚えておくと確実です。
| 空欄 | 答え | 意味 |
| (ア) | d(1)→t | ★合計の初期値は最初のデータ |
| (イ) | 2, k, 1 | ループは2 から。1 は初期化で使用済み |
| (ウ) | d(i)>s | ★今の値が最大値より大きいか |
| (エ) | d(i)→s | 大きければ最大値を更新 |
最大値を探すには、まず1つめを仮の最大値とする——それより大きいものが出てきたら入れ替える。これを最後まで繰り返せば、真の最大値が残ります。
合計も同じく1つめから始める——だからループは2 番目からになります。0 から始めてループを1 からにしても同じ結果ですが、最大値の初期化には0 は使えません(負の値があると誤る)。
(ウ)の不等号の向きが最大の分かれ目——最大値を探すなら「大きいか」。「小さいか」なら最小値を探すことになります。


(b) 並べ替えと値の交換
2つの変数の値を入れ替える——単純そうで、じつは工夫が要る操作です。
| 手順 | 処理 | 状態 |
| ① | d(i)→w | ★退避(w に逃がす) |
| ② | d(j)→d(i) | d(i) が上書きされる |
| ③ | w→d(j) | 退避した値を戻す |
いきなり d(j)→d(i) とすると、元の d(i) が消えてしまいます——だから先に w へ退避する必要があるのです。
「コップの水を入れ替えるには、3つめのコップが要る」——それと同じ理屈です。退避用の変数を使う3段階が、値の交換の定石になります。
(オ)の判定 d(i)<d(j)は「順序が逆なら入れ替える」という意味。降順に並べたいので、前のほうが小さければ交換 します。

⚠️ よくある間違い
(1)の (カ) d(i)→d(j) は向きが逆——これでは d(j) が消えてしまいます。
矢印の向きを1つずつ確認してください。「→」は右へ代入——d(j)→d(i) なら「d(j) の値を d(i) へ入れる」 です。
実際に3つの箱を書いて、値の動きを追うのが確実。w に退避した値が最後に d(j) へ戻る——これで元の d(i) と d(j) が入れ替わります。
並べ替えアルゴリズムの型
本問の方式は、隣どうしではなく総当たりで比べる形——選択ソートや単純交換法と呼ばれます。
| 方式 | やり方 | 比較回数 |
| 単純交換法(バブルソート) | 隣どうしを比べて交換 | n(n−1)/2 |
| 選択ソート | 最大(最小)を選んで先頭と交換 | n(n−1)/2 |
| クイックソート | 基準値で2組に分けて再帰 | ★n log n(速い) |
二重ループなら比較回数は n2 に比例——30件なら約450回です。データが増えると急激に時間がかかることになります。
だから大量のデータには、より速いアルゴリズムが使われます——クイックソートなら n log n。1万件なら n2 が1億回、n log n なら約13万回——桁違いの差になります。
電験3種で問われるのは基本形——二重ループと値の交換が読めれば十分です。「流れ図が読める」ことが目的だからです。
⏱️ 本番での進め方
①(a) 最大値も合計も1つめで初期化。ループは2 から。
②(ウ) 最大値を探すので「大きいか」。不等号の向きに注意。
③(b) 交換は3手順:退避→上書き→書き戻し。
④ 矢印の向きを1つずつ確認する。逆だとデータが壊れる。
💡 覚え方
「最大値探しは1つめを仮の答えにして更新」——0 から始めてはいけない。そして「交換には3つめの箱が要る」——退避→上書き→書き戻しの3手順です。
同一テーマ・同一アルゴリズムの問題が令和4年度下期 B問題18にあります(情報:最大値・平均値と並べ替えの流れ図)。セットで解いておくと確実です。

流れ図の記号を確認する
流れ図(フローチャート)は記号が決まっています——形を見れば何をする箱か分かるようになっています。
| 記号 | 名前 | 意味 |
| 長円 | 端子 | 開始・終了 |
| 長方形 | 処理 | 計算や代入 |
| ひし形 | ★判断 | YES/NO で分岐 |
| 六角形 | ★ループ端 | 繰り返しの開始と終了 |
| 平行四辺形 | 入出力 | データの読み書き |
本問の(イ)は六角形のループ端——「変数名、初期値、終値、増分」を書くのが決まりです。「2, k, 1」なら「i を2 からk まで1 ずつ」 という意味になります。
増分が1 なら省略されることもあるので、選択肢の書き方に合わせて読む必要があります。
初期値をどう決めるか
最大値の初期値に0 を使ってはいけない——データがすべて負なら、0 が最大値として残ってしまうからです。
| 求めるもの | 安全な初期値 | 0 を使うと |
| 合計 | 0 でよい | 問題なし |
| 最大値 | ★1つめのデータ | 負のデータで誤る |
| 最小値 | ★1つめのデータ | 正のデータで誤る |
「1つめを仮の答えにする」のが最も安全——どんな値が来ても正しく動きます。本問の(ア)がまさにこの形です。
合計は0 から始めてよいのですが、本問は最大値と同じループで処理するため、そろえて1つめからにしています。だからループが2 から始まる——(ア)と(イ)は連動しているのです。
まとめ
| (a)(ア) | d(1)→t |
| (a)(イ) | 2,k,1 |
| (a)(ウ) | d(i)>s |
| (a)(エ) | d(i)→s |
| (b)(オ) | d(i)<d(j) |
| (b)(カ) | d(j)→d(i) |
| (b)(キ) | w→d(j) |
| 答え | (a)-(4),(b)-(2) |
▼あわせて解きたい関連問題
・30件の使用電力量データの最大値・平均値算出と降順ソート(令和4年度下期):【機械】令和4年度下期B問題18
・n個の配列を降順に並べ替えるフローチャートと交換回数:【機械】令和2年度B問題18

コメント