資格道場 › レッスン一覧 › アルゴリズムとプログラミング
アルゴリズムとプログラミング・1/13・12分

流れ図の基本構造とループの終了条件

ゴール

順次・選択・繰返しの3つの基本構造を見分け、流れ図のループが「何回まわって、どの値で止まるか」を自分で数えられるようになる。総和・階乗の流れ図の空欄補充と誤り訂正、代入文のトレースを自力で解ける。

流れ図の読解は、科目Aのアルゴリズム問題と科目Bの擬似言語の土台になる。業務で言えば、仕様書の処理フローを読んで「この条件で本当に最後のデータまで処理されるか」を確かめる作業と同じ。

このレッスンで稽古する(用語チェック・過去問)

結論:プログラムの流れは3種類の部品だけで書ける

構造化プログラミングとは、処理の流れを 順次・選択・繰返し の3つだけで組み立てる書き方のこと。昔のプログラムは「好きな行へ飛ぶ命令(goto)」を乱用して読めなくなったため、流れを3つの型に絞って読みやすくした。

料理のレシピにたとえると、「切る→炒める」と順に進む(順次)、「辛いのが好きなら唐辛子を入れる」と分かれる(選択)、「焼き色がつくまで混ぜ続ける」とくり返す(繰返し)の3つで、どんなレシピも書ける。

基本構造 意味 流れ図での見え方
順次 上から順に1つずつ実行する 長方形の処理が縦に並ぶ
選択 条件によって進む道を変える ひし形の判定から道が分かれ、先で合流する
繰返し 条件を判定しながら同じ処理をくり返す 判定(またはループ端)から上に戻る線がある

再帰(関数が自分自身を呼び出すこと)は基本構造に入らない。試験ではここが一番のひっかけになる。

「構造化」と他のプログラミング手法の見分け方

「順次・選択・繰返しだけを使う手法はどれか」と聞かれたら、答えは 構造化プログラミング。他の手法名は、制御の流れではなく別の考え方を表している。

手法 中心になる考え方
構造化プログラミング 制御の流れを順次・選択・繰返しの3つに限る
関数型プログラミング 処理を「入力から出力を返す関数」の組合せで書く
論理型プログラミング 事実と規則を書き、答えは推論で導かせる
並列プログラミング 複数の処理を同時に進める

選択と繰返しの種類

選択と繰返しには、それぞれ細かい種類がある。試験では種類の名前と中身を入れ替えた選択肢が出る。

用語 正しい意味 よくあるウソの説明
双岐選択 条件で 2つ の道のどちらかへ進む(if〜else) 「前の処理に戻るか次へ進むか選ぶ」→ 戻るのは繰返し
多岐選択 条件の値で 3つ以上 の道のどれか1つへ進む(switch) 「2つ以上の処理を並列に行う」→ 選ぶのは1つだけ
前判定繰返し 本体の前で判定する。最初から終了条件が成り立っていれば(継続条件が成り立たなければ)、本体を 0回 実行して抜ける 「必ず1回は実行する」→ それは後判定
後判定繰返し 本体の後で判定する。本体を実行してから判定するので、最低1回 は実行する 「先頭で判定する」→ それは前判定

覚え方:「前判定は0回あり、後判定は最低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 になる。

N=3 のトレース(前判定)初期値:x=0, i=1判定 1>3 ?Nox=0+1=1i=1+1=2判定 2>3 ?Nox=1+2=3i=2+1=3判定 3>3 ?Nox=3+3=6i=3+1=4判定 4>3 ?Yes終了x=6(1+2+3)i は 4(N+1)まで進むが、x に足し込むのは 3(N)まで
1〜Nの総和の流れ図を N=3 でトレースすると、i は 4 まで進むが x に足されるのは 3 までで、x=6 で止まる。

誤り訂正問題:まず初期値を疑う

「総和を求める流れ図に誤りがある。どう直すか」という問題では、ループの条件より先に 初期値 を確認する。合計用の変数を 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 の値を表に書いて追えば間違えない(下の例題参照)。

代入文xy最初AB① x+y→xA+B を x へA+BB② x−y→y(A+B)−B=AA+BA③ x−y→x(A+B)−A=BBA誤り:② で x を A のまま使うとy=A−B になり、入れ替わらない
x+y→x、x−y→y、x−y→x の3行で、x と y の値 A と B が入れ替わる様子(色付きの欄がその行で書き換わった変数)。
例題 1

前判定ループ:1〜Nの総和の空欄 a

流れ図は,1 から N(N≧1)までの整数の総和(1+2+…+N)を求め,結果を変数 x に入れるアルゴリズムを示している。流れ図中の a に当てはまる式はどれか。
流れ図: 開始 → 0→x, 1→i → 判定「a」(Yes → 終了,No → 下へ)→ x+i→x → i+1→i → 判定の入口へ戻る(ループ)。

ア i = N
イ i < N
ウ i > N
エ x > N

出典:基本情報技術者試験 科目A免除 修了試験 20151220 実施分 問8

解き方と答えを見る
  1. 流れ図を確認する:0→x、1→i の後に判定 a があり、Yes なら終了、No なら x+i→x、i+1→i をして判定に戻る。判定が本体より前にあるので前判定、Yes が終了なので a は終了条件。
  2. N=3 で、正しい答え x=1+2+3=6 になる条件を探す。
  3. ウ「i>N」で試す:i=1 → 1>3 は No → x=0+1=1、i=2。
  4. i=2 → 2>3 は No → x=1+2=3、i=3。
  5. i=3 → 3>3 は No → x=3+3=6、i=4。
  6. i=4 → 4>3 は Yes → 終了。x=6 で正しい。
  7. ア「i=N」で試す:i=1、2 では No で x=3、i=3 になる。i=3 → 3=3 は Yes で終了し、3 を足す前に抜けるので x=3(誤り)。
  8. イ「i<N」で試す:i=1 → 1<3 が Yes で即終了し、x=0(誤り)。
  9. エ「x>N」は回数ではなく合計を N と比べており、意味が合わない。

