プログラミングとはただコードを書くことではありません。
この一連の作業を「プログラミング」と呼びます。(4.のコーディング部分だけと考えてはいけない)
特に重要なのはアルゴリズム(問題の解を確実に得られる手順)を明確にする段階です。明確にするには書き出す(頭の中を外在化する)ことが重要ですが、そのための方法は幾つかあります。
ここでは以下の三つの方法を紹介します。
以下に、「1から10までの数を足した合計を求める」ためのアルゴリズムを、それぞれの方法で表現します。
例えば以下のようになるでしょう。
上の「作業手順の指示」を読んで、その通りあなたが自分の手で(紙と鉛筆で)作業すれば、正しく結果が得られる事を確かめて下さい。手作業による動作の確認は、上の手順を追いながら変化する変数の値を記録することで行います。
変数となるはずの合計とカウンターの値を書き込むための枠を手元の紙にいくつか書いて下さい。(下左図のような状態)
続いて、手順を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/ |
流れ図では処理の流れを小さなブロックを線で接続してアルゴリズムを表現します。以下に、簡単に表記の例を示します。まず処理は一つの四角形で表現し、それらを線で結ぶことで処理の流れを示します。
基本的に処理は上から下に線に沿って進みますが、分かりやすさのために矢印を付けることもあります。(Fig. 1)
条件判定と、それに従った分岐は菱形と分岐先へつながる線で表現します。(Fig. 2)
ループ(繰り返し処理)は、元に戻る矢印で表現します。(Fig. 3)
条件分岐などはいろいろな場合があります。あまり定型を気にせず柔軟に表現すれば良いでしょう。(Fig. 4)
注意:流れ図は標準化(JIS X0121)された記法がありますが、それに厳密に従う要求がされることはまずありませんので、ここでは簡単にやります。
1から10までの合計を求める処理を、先に示した自然言語によるアルゴリズム表現の1. から6. (下図左に再掲)沿ってフローチャート化したものを下図右に示します。
このフローチャートの指示どおり、あなたが自分の手で(紙と鉛筆で)作業すれば、正しく結果が得られる事を確かめて下さい。(どこかノートに、前のページ同様、合計とカウンターの値を書き込んで実際に作業すると良いです)
また、この自然言語とフローチャートによるアルゴリズム表現を対照して、両者が等価である事を確認してください。
入力された二つの数の差の絶対値を出力するための処理の流れ(アルゴリズム)をフローチャートで描いて下さい。
パッと描けない場合は、まず自然言語で手順を書き下し、それを図化するつもりでやると良いです。
二つの自然数 a, b ( a > b ) の最大公約数を求めるアルゴリズム「ユークリッドの互除法」を下図(左)に示します。また、下図(右)に a, b に 84 と 60 を与えてアルゴリズムをトレースした結果を示します。あなたも手作業で実際にそのようになることを確かめて下さい。あまり納得がいかない場合は 18 と 12 で試して、正しく 6 と解が得られるか追うと良いです。
アルゴリズムに納得がいけば、これをフローチャートで描いて、正しく結果が得られる事を確かめて下さい。
Python に限らず、プログラミング言語は一言一句間違いのない記述が求められます。しかしアルゴリズムを検討する段階では、そうした各プログラミング言語の細かな文法制約などなしに、ラフな記述でアルゴリズムや処理の流れを記述する方が有効です。
そのようにして書かれた、コード(のようなもの)を、仮のコード(擬似コード, pseudo code)などと呼びます。
下図に「ユークリッドの互除法」の日本語によるアルゴリズム(左)と、対応する仮コード(右)を示します。(ループ関連の細部が微妙に違うとはいえ、本質的には)同じアルゴリズムが、異なる表現方法で書かれている事が分かるでしょう。
1から10までの合計を求める処理のフローチャートを見ながら、それを仮コードで書き直して下さい。
ループ処理はPythonの while 文に似せて書いても良いですし、上に書いたような loop: と end loop といった「オレオレ」文法を作って貰っても構いません。
また、その仮コードに書かれている通りにあなたが自分の手で(紙と鉛筆で)作業すれば、正しく結果が得られる事を確かめて下さい。
以下のことが把握できたでしょうか。