応用情報技術者 2013年 春期 午前2 問08
問題文
流れ図に示す処理の動作の記述として、適切なものはどれか。ここで、二重線は並列処理の同期を表す。

選択肢
ア:ABC又はACBを実行してデッドロックになる。
イ:AB又はACを実行してデッドロックになる。
ウ:Aの後にBC又はCB, BC又はCB, ・・・と繰り返して実行する。(正解)
エ:Aの後にBの無限ループ又はCの無限ループになる。
🔒 解説は解答すると表示されます
同期による交互実行【午前2解説】
正解の理由
図は上下に二本の平行線で囲まれた並列領域を持ち、各分岐(B と C)は下段からループで上段に戻る経路を備えています。重要なのは、B の上部には左→右、C の上部には右→左の矢印があり、ループで上段に戻ってきた「実行トークン」が上段の接続点で反対側の分岐へ渡される点です。
つまり、A の終了後に並列領域へ入ると、ある分岐が実行され終えるとそのトークンは下段ループを通って上段に戻り、上部の矢印によって相手側の分岐に送られます。これが繰り返されるため、B と C が交互に実行され続ける挙動(ウの記述)が成立します。
つまり、A の終了後に並列領域へ入ると、ある分岐が実行され終えるとそのトークンは下段ループを通って上段に戻り、上部の矢印によって相手側の分岐に送られます。これが繰り返されるため、B と C が交互に実行され続ける挙動(ウの記述)が成立します。
解法ステップ
- 並列領域(上下の二重線)を見つける:ここが分岐と同期の範囲であると認識する。
- 各分岐のループ経路を追う:B・C は下段から上段へ戻るループを持つ。
- 上部の矢印の向きを確認する:B 側の矢印は左→右、C 側の矢印は右→左。
- トークンの移動を具体的に追跡する:一方が終わってループで上段に戻ると、その上段で矢印に従い相手分岐を起動する。
- このサイクルが繰り返されることから、交互実行であると結論づける。
具体例(トークン追跡):
- A 実行 → トークンが左(B)側に進入 → B 実行 → B は下段へ出る → ループで上段左へ戻る → 上部の矢印(左→右)によりトークンが右(C)に渡る → C 実行 → C がループで上段右へ戻る → 上部の矢印(右→左)でトークンが左へ渡る → 以後同様に繰り返し。
(どちらから始まるかは図の接続順で決まりますが、いずれにせよ交互に繰り返されます。)
選択肢別の誤答解説
- ア: 「ABC 又は ACB を実行してデッドロックになる」
誤り。ABC の順に同時に実行して互いに待ち合うという構造はなく、むしろループで戻ったトークンは上部矢印により相手へ渡るためデッドロックにはならない。 - イ: 「AB 又は AC を実行してデッドロックになる」
誤り。単独で AB や AC が止まって互いに待つような閉塞は生じない。上部の矢印がトークンを反対側に送るため、片側だけが永久に止まる構造ではない。 - ウ: 「A の後に BC 又は CB, BC 又は CB, ・・・と繰り返して実行する」
正しい。上段での矢印向きと下段ループにより、実行トークンが分岐間で渡されるため B と C が交互に繰り返される。 - エ: 「A の後に B の無限ループ又は C の無限ループになる」
誤り。各分岐がループで上段に戻るが、上段で相手側へトークンを渡す仕組みがあるため、一方のみが無限に単独実行される構造ではない。
よくある誤解
- 「二重線=必ず同時並列で同時に実行される」
誤り。二重線は並列領域を示しますが、内部の矢印やループ経路により実行トークンの受け渡しが制御され、同時実行にならない場合がある点を見落としやすいです。 - 「ループがある=その分岐が単独で永久に実行される」
誤り。ループで戻る先が相手側の入口へトークンを渡す構成なら、単独ループではなく相互に回るだけです。
補足コラム
この種の図は「トークンモデル」で考えると分かりやすいです。フローチャートの実行を「トークンが線上を移動する」動作として解釈し、分岐・同期・ループの各接続点でトークンがどう振る舞うかを追跡します。特に矢印の方向はトークンの受け渡し先を決めるので、図を見たらまず矢印の向きに沿ってトークンの経路を書き出すと誤りが減ります。
簡単なシミュレーション例(イメージ、左開始で交互実行を示す):
# 擬似シミュレーション(説明用)
steps = []
current = 'B' # A の後、B から開始すると仮定
for i in range(6):
steps.append(current)
# 終了して上段へ戻ると反対側に渡される
current = 'C' if current == 'B' else 'B'
print(steps) # ['B','C','B','C','B','C']
FAQ
Q. 上部の矢印が無ければどうなる?
A. 上部で相手側へ渡す経路がなければ、戻ったトークンは同じ分岐へ入り続ける可能性があり、図の挙動は変わります。矢印の有無・向きは必ず確認してください。
A. 上部で相手側へ渡す経路がなければ、戻ったトークンは同じ分岐へ入り続ける可能性があり、図の挙動は変わります。矢印の有無・向きは必ず確認してください。
Q. A の後で同時に B と C が起動する可能性は?
A. 図の上下の二重線だけだと分岐は並列ですが、ループと上部矢印によりトークンが一方向に移動するため、実行は交互(排他的)に進みます。配線の接続と矢印方向が同時起動か排他かを決めます。
A. 図の上下の二重線だけだと分岐は並列ですが、ループと上部矢印によりトークンが一方向に移動するため、実行は交互(排他的)に進みます。配線の接続と矢印方向が同時起動か排他かを決めます。
関連キーワード: フローチャート、並列処理、同期、トークンモデル、制御フロー、ループ制御、相互排他、実行順序分析

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

