今回は令和4年度下期 機械科目 B問題18を解説します。30件分の使用電力量データについて、配列d[30]から最大値と平均値を出力するプログラムの流れ図(第1図)の空欄(ア)〜(エ)を求める(a)と、30件のデータを大きい順(降順)に並べ替える流れ図(第2図)の空欄(オ)〜(キ)を求める(b)の2段構成の問題です。
(a)は最大値変数sと合計変数tの初期化、ループの開始位置、最大値更新の判定式という定番パターンです。(b)はバブルソート型の二重ループで、退避用変数wを使った3ステップの値交換処理(w←d[i],d[i]←d[j],d[j]←w)を穴埋めします。
令和4年度下期 機械科目 B問題18:問題文と選択肢
まずは、実際の試験問題を確認してみましょう。

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

出題のポイント:初期化をどこから始めるか
(a)は最大値と平均値を求める流れ図——(ア)と(イ)は連動しているのがポイントです。
| 空欄 | 答え | 意味 |
| (ア) | t←d[1] | ★合計もd[1]で初期化 |
| (イ) | 2 | d[1]は使用済みなのでi=2 から |
| (ウ) | d[i]>s | ★最大値を探すので「大きいか」 |
| (エ) | s←d[i] | 大きければ最大値を更新 |
最大値 s は d[1] で初期化されている——だから合計 t も d[1] からそろえるのが自然です。そうすればループを2 から回すだけで、両方とも正しく求まります。
もし t←0 とするなら、ループは1 から——ところが s は d[1] で初期化済みなので、d[1]>d[1] という無意味な比較が入ります。結果は同じでも、流れ図としては整合しません。
選択肢(1)と(5)は t←0 でループも0 や1——(イ)の値と組み合わせて矛盾します。(ア)と(イ)をセットで見れば、すぐ絞れるのです。


(b) 降順ソートの交換3ステップ
第2図は退避用変数 w を使った値の交換——順序を間違えるとデータが壊れます。
| 空欄 | 答え | 意味 |
| (オ) | d[i]<d[j] | ★降順なので左が小さければ交換 |
| (カ) | d[i]←d[j] | 右の値を左へ |
| (キ) | d[j]←w | 退避した元の左の値を右へ |
すでに w←d[i] は流れ図に書かれています——残りの2ステップを埋めるのが本問です。「退避したら、そこへ何を入れ、退避した値をどこへ戻すか」を追えば決まります。
元の左の値を保存
★左が上書きされる
保存した値を右へ
(カ)を d[j]←d[i] としてしまうと、右の値が消えます——選択肢(1)(3)(5)がこの誤り。矢印の向きを1つずつ確かめることが大切です。

⚠️ よくある間違い
(オ)の不等号を逆にしてしまうのが典型的な誤り——選択肢(4)(5)が d[i]>d[j] です。
「降順に並べたい」=「左のほうが大きくあるべき」——だから左が小さいときが異常で、そこで交換します。
迷ったら小さな例で確かめる——[1, 2] を降順にしたいなら交換が必要。このとき d[i]=1、d[j]=2 で d[i]<d[j]——2つの数だけで向きが確定します。
平均値はどこで計算するか
合計 t を求めた後、30 で割れば平均——ループの外で1回だけ行う処理です。
ループの中で毎回割ってはいけません——まだ合計が完成していないからです。「繰り返しの中でやること」と「終わってからやること」を分けて考えるのが流れ図を読むコツになります。
| 場所 | やること |
| ループの前 | ★初期化(s、t にd[1]) |
| ループの中 | 加算と最大値の更新 |
| ループの後 | ★平均の計算と出力 |
この3つの位置関係が、どのプログラムでも共通——初期化・繰り返し・後処理という型です。流れ図を見たら、まずこの3区画に分けて眺めるとよいでしょう。
30件という規模を実感する
本問は30件の使用電力量データ——電気の実務でよくあるデータ量です。
| 処理 | 回数 |
| (a) 最大値と合計の走査 | 29回(i=2〜30) |
| (b) 降順ソートの比較 | ★30×29÷2=435回 |
最大値を探すだけなら1回なめれば済む——ところが並べ替えとなると435回。15倍近い手間です。
「何がしたいか」で必要な計算量が大きく変わる——最大値だけ知りたいのに並べ替えるのは無駄だということ。本問が(a)(b)を分けて出題している意味もそこにあります。
⏱️ 本番での進め方
①(a) (ア)と(イ)はセット。d[1]で初期化ならループは2 から。
②(ウ)は「大きいか」。最大値探索なので不等号は>。
③(b) 交換は退避→上書き→書き戻し。(カ)は d[i]←d[j]。
④★(オ)の向きは「[1,2]を降順に」で確かめれば一発。
💡 覚え方
「初期化・繰り返し・後処理」の3区画で流れ図を見る——平均の割り算はループの外。そして「降順なら左が小さいとき交換」です。
ほぼ同一の流れ図が平成20年度 B問題18にあります(情報:最大値・平均値と降順ソートの流れ図)。記号の書き方が少し違うだけなので、両方解いておけば形式に慣れます。

選択肢の組合せから絞る
4つの空欄に5つの選択肢——全部を検討せず、確実に分かる欄から潰すのが得策です。
| 確定させる欄 | 正しい値 | 残る選択肢 |
| (ウ) | d[i]>s | ★(2)(4)のみ |
| (ア) | t←d[1] | ★(4)に確定 |
(ウ)の不等号だけで3つ落とせます——最大値を探すのだから「大きいか」。ここは迷いようがありません。
残った(2)と(4)の違いは(ア)だけ——t←0 か t←d[1] か。(イ)が2 なのですから、d[1] は初期化で使われているはず——だから t←d[1] です。
2つの欄を見ただけで答えが出る——4つ全部を検討する必要はありません。「一番自信のある欄から手をつける」のが穴埋め問題の鉄則です。
(b)も同じ手順で
(オ)の不等号で(4)(5)が落ちます——降順なら d[i]<d[j]。残るは(1)(2)(3) です。
次に(カ)を見ると、d[i]←d[j] は(2)だけ——これで確定します。(キ)を確認する前に答えが出るのです。
時間が足りないときほど、この絞り込みが効きます——B問題は(a)(b)で各5点。1問に費やせるのはせいぜい7〜8分だからです。
まとめ
| (a)(ア) | t←d[1] |
| (a)(イ) | 2 |
| (a)(ウ) | d[i]>s |
| (a)(エ) | s←d[i] |
| (b)(オ) | d[i]<d[j] |
| (b)(カ) | d[i]←d[j] |
| (b)(キ) | d[j]←w |
| 答え | (a)-(4),(b)-(2) |
▼あわせて解きたい関連問題
・30件の使用電力量データの最大値・平均値算出と降順ソート(平成20年度の類題):【機械】平成20年度B問題18
・配列を使ったバブルソートのアルゴリズム:【機械】平成29年度B問題18

コメント