フローチャート

プログラミングの考え方

プログラミングとはただコードを書くことではありません。

  1. まず処理しようとする問題を決め、
  2. これを明確なモデルとして理解し、
  3. その処理を実現するアルゴリズムを得て、
  4. それを特定のプログラミング言語で書き下す

image-20231101102808730

この一連の作業を「プログラミング」と呼びます。(4.のコーディング部分だけと考えてはいけない)

アルゴリズムの表現方法

特に重要なのはアルゴリズム(問題の解を確実に得られる手順)を明確にする段階です。明確にするには書き出す(頭の中を外在化する)ことが重要ですが、そのための方法は幾つかあります。

ここでは以下の三つの方法を紹介します。

以下に、「1から10までの数を足した合計を求める」ためのアルゴリズムを、それぞれの方法で表現します。

自然言語によるアルゴリズムの表現

例えば以下のようになるでしょう。

  1. 合計をまず 0 にしておく
  2. カウンターを1にする
  3. カウンターの値を合計に加える
  4. カウンターに 1 を加える
  5. 処理 4. の結果、カウンターが 10 以下なら処理 3. から繰り返す
  6. (そうでなければ)合計の値を出力する

課題1

上の「作業手順の指示」を読んで、その通りあなたが自分の手で(紙と鉛筆で)作業すれば、正しく結果が得られる事を確かめて下さい。手作業による動作の確認は、上の手順を追いながら変化する変数の値を記録することで行います。

変数となるはずの合計とカウンターの値を書き込むための枠を手元の紙にいくつか書いて下さい。(下左図のような状態)

image-20231224192252619

続いて、手順を1. から順にたどり、変数に書き込み(変化)があれば、それを反映させます。

上図右は、手順 1. 2. 3. 4. まで実行した状態です。これからまだ作業を続けていけば、最終的に処理は6. に到達することが確認できるでしょう。

恐らく多くの人は、処理が終了するまでのすべての段階を書き出さなくても、何回か繰り返し処理をトレースした時点で、カウンターが10になるところまでは正しく動きを推定できる(確信が持てる)と思います。その後、カウンターは 11 になり、処理 5. からループせず処理 6. に進み、合計値が出力されるのが確認できるでしょう。

トレース
動作確認やデバッグのために動きを追うのをトレース( trace )と呼びます。トレースは手作業でやることもありますし、ツールを使ってプログラムの動きを一行ごとに停止して状態を確認するようなこともできます。VS Code のデバッグ機能などを調べてみると良いでしょう。「VSCode によるPython のデバッグ実行」などで検索するといろいろ見つかると思います。例えば以下(ちょっと古い記述です)。
【VSCode】Pythonを1行毎に変数の中身見ながらステップ実行する方法
https://blog.stedplay.com/how-to-debug-python-in-vscode/

流れ図(フローチャート)によるアルゴリズムの表現

流れ図では処理の流れを小さなブロックを線で接続してアルゴリズムを表現します。以下に、簡単に表記の例を示します。まず処理は一つの四角形で表現し、それらを線で結ぶことで処理の流れを示します。

image-20231101111048949

注意:流れ図は標準化(JIS X0121)された記法がありますが、それに厳密に従う要求がされることはまずありませんので、ここでは簡単にやります。

課題2

1から10までの合計を求める処理を、先に示した自然言語によるアルゴリズム表現の1. から6. (下図左に再掲)沿ってフローチャート化したものを下図右に示します。

image-20231101112530827

このフローチャートの指示どおり、あなたが自分の手で(紙と鉛筆で)作業すれば、正しく結果が得られる事を確かめて下さい。(どこかノートに、前のページ同様、合計とカウンターの値を書き込んで実際に作業すると良いです)

また、この自然言語とフローチャートによるアルゴリズム表現を対照して、両者が等価である事を確認してください。

課題3

入力された二つの数の差の絶対値を出力するための処理の流れ(アルゴリズム)をフローチャートで描いて下さい。

パッと描けない場合は、まず自然言語で手順を書き下し、それを図化するつもりでやると良いです。

課題4

二つの自然数 a, b ( a > b ) の最大公約数を求めるアルゴリズム「ユークリッドの互除法」を下図(左)に示します。また、下図(右)に a, b に 84 と 60 を与えてアルゴリズムをトレースした結果を示します。あなたも手作業で実際にそのようになることを確かめて下さい。あまり納得がいかない場合は 18 と 12 で試して、正しく 6 と解が得られるか追うと良いです。

image-20231101120640197

アルゴリズムに納得がいけば、これをフローチャートで描いて、正しく結果が得られる事を確かめて下さい。

仮コード(擬似コード)によるアルゴリズム表現

Python に限らず、プログラミング言語は一言一句間違いのない記述が求められます。しかしアルゴリズムを検討する段階では、そうした各プログラミング言語の細かな文法制約などなしに、ラフな記述でアルゴリズムや処理の流れを記述する方が有効です。

そのようにして書かれた、コード(のようなもの)を、仮のコード(擬似コード, pseudo code)などと呼びます。

下図に「ユークリッドの互除法」の日本語によるアルゴリズム(左)と、対応する仮コード(右)を示します。(ループ関連の細部が微妙に違うとはいえ、本質的には)同じアルゴリズムが、異なる表現方法で書かれている事が分かるでしょう。

image-20231101122717406

課題5

1から10までの合計を求める処理のフローチャートを見ながら、それを仮コードで書き直して下さい。

ループ処理はPythonの while 文に似せて書いても良いですし、上に書いたような loop: と end loop といった「オレオレ」文法を作って貰っても構いません。

また、その仮コードに書かれている通りにあなたが自分の手で(紙と鉛筆で)作業すれば、正しく結果が得られる事を確かめて下さい。

フローチャートのまとめ

以下のことが把握できたでしょうか。