
武蔵野個別指導塾の特徴
高校情報I フローチャート—分岐と反復の経路を描いて処理の抜けを直す|武蔵野個別指導塾

貸出冊数を判定する図とPythonを照らし、真偽の合流や反復の更新、不正入力の出口を点検します。
よくあるのは、高校生が条件に合わない場合の矢印を落とすという場面です。貸出冊数が上限より少なければ貸出可能、と書いた図は一見完成しているように見えます。しかし上限に達した人が来たとき、判断の先が描かれていなければ処理の行き先が決まりません。図の線を飾りとして見るのではなく、どの入力でも次に進めるかを確かめましょう。
図を読む問題と図を作る問題
問われ方の1つは、指定された入力で判断を順にたどり、通る経路と出力を求めるものです。もう1つは、文章の条件から判断と矢印を作り、欠けた経路を補うものです。さらに、繰り返しの図とプログラムを照合して、処理が何回行われ、いつ終了するかを説明する型もあります。どの場合も、判断の形だけでなく、その出口が次の処理に結びつくかが重要です。
ここでは架空の図書室を使います。現在の貸出冊数を0以上の整数とし、3冊未満なら「貸出可」、3冊以上なら「上限」です。入力は整数の並びで、空の並びも認めます。結果は入力順の文字列のリストにします。同じ冊数が複数あれば、それぞれ別の受付として扱います。添字は0から始まり、最後は要素数の1つ手前です。探索ではないので未発見の返り値や比較回数は求めません。表示の丸めもありません。
この規則は、これから1冊を借りる前の判定です。貸出可能と判定するだけで、実際の貸出記録は変更しません。上限ちょうどの3は「未満」に含まれないので、上限側へ進みます。上限を超えた値も処理対象であり、負数は入力の約束に反するため、後で示す方法でエラーとして返します。
記号と矢印を処理に対応させる
開始と終了は端の丸い形、値の更新や出力の準備は長方形、条件の判断はひし形で表します。判断から出る矢印には、条件が成り立つ場合と成り立たない場合を明記します。入力や出力を平行四辺形で表す場合もありますが、ここでは結果をリストへ追加する操作を処理の長方形で表します。記号の向きを覚えるだけでは、どの矢印がどこに戻るかはわかりません。
図1のように、条件が真でも偽でもそれぞれの処理を終えた後に合流できます。合流は「両方を実行する」場所ではありません。1回の判定で通るのは真か偽のいずれかで、実行された側から共通の次の処理へ進みます。条件を満たす入力と満たさない入力を別々にたどると、欠けた線が見つかります。

反復では、判断を通って本体へ進み、本体の処理を終えた後に判断へ戻ります。反復をやめる矢印も必要です。戻る線があるだけでは終了を保証できません。判断に使う状態が進み、いつ条件が偽になるかを説明します。逆に最初から条件が偽なら、本体を1回も通らずに終了します。
流れ図は実行順の設計図です。Pythonでは判断をifとelse、共通処理を分岐の外、反復をwhileで表せます。字下げはどの処理がどの分岐や反復に属するかを示します。擬似言語でも条件や反復を文章に近い記号で表せますが、記法は問題ごとに決められるため、Pythonの構文と同じものとは限りません。
基本例題:貸出の判定を1人ずつ進める
入力を [1, 3, 2] とします。各冊数が3未満かを判定し、結果を入力順のリストで答えてください。手で調べると1は真、3は偽、2は真です。したがって期待値は [‘貸出可’, ‘上限’, ‘貸出可’] です。図2のように、真偽のどちらからも位置を進める処理に合流して、次の人を調べます。

