CONTENTS / BACK-PAGE / NEXT-PAGE

 プログラムに関するテキストによくファイルという用語をみかける。ファイルとは、一般にはデータの集合やプログラムをある規則によって蓄積されたものと解釈してよい。このようなデータの集まりやプログラムなどは、外部記憶(フロッピーディスクやハードディスク)に保存され、計算機の電源を切っても残っている。ファイルという用語は、データファイル、プログラムファイルなどのように、さまざまな場面で使われ、プログラムそのもの,データの集まり,さらにはフロッピーディスクをさすこともあるので気を付けて欲しい。


2 プログラミングのための準備

 この章は、多少プログラムが書けるようになってからもう1度読み返してもらうと、より理解が深まると思う。プログラムを全く知らない人にとっては、少し退屈かもしれないが、よいプログラムを書くためには大切な事柄である。

2.1 プログラミングのためのステップ

 正しいプログラミングをするためには、以下のように進めることが望ましい。

(1)問題の仕様の明確化

 まず与えられた問題を正確に理解し、他人の立場から十分に分析しその欠点などを見つける。つまりどのような条件のもとに、どのようなことが起こり得るかを明確にする必要がある。

<例2−1>n個のデータa1,・・・,anの平均を求めるプログラムを書きたいとする。このときに、

  1. nが0以下である場合は、答が不明である。
  2. nが整数でない時、答は不明である。
  3. データが数値でないとき、そのデータを無視してよいのか?
  4. 扱うデータが非常に大きい数値もしくは非常に小さい数値の時は、計算機の能力(有効桁数など)を越えてしまわないか?
       :
       :
などの考慮しなければならないさまざまなことが存在する。これらを十分に考慮した上で平均=(a1+a2+・・・an)/nを計算しなければならない。

(2)アルゴリズムの選択,組み立て

 問題の仕様を十分に理解したのちに、それを解くためにもちいる手法を選ぶ。この手法の選択によっては、悪いプログラムができる原因となりかねない。よいプログラム、悪いプログラムについては後節で解説する。手法が決定したら、何を行い次に何をするかという一連の動作を時間経過の順に箇条書にする。これを手順という。

<例2−2>e^xを求める手順を書く。eは、自然対数である。

e^x = 1 + (x/1!) + (x^1/2!) + …… + (x^n/n!) + …… により求めるとする。
ここで、a!とは、aの階乗を意味し a!=a*(a-1)* …… *2*1 と定義する。

Step1xに数値を与える。
Step2nとsの値をそれぞれ0にする。
Step3nの値に1加える。
Step4(x^n)/(n!)を求めsを加える。
Step5Step3へ行く。
Step6sの値を出力する。
Step7おわり。

 例2−2では、Step3,4,5 をループして永久に終らない手順である。そこで入力データの条件を満たすようなすべての数値を与えても、有限回のステップを実行後に終了するような条件を手順に加える。これをアルゴリズム(algorithm)といい、手順が正しければ有限時間で答が得られ停止するという保証がある。例2−2をアルゴリズムにするには、Step5 を

  Step5 もしnが10以下ならば Step3 へ行く。

に変更すれば、nが11になったときには必ずStep6へ行くため、停止することが保証される。

(3)流れ図を書く

 箇条書にされたアルゴリズムをよりわかりやすくするために、記号を用いてある規則に従って書いたものすなわちフローチャートを用いる。アルゴリズムをフローチャートで書くことにより、動作の流れが視覚的に確認できるため、複雑な問題を考えるときにはとても便利である。図2ー1に例2ー2のアルゴリズムをフローチャートにしたものを示す。画面の出力上、JISで定められたフローチャートの記号とは多少異るが、だいたいの感じがつかめればよい。

図2−1 フローチャート

図2-1

***注意***

 1つのプログラムをフローチャートに書く時に使用する記号(箱)の数は、だいたい20個以内として、なるべく1枚の紙に描ききれるようにする。描ききれそうにないときには、
図
のような記号(箱)を用い大まかな処理を書き、別に・・・の処理に対応するフローチャートを書くようにする。
 また、フローチャートの流れの線は、交差してはいけない。
 フローチャートについてにの詳細な説明は、別の機会にするとして今回はこの辺で終りとする。