答え:ウ:i>N(i が N を超えたときに抜ける)

例題 2

後判定ループ:階乗を一致させる条件 a

正の整数Mに対して,次の二つの流れ図に示すアルゴリズムを実行したとき,結果xの値が等しくなるようにしたい。aに入れる条件として,適切なものはどれか。
左の流れ図: 開始 → x ← 1 → ループ端(上)「演算 n:M,-1,1」 → x ← (x × n) → ループ端(下)「演算」 → 終了。注記「ループ端の繰返し指定は,変数名:初期値,増分,終値を示す。」 右の流れ図: 開始 → x ← 1 → n ← 1 → x ← (x × n) → n ← (n + 1) → 判定(ひし形)「a」。No は x ← (x × n) の直前に戻る,Yes は終了へ。

ア n<M
イ n>M-1
ウ n>M
エ n>M+1

出典:基本情報技術者試験 科目A免除 修了試験 20220612 実施分 問10

解き方と答えを見る
  1. 左の流れ図は、n を M から 1 まで 1 ずつ減らしながら x に掛けるので、x=M×(M−1)×…×1(Mの階乗)。
  2. 右の流れ図は、x←1、n←1 の後、x←x×n、n←n+1 を実行してから判定 a。判定が本体の後にあるので後判定、Yes が終了なので a は終了条件。
  3. M=3 とすると、左の結果は 3×2×1=6。右で x=6 になる条件を探す。
  4. 1周目:x=1×1=1、n=2。2周目:x=1×2=2、n=3。3周目:x=2×3=6、n=4。
  5. x=6 になった直後の n は 4。ここで初めて Yes になる条件が答え。4>3 なので ウ「n>M」が合う(1・2周目の後は n=2、3 で 3>3 も No なので途中で抜けない)。
  6. イ「n>M−1」は n>2 なので、2周目の後(n=3)で終了し x=2(3 を掛け忘れる)。
  7. エ「n>M+1」は n>4 なので、4周目まで進み x=6×4=24(余分に掛ける)。
  8. ア「n<M」は 1周目の後 2<3 が Yes で終了し x=1。

答え:ウ:n>M

例題 3

誤り訂正:1〜100の総和の流れ図

次の流れ図は,1 から 100 までの整数の総和を求め,結果を変数 x に代入するアルゴリズムを示したものであるが,一部誤りがある。どのように訂正すればよいか。
流れ図(上から順に): 開始 → ① 1 → x → 1 → i → ② 判定 i : 100(> のとき 終了へ,≦ のとき下へ)→ ③ x + i → x → ④ i + 1 → i → ②の判定の上へ戻る。 ②で > の場合は 終了。

ア ①の処理を“ 0 → x ”にする。
イ ②の条件判定を“ i : 99 ”にする。
ウ ③の処理を“ x + i → i ”にする。
エ ④の処理を“ x + 1 → x ”にする。

出典:平成23年度 特別試験 基本情報技術者試験 午前 問7

解き方と答えを見る
  1. 流れ図は ① 1→x、1→i、② i:100 を比べて > なら終了、③ x+i→x、④ i+1→i で②に戻る。
  2. ループ条件を確認する:i が 1 から 100 までのあいだ③を実行し、i=101 で > となり終了する。1〜100 をちょうど1回ずつ足すので、②は正しい。
  3. ③ x+i→x と ④ i+1→i も、合計に i を足して i を1増やす正しい処理。
  4. ① で x を 1 から始めているので、結果は 1+(1+2+…+100)=1+5,050=5,051 となり、1 多い。
  5. 合計用の変数は 0 から始める必要があるので、① を 0→x に直す。

答え:ア:①の処理を「0→x」にする

例題 4

代入文のトレース:加減算で値を交換する

次のような一連の代入文がある。 x+y→x x−y→y x−y→x x,yの初期値をそれぞれA,Bとするとき,最後の代入文の実行が終了した時点におけるxとyの値の適切な組合せはどれか。
x,yの値の組合せの表。
xy
アAB
イBA
ウ2BA−B
エA−BA−B

ア x=A,y=B
イ x=B,y=A
ウ x=2B,y=A−B
エ x=A−B,y=A−B

出典:基本情報技術者試験 科目A免除 修了試験 20120722 実施分 問7

解き方と答えを見る
  1. 初期値は x=A、y=B。
  2. 1行目 x+y→x:x=A+B(y=B のまま)。
  3. 2行目 x−y→y:書き換わった x を使い、y=(A+B)−B=A。
  4. 3行目 x−y→x:書き換わった y を使い、x=(A+B)−A=B。
  5. 最終的に 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 から始めるのが原則。取り違えると答えがずれる。
トレース trace(追跡)
変数の値が処理1行ごとにどう変わるかを、表などに書き出して追いかけること。
代入 だいにゅう
計算した結果を変数に入れて、その変数の値を書き換えること。流れ図では「式→変数」と書く。
⚠ 代入後の行では、書き換わった後の値を使う。元の値のままで計算しない。

このレッスンの過去問

このレッスンで稽古する