次のプログラムは整数のリストを受け取ります。負数や整数以外があれば、その要素に来た時点で結果全体を返さずエラーを返します。真偽値はPythonでは整数の仲間ですが、冊数としては受け付けない約束です。
def judge_counts(counts):
results = []
i = 0
while i < len(counts):
count = counts[i]
if type(count) is not int or count < 0:
return '入力エラー'
if count < 3:
results.append('貸出可')
else:
results.append('上限')
i = i + 1
return results
print(judge_counts([1, 3, 2]))
def は処理に名前を付け、counts を入力として受け取ります。空の results は判定結果の入れ物です。i はこれから調べる位置で、最初は0です。while は位置が要素数より小さい間だけ本体を実行します。count にその位置の値を取り出し、まず型と負数を確かめます。不正なら return でその場で終了し、途中までの結果は返しません。
有効な冊数なら次のifで3未満を判定します。真なら貸出可、偽なら上限を追加します。append はリストの末尾に1項目を加える操作です。どちらの枝でも追加は1回です。その後の i = i + 1 は共通の処理で、次の位置へ進みます。反復を抜けたら結果を返し、最後の print がそれを表示します。
実行環境は Python 3.15.0 です。入力 [1, 3, 2]、期待出力と実際の出力は次のとおり一致しました。引用符や角括弧はPythonのリスト表示です。
['貸出可', '上限', '貸出可']
実行前と各回の終了後を表にすると次のようになります。判断の直前に i が示す値と、追加後の結果を区別します。
回 iの値 調べた冊数 追加後の結果 次のi
開始 0 なし [] 0
1 0 1 ['貸出可'] 1
2 1 3 ['貸出可', '上限'] 2
3 2 2 ['貸出可', '上限', '貸出可'] 3
終了 3 なし 同上 3
終了時は i と要素数がともに3なので条件は偽です。元の3人へ結果を戻すと、1冊と2冊は上限まで余裕があり、3冊は余裕がありません。出力も3項目で、受付の抜けや重複がないと確認できます。
一般の場合にも、各反復の入口で、位置 i より前の有効な入力に対応する結果が順に追加済みです。最初は i が0で、対象も結果も空なので成り立ちます。有効な要素ではいずれかの枝で1項目を追加して位置を1進めるため、この関係が保たれます。不正な要素では結果リストを返さず終了します。有限の入力に対して位置は毎回1ずつ増えるので、有効な要素が続いても要素数に達して止まります。実行した数例はこの説明の代わりの証明ではなく、実装の食い違いを見つける確認です。
境界と例外の出口を増やす
標準の確認では、通常の値だけでなく、反復の入口と判断の境界を通します。入力と期待値は次のとおりです。各行は独立した呼び出しで、前の結果を引き継ぎません。
入力 期待出力
[] []
[0] ['貸出可']
[2, 3, 4] ['貸出可', '上限', '上限']
[1, 1] ['貸出可', '貸出可']
空の入力では最初の反復条件が偽なので結果も空です。1要素の0は有効な下端で、1人分が貸出可です。2、3、4は境界の直前、一致、直後を表し、ちょうど3の矢印を点検できます。重複する1は別々の受付なので2回追加します。Python 3.15.0 で上の4入力を実行し、実際の出力はそれぞれ期待出力と一致しました。人ごとの冊数に戻して確かめても、各入力に1つの判定が対応します。
同じ件数の確認を失敗側にも行います。入力 [‘2’] は数字に見える文字列、[-1] は負数、[True] は真偽値、[1, -1, 2] は途中に不正な値を含む入力です。4つとも期待出力は 入力エラー です。Python 3.15.0 で実行した実際の出力も各行 入力エラー でした。最後の例では先頭の判定が内部で追加されますが、戻り値はエラー文字列であり、途中の結果を完成した一覧として返しません。入力側が文字列で送る仕様なら、変換できる形式と変換失敗の出口を別に決める必要があります。
少し発展させ、受付端末が別の装置から冊数を取得すると考えます。上の関数はすでに得られたリストを判定する処理であり、装置との通信や時間制限を実装していません。図に外部取得を加えるなら、取得成功後に入力を検査し、取得失敗や時間切れでは判定せず「取得失敗」を返す枝を設けます。取得した値が壊れていれば「入力エラー」です。途中まで得られた値を全員分と見なすかは別途決めなければなりません。これらは設計上の条件で、上のコードの実行結果ではありません。
外部処理を作る際の成功側の試験は、全員分の取得、0件の取得、1件の取得、境界値を含む取得を想定します。失敗側にも同じ4件として、取得時の例外、応答の時間切れ、形式の壊れた値、外部装置が失敗を返す場合を用意します。それぞれ期待する出口と、部分結果を返さないことを確かめます。例外を捕まえる位置や時間切れの秒数は使用する仕組みの仕様に依存するため、根拠なく決めません。これら4件は実装前の試験設計であり、実行済みではありません。
誤った矢印を直して再実行する
図3の左は、上限の枝から位置更新へつながる矢印を落とした状態です。冊数1では真の枝を通るので見逃しやすい一方、3では偽の枝に入った後の行き先がありません。図の不備を、偽の枝からも共通の更新へ矢印をつなぐことで直します。図3のように合流後に更新を置けば、どちらの枝でも1回進みます。