(4)データ構造,データタイプの決定

 まずデータ構造,データタイプの用語の解説から行う。

 計算機では工夫しだいでさまざまな種類のデータを扱うことができる。データがどのような構成要素で構成され、何を表現しているのかを明確にしておく必要がある。例えば、従業員に関するデータを扱うことを考えた場合、氏名,年齢,住所,従業員番号などの構成要素から従業員個人のデータが構成されている。平面座標上の点を考えた時、x座標とy座標が組になって1点の座標を表現している。このように扱うデータは異なった目的の異なった構成要素の組から成っており、それぞれの用途にあった構成をしている。この構成がまさに「データ構造」である。

 また、データが何を表現しているかという意味付けをすることが大切である。2つの整数の組が1つのデータと考えた時、それが平面上の整数座標を表現しているのか、それとも複素数を表現しているのか、もしくは全く別のものを表現しているのか分からない。このように単に2つの整数の組のデータであっても、何を表現しているのか明確にされていないと全く別の種類のデータとして、扱ってしまうことになる。このようにデータが何を表現しているのかという意味付けが「データタイプ」である。データタイプは、別の側面も持っている。計算機内部では、データは1章で述べたように2進数で表現されている。そのためプログラムもしくはユーザが、どんな種類のデータを扱うかを決めなけらばならない。例えば、5は整数型(int type),aは文字型(char type)のように扱うデータのタイプを決めなければならない。

 実際の問題をプログラミングするためには、問題に合致した状態をプログラムの中で模倣しなければならない。そのために適したプログラム言語を決め、そこで利用できるデータ構造をよく理解しその上でデータ構造を決め、どんなタイプのものを使うかも決める必要がある。例えば、地下鉄の路線図と運賃に関するプログラムを作成するとき、計算機の内部で路線図を表現することを考えると、データ構造,データタイプの選び方により様々な構造が考えられる。実際の現象とプログラムとのギャップを埋めることができるのが、このデータ構造であり、プログラムの良し悪しの原因となる。実際のプログラミング例を用いた例は後章で紹介する。

(5)プログラムを書く

 ここでやっとプログラムを書くことになる。プログラムを書くにあたっては、記述しようとするプログラミング言語のもつ機能をよく調べ、なるべくわかりやすく書くべきである。大きなプログラムを書く時には、特に注意しなけらばならない点である。なぜならば自分の書いたプログラムは他人も読むことを忘れてはならないからである。

 信頼できるプログラム作成法の1つに、構造化プログラミングと言われる手法がある。これを用いて作成したプログラムは、一般的には誤りが少なく誤りの修正や機能の変更・拡張が容易でプログラム作成に費やす時間と労力が節約できるといわれ、多くのプログラム開発に用いられている。構造化プログラミングの具体的な手段として、次のようなことが考えられる。

  • プログラムの設計にあたっては、報告書を書くように大まかな所から考え、細分化してだんだんと細かな所を考える。「トップダウン方式(段階的詳細化ともいわれる)」と呼ばれる考え方である。
  • プログラムを作るときは、プログラムを論理単位(機能や働きごと)に分割し、プログラムを作る。構造化、ブロック化といわれる。


 構造化プログラミングの考え方を次の例を用いて理解しよう。

<例2−3>n個のデータを読み込み、平均を求め、データと平均を出力するプログラムを設計せよ。
  • まず大まかな所から考えると、図2−2のようなフローチャートができる。
  • フローチャートの各箱の中を細かく考え、実際にプログラミングをする。この場合、各箱ごとに正しく動くことを確認しながら作る。

図2−2 平均を求めるフローチャート

図2-2

 プログラムが複雑になればなるほど、大きく処理を分けプログラムすることの大切さが明らかになるであろう。どんなプログラムを書く時にも構造化を常に意識していなければならない。

(6)報告書を残す

 プログラミングでもっと大切なことは、プログラム完成の後にプログラムに対する仕様書(解説書)を残すことである。前にも述べたように、作成したプログラムは後に自分は勿論のこと他人が利用したり、修正したりすることが多々ある。このためプログラムを書いた人がその場にいなくても、プログラムに対する解説が文書になって残っていれば、プログラムの実行や修正が容易に行える。また、同様の理由から上記(1)から(5)のステップでも個別の仕様書を残す必要がある。


