流れ図の基本構造とループの終了条件
順次・選択・繰返しの3つの基本構造を見分け、流れ図のループが「何回まわって、どの値で止まるか」を自分で数えられるようになる。総和・階乗の流れ図の空欄補充と誤り訂正、代入文のトレースを自力で解ける。
流れ図の読解は、科目Aのアルゴリズム問題と科目Bの擬似言語の土台になる。業務で言えば、仕様書の処理フローを読んで「この条件で本当に最後のデータまで処理されるか」を確かめる作業と同じ。
このレッスンで稽古する(用語チェック・過去問)結論:プログラムの流れは3種類の部品だけで書ける
構造化プログラミングとは、処理の流れを 順次・選択・繰返し の3つだけで組み立てる書き方のこと。昔のプログラムは「好きな行へ飛ぶ命令(goto)」を乱用して読めなくなったため、流れを3つの型に絞って読みやすくした。
料理のレシピにたとえると、「切る→炒める」と順に進む(順次)、「辛いのが好きなら唐辛子を入れる」と分かれる(選択)、「焼き色がつくまで混ぜ続ける」とくり返す(繰返し)の3つで、どんなレシピも書ける。
| 基本構造 | 意味 | 流れ図での見え方 |
|---|---|---|
| 順次 | 上から順に1つずつ実行する | 長方形の処理が縦に並ぶ |
| 選択 | 条件によって進む道を変える | ひし形の判定から道が分かれ、先で合流する |
| 繰返し | 条件を判定しながら同じ処理をくり返す | 判定(またはループ端)から上に戻る線がある |
再帰(関数が自分自身を呼び出すこと)は基本構造に入らない。試験ではここが一番のひっかけになる。
「構造化」と他のプログラミング手法の見分け方
「順次・選択・繰返しだけを使う手法はどれか」と聞かれたら、答えは 構造化プログラミング。他の手法名は、制御の流れではなく別の考え方を表している。
| 手法 | 中心になる考え方 |
|---|---|
| 構造化プログラミング | 制御の流れを順次・選択・繰返しの3つに限る |
| 関数型プログラミング | 処理を「入力から出力を返す関数」の組合せで書く |
| 論理型プログラミング | 事実と規則を書き、答えは推論で導かせる |
| 並列プログラミング | 複数の処理を同時に進める |
選択と繰返しの種類
選択と繰返しには、それぞれ細かい種類がある。試験では種類の名前と中身を入れ替えた選択肢が出る。
| 用語 | 正しい意味 | よくあるウソの説明 |
|---|---|---|
| 双岐選択 | 条件で 2つ の道のどちらかへ進む(if〜else) | 「前の処理に戻るか次へ進むか選ぶ」→ 戻るのは繰返し |
| 多岐選択 | 条件の値で 3つ以上 の道のどれか1つへ進む(switch) | 「2つ以上の処理を並列に行う」→ 選ぶのは1つだけ |
| 前判定繰返し | 本体の前で判定する。最初から終了条件が成り立っていれば(継続条件が成り立たなければ)、本体を 0回 実行して抜ける | 「必ず1回は実行する」→ それは後判定 |
| 後判定繰返し | 本体の後で判定する。本体を実行してから判定するので、最低1回 は実行する | 「先頭で判定する」→ それは前判定 |
覚え方:「前判定は0回あり、後判定は最低1回」。判定のひし形が本体の上にあるか下にあるかを見る。
ループ問題の核心:判定の条件は「続ける条件」か「やめる条件」か
ループの判定には2つの書き方がある。継続条件は「成り立つあいだ続ける」条件、終了条件は「成り立ったら抜ける」条件で、向きが正反対になる。
基本情報の流れ図では、ひし形の Yes(または >)が「終了」へつながっている ことが多い。この場合、空欄 a に入るのは 終了条件 なので、「どうなったら止めたいか」を書く。
| 判定の種類 | 成り立ったとき | 例(1〜Nを数える i) |
|---|---|---|
| 継続条件 | ループを続ける | i ≦ N |
| 終了条件 | ループを抜ける | i > N |
継続条件と終了条件は、ちょうど否定の関係になる(i ≦ N の否定が i > N)。
境界を1つずらすひっかけを、小さい数で潰す
ループ問題の選択肢は、たいてい 境界が1つずつずれた 条件(<N、=N、>N、>N+1 など)が並ぶ。頭の中で考えるより、N=3 などの小さい数で実際に1周ずつ書き出す(トレース) のが一番速くて確実。
トレースとは、変数の値が1行ごとにどう変わるかを表に書いて追うこと。確かめるポイントは次の3つ。
- 初期値:合計を入れる変数(累積変数)は 0 から、掛け算を重ねる変数は 1 から始まっているか
- 最後の値:N(またはM)まで、ちょうど足し込まれて/掛け込まれているか
- 余分な1回:N+1 まで足したり掛けたりしていないか
flowchart TD
A["開始"] --> B["0→x, 1→i"]
B --> C{"i > N ?"}
C -->|"Yes"| E["終了"]
C -->|"No"| D["x+i→x"]
D --> F["i+1→i"]
F --> C
上は1〜Nの総和を求める 前判定 ループ。判定が本体(x+i→x)より前にあり、Yes が終了へつながるので、空欄は終了条件 i > N になる。
誤り訂正問題:まず初期値を疑う
「総和を求める流れ図に誤りがある。どう直すか」という問題では、ループの条件より先に 初期値 を確認する。合計用の変数を 1 で始めると、正しい合計より 1 多くなる。
たとえば 1〜100 の総和は 5,050 だが、x を 1 から始めると 5,051 になる。家計簿の合計欄に最初から「1円」書いてあるのと同じで、そこから正しく足していっても答えがずれる。
代入文のトレース:「→」の左の値は、その時点の値
「x+y→x」は「x+y を計算して、その結果を x に入れる」という意味の 代入 で、矢印の先が書き換わる変数になる。次の行では、書き換わった後の x を使う。
加算と減算の3行だけで、x と y の値を入れ替えられる(作業用の変数を使わない交換)。途中の x を元の値 A のまま計算してしまうのが典型的なミス。1行ごとに x と y の値を表に書いて追えば間違えない(下の例題参照)。
前判定ループ:1〜Nの総和の空欄 a
ア i = N
イ i < N
ウ i > N
エ x > N
出典:基本情報技術者試験 科目A免除 修了試験 20151220 実施分 問8
解き方と答えを見る
- 流れ図を確認する:0→x、1→i の後に判定 a があり、Yes なら終了、No なら x+i→x、i+1→i をして判定に戻る。判定が本体より前にあるので前判定、Yes が終了なので a は終了条件。
- N=3 で、正しい答え x=1+2+3=6 になる条件を探す。
- ウ「i>N」で試す:i=1 → 1>3 は No → x=0+1=1、i=2。
- i=2 → 2>3 は No → x=1+2=3、i=3。
- i=3 → 3>3 は No → x=3+3=6、i=4。
- i=4 → 4>3 は Yes → 終了。x=6 で正しい。
- ア「i=N」で試す:i=1、2 では No で x=3、i=3 になる。i=3 → 3=3 は Yes で終了し、3 を足す前に抜けるので x=3(誤り)。
- イ「i<N」で試す:i=1 → 1<3 が Yes で即終了し、x=0(誤り)。
- エ「x>N」は回数ではなく合計を N と比べており、意味が合わない。
答え:ウ:i>N(i が N を超えたときに抜ける)
後判定ループ:階乗を一致させる条件 a
ア n<M
イ n>M-1
ウ n>M
エ n>M+1
出典:基本情報技術者試験 科目A免除 修了試験 20220612 実施分 問10
解き方と答えを見る
- 左の流れ図は、n を M から 1 まで 1 ずつ減らしながら x に掛けるので、x=M×(M−1)×…×1(Mの階乗)。
- 右の流れ図は、x←1、n←1 の後、x←x×n、n←n+1 を実行してから判定 a。判定が本体の後にあるので後判定、Yes が終了なので a は終了条件。
- M=3 とすると、左の結果は 3×2×1=6。右で x=6 になる条件を探す。
- 1周目:x=1×1=1、n=2。2周目:x=1×2=2、n=3。3周目:x=2×3=6、n=4。
- x=6 になった直後の n は 4。ここで初めて Yes になる条件が答え。4>3 なので ウ「n>M」が合う(1・2周目の後は n=2、3 で 3>3 も No なので途中で抜けない)。
- イ「n>M−1」は n>2 なので、2周目の後(n=3)で終了し x=2(3 を掛け忘れる)。
- エ「n>M+1」は n>4 なので、4周目まで進み x=6×4=24(余分に掛ける)。
- ア「n<M」は 1周目の後 2<3 が Yes で終了し x=1。
答え:ウ:n>M
誤り訂正:1〜100の総和の流れ図
ア ①の処理を“ 0 → x ”にする。
イ ②の条件判定を“ i : 99 ”にする。
ウ ③の処理を“ x + i → i ”にする。
エ ④の処理を“ x + 1 → x ”にする。
出典:平成23年度 特別試験 基本情報技術者試験 午前 問7
解き方と答えを見る
- 流れ図は ① 1→x、1→i、② i:100 を比べて > なら終了、③ x+i→x、④ i+1→i で②に戻る。
- ループ条件を確認する:i が 1 から 100 までのあいだ③を実行し、i=101 で > となり終了する。1〜100 をちょうど1回ずつ足すので、②は正しい。
- ③ x+i→x と ④ i+1→i も、合計に i を足して i を1増やす正しい処理。
- ① で x を 1 から始めているので、結果は 1+(1+2+…+100)=1+5,050=5,051 となり、1 多い。
- 合計用の変数は 0 から始める必要があるので、① を 0→x に直す。
答え:ア:①の処理を「0→x」にする
代入文のトレース:加減算で値を交換する
| x | y | |
|---|---|---|
| ア | A | B |
| イ | B | A |
| ウ | 2B | A−B |
| エ | A−B | A−B |
ア x=A,y=B
イ x=B,y=A
ウ x=2B,y=A−B
エ x=A−B,y=A−B
出典:基本情報技術者試験 科目A免除 修了試験 20120722 実施分 問7
解き方と答えを見る
- 初期値は x=A、y=B。
- 1行目 x+y→x:x=A+B(y=B のまま)。
- 2行目 x−y→y:書き換わった x を使い、y=(A+B)−B=A。
- 3行目 x−y→x:書き換わった y を使い、x=(A+B)−A=B。
- 最終的に x=B、y=A で、値が入れ替わっている。
答え:イ:x=B、y=A
要点(試験直前に読む)
- 三基本構造は「順次・選択・繰返し」。再帰は入らない。これだけを使う手法が構造化プログラミング。
- 前判定は本体の前で判定するので0回もありうる。後判定は本体の後で判定するので最低1回は実行する。
- 双岐選択は2つから1つ、多岐選択は3つ以上から1つを選ぶ。並列に実行するわけではない。
- ループの空欄は、ひし形の Yes が「終了」なら終了条件を入れる。1〜N を数える i なら終了条件は i>N。
- 迷ったら N=3 で1周ずつトレース。境界が1つずれた選択肢は、足し忘れか足し過ぎが必ず見える。
- 合計の変数は 0、積の変数は 1 で初期化。誤り訂正問題はまず初期値を疑う。
ひっかけ
- 三基本構造の選択肢に「再帰」を混ぜてくる → 再帰を含む選択肢はすべて外す。
- 前判定と後判定の説明を入れ替えてくる → 「0回ありうるのは前判定」「先頭で判定するのは前判定」と判定位置で見分ける。
- 終了条件を i=N や i<N に1つずらしてくる → N=3 でトレースし、最後の値 N が足されているか、N+1 まで足し過ぎていないかを確かめる。
- 誤り訂正で、正しいループ条件(i:99 にするなど)を疑わせる → 条件をいじる前に、合計の変数が 0 から始まっているかを見る。
- 代入文のトレースで、途中の x を元の値のまま使わせる → 1行ごとに x と y の値を表に書き、必ず書き換わった後の値で次の行を計算する。
用語(16)
処理の流れを順次・選択・繰返しの3つの基本構造だけで組み立てるプログラミング手法。
⚠ 関数型(関数の組合せ)・論理型(事実と規則から推論)・並列(同時実行)とは別物。「順次・選択・繰返しだけ」と出たら構造化。
処理を上から順に1つずつ実行する構造。
条件によって実行する処理を切り替える構造。
⚠ 戻る線があれば選択ではなく繰返し。
条件を判定しながら同じ処理を何度も実行する構造。
⚠ 再帰と混同しやすいが、再帰は基本構造に含まれない。
関数や手続きが、処理の中で自分自身を呼び出すこと。
⚠ 三基本構造(順次・選択・繰返し)には含まれない。選択肢に再帰が入っていたら外す。
条件が成り立つかどうかで、2つの処理のどちらか一方へ進む選択構造。
⚠ 「前の処理に戻るか次に進むか」は繰返しの説明でウソ。
変数の値などによって、3つ以上の処理の中から1つを選んで進む選択構造。
⚠ 「複数の処理を並列に行う」はウソ。実行するのは選んだ1つだけ。
本体を実行する前に条件を判定する繰返しで、最初から終了条件が成り立っていれば本体を1回も実行しない。
⚠ 後判定繰返しは本体の後で判定するので最低1回は実行する。判定のひし形が本体の上にあれば前判定。
本体を実行した後に条件を判定する繰返しで、本体を必ず1回以上実行する。
⚠ 「先頭で判定する」は前判定の説明。
処理の手順を、長方形(処理)・ひし形(判定)・矢印などの記号でつないで表した図。
流れ図で繰返しの範囲の始まりと終わりを示す記号で、「変数名:初期値,増分,終値」で回し方を指定できる。
成り立っているあいだループを続ける条件。
⚠ 終了条件とは否定の関係(i≦N の否定が i>N)。ひし形の Yes が終了につながっていれば、そこは終了条件。
成り立ったらループを抜ける条件。
⚠ 継続条件と向きが逆。空欄補充では、Yes の行き先が「終了」か「本体」かを先に確認する。
ループに入る前に、変数に最初の値を入れておくこと。
⚠ 合計用は 0、掛け算を重ねる変数は 1 から始めるのが原則。取り違えると答えがずれる。
変数の値が処理1行ごとにどう変わるかを、表などに書き出して追いかけること。
計算した結果を変数に入れて、その変数の値を書き換えること。流れ図では「式→変数」と書く。
⚠ 代入後の行では、書き換わった後の値を使う。元の値のままで計算しない。
このレッスンの過去問
- 構造化プログラミングの三基本構造基本情報技術者試験 科目A免除 修了試験 20251214 実施分 問37
- プログラムの制御構造(順次・選択・繰返し)の定義基本情報技術者試験 科目A免除 修了試験 20110626 実施分 問8
- 繰返し流れ図の終了条件の読解(後判定ループ)基本情報技術者試験 科目A免除 修了試験 20220612 実施分 問10
- 前判定ループ流れ図の終了条件読解(総和)基本情報技術者試験 科目A免除 修了試験 20151220 実施分 問8
- 総和を求める流れ図の誤り訂正平成23年度 特別試験 基本情報技術者試験 午前 問7
- 代入文のトレース(加減算による値の交換)基本情報技術者試験 科目A免除 修了試験 20120722 実施分 問7