コードに移すときの似た誤りは、更新を真の枝の内側に入れることです。冊数3に来ると、結果へ「上限」を繰り返し追加しながら位置は変わらず、終了しません。この誤例は無制限に実行せず、最初の2回を手で追います。最初の位置が0で入力が [3] なら、1回目も2回目も i は0、調べる冊数は3のままです。
修正では上の完成コードのように、更新をifとelseの外側、whileの内側へ置きます。入力 [3] の期待出力は [‘上限’] です。修正後のPython 3.15.0での実際の出力も [‘上限’] でした。結果は1人分であり、その人は3冊なので上限に対応します。図の矢印をつなぐ修正とコードの字下げの修正は、同じ経路の欠落を直しています。
自分で経路をたどる5問
次の5問は、上の貸出判定とは別の場面です。答えは後の節にまとめています。判断では指定した条件の真偽と、通る経路を答えてください。
- 展示室の入場者が5人未満なら「入場可」、それ以外は「待機」とします。4人と5人をそれぞれ入力したとき、文字列で何を返しますか。
- 整理済みの札が [7, 8, 9, 10] と並びます。位置0から順に1枚ずつ確認し、位置を1進めます。全札を確認した後の位置と確認回数を整数で答えてください。空の場合の回数も答えてください。
- 休憩時間が0以上の整数で、10分以上なら「長い」、それ以外なら「短い」です。入力 [9, 10, 12] の判定結果を入力順のリストで答えてください。
- 備品数を調べる図で、数が負なら「入力エラー」で終了し、0以上なら「受付」で終了します。入力 -2 と 6 の各経路と文字列を答えてください。
- 受付装置から値を得る図で、取得に成功し、かつ値が整数なら「記録」、取得失敗なら「取得失敗」、成功したが整数以外なら「入力エラー」とします。成功して整数8、成功して文字列 ‘8’、時間切れによる取得失敗の3件の出口を答えてください。
答えと条件への戻し方
-
4人は5未満なので真の枝を通り「入場可」、5人は偽の枝を通り「待機」です。5人は境界そのものなので、未満に含まれないことを確認します。2つの結果は条件に戻して一致します。
-
位置は0、1、2、3を順に通り、更新後は4です。確認回数は4回で、札7、8、9、10の各1枚に対応します。空なら最初から位置0が要素数0未満ではないので0回です。位置4を札の位置として読むのではなく、終了を示す状態として扱います。
-
判定結果は [‘短い’, ‘長い’, ‘長い’] です。9は10未満、10は境界に一致し、12はそれを超えます。3件に対して結果も3件あり、それぞれの時間に戻して条件を満たします。
-
-2は負という判断が真でエラーへ、6は偽で受付へ進みます。出力は順に「入力エラー」「受付」です。負数を受け付けない出口を明示することで、正常な受付と混ざりません。
-
整数8は取得成功と型の検査を経て「記録」、文字列 ‘8’ は取得成功の後に「入力エラー」です。時間切れは取得失敗の出口へ進み「取得失敗」です。取得できなかった値について型判定を行わない点が重要です。各出力を原因に戻せば、取得失敗と取得後の形式不正を区別できます。
これらの答えをPython 3.15.0で別の短い式により照合しました。問1は 4 < 5 が真、5 < 5 が偽です。問2は位置の範囲が0から3で4個、空の範囲は0個です。問3の3条件は偽、真、真です。問4の負の判定は真、偽、問5は記録、入力エラー、取得失敗の順でした。単なる文字列の一致に加え、それぞれの場面で人、札、時間、取得状態へ戻して確認しています。
経路を残さないための要点
開始から終了まで、判断の真と偽の両方を線でつなぎます。 合流はどちらかの枝から共通の処理に進む場所です。 反復は戻る線と抜ける線、状態の更新を一組で考えます。 境界、空、不正、外部の失敗に対する出口を仕様で決めます。
つまずきを見分けるには
図を読んだ人に、条件を満たさない値で指を動かしてもらうと、欠けた矢印が表れます。合流後に両方の枝を実行してしまう場合は、1人の入力で通った線に印を付け、結果が何個増えたかを確認します。反復が止まらない場合は、判断に使う位置の更新前後を表の別の列に書きます。
個別指導では、まず本人に境界の値を選んでもらい、手でたどった経路とコードの字下げを照らします。次に空の入力と不正な入力を加え、結果を返す場所まで説明できるか確かめます。最後に、修正後も以前の正常な入力が通るかを再実行します。矢印の先を決めることで、処理の抜けは具体的に見えるようになります。
読んで終わりにするか、ここから変えるか。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。