2.2 プログラムの実行過程

 2.1節のプログラミングのステップ(5)のプログラムを書くところでは、実際には正しいプログラムを書き、それを実行することを行わなければならない。プログラムの実行には、計算機でいくつかの処理を行う必要がある。本節では、プログラムを書きそれが実行されるまでの過程について解説する。1章でプログラムにもいろいろな種類があることを述べたが、解説の混乱を避けるために我々が書くようなプログラム(実行させたいプログラム)のことをソースプログラム(もしくは原始プログラム)と呼ぶ(一般的にもこのように呼んでいる)。実行過程は、以下の1−5のようである。

  1. 2.1節の手順に従ってソースプログラムを書く。

  2. コンパイラと呼ばれるプログラムによってソースプログラムの文法チェックを行い、エラーがなければ計算機の理解できる言葉に翻訳する。コンパイラで生成されたプログラムをオブジェクトモジュール(オブジェクトプログラム)と呼ぶ。もしここでエラーが検出されると、コンパイラはエラーのリストを出力し、エラーの場所と症状を知らせてくれる。エラーがなくならないと、次の処理に進むことができない。

  3. リンケージエディタと呼ばれるプログラムによって、2で生成されたオブジェクトモジュールとすでに用意されているオブジェクトモジュールを結合し、一つの実行型プログラム(ロードモジュールまたはロードプログラム)をつくる。すでに用意されたモジュールとは、よく利用される関数などをライブラリとして集めたものである。ライブラリについては後で詳しく解説する。

  4. ローダと呼ばれるプログラムにより、ロードプログラムをメインメモリ上にロード(コピー)する。

  5. ここで、はじめて1で作ったプログラムが実行される。

 上記過程を簡単に、1を「プログラミング」,2,3を「コンパイル」,4,5を「実行」と呼ぶことがある。計算機の処理系によって、3が実行に入ることもある。最近のコンパイラは、コンパイラとリンケージエディタは一つになっておりユーザはソースプログラムをコンパイラにかければロードモジュールができるようになっている。又、最近のOS(MS−DOSなど)はロードモジュール名をキー入力することにより、ロードモジュールのロードと実行を行うようになっている。図2−3に実行過程を示す。


図2−3 プログラムの実行過程

図2-3

2.3 虫のはなし

 完璧なソースプログラムを書き実行しようと思っても、2.2節で示した過程を最後までエラーなしに到達することは難しい。その原因となるプログラムのエラーをしばしば虫もしくはバクと呼ぶ。今後我々は、プログラムに潜む虫に悩まされることになるであろう。虫は次にように大きく3種類に分類できる。

 1つは、コンパイル時に発見され、文法に合わない記述やプログラムのタイプミスなどにより発生する虫である。初心者のプログラマによく住みつく虫で、ある程度プログラミングに慣れて来るとこの虫はすぐに退治できるようになる。

 2つめの虫は、リンク時もしくは実行時に発見される虫で、本来はタイプミスであってもプログラムは文法的には全くただしく、運よくか運悪くかコンパイル時に見つけられず、この時点になって異常な動きをして発見される。また、プログラマの考え違いにより発生することもあるため、アルゴリズムの設計等に戻って考え直す必要がある。

 3つめの虫は、最も面倒で見つけるのが大変な虫で、プログラムの実行結果が得られているにもかかわらず、意図した結果が得られない時に、潜んでいる虫である。上記2種類の虫は、計算機を通して何等かのエラーメッセージで我々に知らされるのに対して、この種の虫については全く知らされない。そのため、プログラマはアルゴリズムの考え方や入力データなどこと細かににチェックする必要がある。

 2,3の虫を発見するこつは、虫の潜む場所をいち早く特定することである。そのために実行の途中結果を逐次出力するなどして、プログラムを多少細工する必要がある。これについては、後に実際例を用いて解説する。

 ”プログラムは一日にしてならず”ですね。


練習問題

 ある数の約数をすべて求めるアルゴリズムとフローチャートを書く。


CONTENTS / BACK-PAGE / NEXT-PAGE