静岡理工科大学 総合情報学部 (by 菅沼) 菅沼ホーム 目次 演習解答例 付録 索引

第2章 プログラム作成手順

  1. 2.1 アルゴリズム
  2. 2.2 コーディング
  3. 2.3 コンパイル
  4. 2.4 連係編集
  5. 2.5 実行
  6. 2.6 Java に対する補足
  7. 演習問題2
  プログラムを作成する場合,その基本的な手順を C/C++ のプログラム風に表せば以下のようになります.

  1. 問題の明確化
  2. 以下の処理を希望する結果が得られるまで繰り返す {
    1. 問題を解くためのアルゴリズムを決める
    2. 以下の処理を誤りが無くなるまで繰り返す {
      1. 以下の処理を誤りが無くなるまで繰り返す {
        1. コーディング
        2. コンパイル
      2. 連係編集
    3. プログラムの実行

  まず,最初は,解決すべき問題が与えられ,それを明確にすることです.もちろん,その問題は,計算機によって処理可能な種類のものでなければなりません.計算機は様々な問題を処理できますが,必ずしも人間が処理できるすべての問題を扱うことができるわけではありません.従って,問題が与えられたら,それを計算機によって処理できるか否かの検討を行うことが最初の仕事になります.もし不可能であれば,問題を変更,もしくは,計算機による処理をあきらめざるを得ません.可能であれば,上の手順に従い,プログラムを開発していくことになります.以下,その手順に従い,詳細に説明していきます.

2.1 アルゴリズム

  与えられた問題を,どのような手順(アルゴリズム)に従って解決すべきかを検討します.通常,この問題解決の手順を表現するために,しばしば,フローチャート(流れ図)が使用されますが,本書では,先に使用した C/C++ 風の表現を用います.アルゴリズムは,一般に,日本語で書かれますが,実際に実現する際にはプログラミング言語を使用します.従って,この段階から,日本語レベルでなく,使用するプログラミング言語のレベルで考えるようにした方が良いと思います.

  アルゴリズムの例として,例えば,二次方程式( ax2 + bx + c = 0 )を解くためのアルゴリズムを以下に示します.

  1. 二次方程式の係数の入力
  2. もし,係数 a が 0 であれば以下の処理を行う {
    1. もし,係数 b が 0 であれば,
      1. 解が存在しないことを出力
    2. そうでなければ,
      1. 一次方程式として解を求める
  3. そうでなければ,以下の処理を行う {
    1. 判別式を計算する
    2. もし,判別式が 0 以上であれば,
      1. 二実根(重根を含む)を計算して出力
    3. そうでなければ,
      1. 虚根の実数部と虚数部を計算して出力

2.2 コーディング

  作成されたアルゴリズムに従って,何らかのプログラミング言語を使用してプログラムを作成することをコーディング( coding )といいます.通常,紙に書くのではなく,エディタを使用してコンピュータに直接入力し,適当なファイル名を付け,ディスク等に保存しておきます.この手続きによって生成されたプログラムを,原始プログラムソースプログラムsource program )と呼びます.

  ファイル名の付け方に絶対的な制約があるわけではありませんが,通常,C/C++ のプログラムの場合,「・・・.c」,「・・・.C」,「・・・.cc」,「・・・.cpp」等の拡張子が利用されます(「・・・」の部分は任意).ただし,Java の場合は,「・・・.java」という名前を付け,「・・・」の部分はそのファイルに定義されているクラス名(後述)と同じにする必要があります.

2.3 コンパイル

  残念ながら,コンピュータは,C/C++ のような高級言語で書かれた原始プログラムを直接理解(実行)できません.コンピュータが理解し,実行できるのは機械語( machine language )で書かれた命令だけです.

  そこで,日本語を英語に翻訳するように,C/C++ によって書かれたプログラムを,コンピュータが理解できる機械語に翻訳(コンパイル,compile )してやる必要があります.この翻訳を実行するソフトウェアをコンパイラ( compiler )と呼びます.コンピュータ及び対象とする言語により,様々なコンパイラが流通していますが,本書で使用するのは,主として,gcc というパソコン用の C/C++ に対するコンパイラです.

  原始プログラムをコンパイルすることによって得られるプログラムを,目的プログラムオブジェクトプログラムobject program )と呼びます.通常,原始プログラムの拡張子を「.o」,または,「.obj」に変更したファイル名で保存されます.つまり,原始プログラムが test.cpp であった場合,その目的プログラムは test.o,または,test.obj となります.ただし,コンパイラによっては,目的プログラムは暫定的に作成されるだけで,最終的にディスクに残らない場合があります(意図的に残そうと思えば残ります).

  原始プログラムは人間が作成したものです.従って,必ず誤りがあると言っても過言ではありません.もし,原始プログラム内に誤りがあった場合,コンパイラは,目的プログラムを作成することなしに,エラーメッセージを出力して停止します.このような場合,エディタを使用して原始プログラムを修正した後,再びコンパイルする必要があります.そして,完全に誤りが無くなるまで以上の処理を繰り返します.ここで注意しておきたいのは,コンパイラがチェックできる誤りは,文法上の誤り( syntax error )だけであるという点です.つまり,後に述べるように,この段階で誤りが無くなっても,必ずしも正しいプログラムであるとは限りません.

  プログラム上の誤りのことを,コンピュータ用語として,バグ(虫,bug )と呼び,また,誤りを修正することをデバッグ(虫取り,debug )と呼びます.

2.4 連係編集

  コンパイルすることにより,一応,コンピュータが理解できる言語に翻訳されますが,実は,このままの状態では実行できません.というのは,作成したプログラムは,通常,他のプログラムで定義している変数を参照したり,コンピュータシステム等が用意した汎用のプログラムを利用したりしています.

  例えば,二次方程式を解くためには,平方根の計算が必要になります.もし,システムが何ら助けを出してくれなければ,このプログラムも自分で書かなければなりません.幸いなことに,システムは,平方根を計算するプログラムを,sqrt という名前の関数という形で用意してくれています.しかし,原始プログラムをコンパイルしただけの目的プログラムには,通常,平方根を計算するためのプログラム sqrt が含まれていません.そこで,変数間の関係を明らかにしたり,不足したプログラムを付加したりする作業が必要になります.この作業を連係編集,または,単にリンクlink ),それを行うソフトウェアをリンケージ・エディタ( linkage editor )と呼びます.

  リンケージ・エディタは,先の目的プログラムとシステムが用意してある汎用プログラムの集まり(ライブラリlibrary,コンパイルされている)を入力として,実行可能プログラムを出力します.実行可能プログラムの名前は,何も指定しなければ,Windows の場合は a.exe,UNIX の場合は a.out という名前になります.

  この連係編集の段階においても,エラーメッセージが出力される場合があります.この場合も,エディタを使用して原始プログラムを修正した後,コンパイルからやり直す必要があります.最も多いエラーメッセージは,ある特定の処理を行うプログラムが存在しないと言うメッセージです.例えば,平方根を計算するために sqrt と書くつもりが,sqry と書いてしまった場合,gcc では,
	Undefined symbol _sqry ・・・・・
		
のようなエラーメッセージが出力されます.

2.5 実行

  以上の結果,実行可能プログラムが作成されたら,それを実行してみます.通常,実行可能プログラムの名前(ファイル名)を入力すれば実行できます.

  連係編集までの段階において全くエラーメッセージが出力されなかったとしても,実際に実行可能であるとは限りません.エラーメッセージを出力して(または,何も出力されないで),停止してしまう場合も多くあります.このときも,その原因を見つけた後,原始プログラムを修正し,コンパイルからやり直す必要があります.また,場合によっては,問題解決のアルゴリズム自体を変更する必要性が生じる可能性もあります.

  実際に答えが出力されたとしても安心しないで下さい.その答えが正しいか否かをチェックすると共に,他のいろいろなケース(例えば,二次方程式の場合は,a,b,及び,c の値のいろいろな組み合わせ)に対しても,正しい答えが得られるか否かを調べて下さい.

2.6 Java に対する補足

  C/C++ では,ソースプログラムをコンパイルすることによって,使用している CPU に固有な機械語に変換します.従って,作成された実行可能プログラムは少なくとも同じ CPU を搭載した計算機でしか実行できません.しかし,Java においては,コンパイルすることによって,機械語コードではなく,CPU に独立なバイトコードに変換されます.例えば,Test.java というソースファイルを
	javac Test.java
		
という方法によってコンパイルすると,Test.class というバイトコードで記述されたファイルが生成されます.このファイルは,
	java Test
		
と入力することにより,Java インタプリータがバイトコードの各命令を順番に実行していきます.従って,異なる CPU を持った計算機であっても,その計算機に java インタプリータ( Java 仮想マシン)がインストールされていれば,他の計算機でコンパイルされたプログラムも実行可能となります.

演習問題2

[問1]年齢を入力し,20 歳以上なら「大人」,そうでなければ「子供」と表示するためのアルゴリズムを書け.

[問2]一つの整数データを読み込み,その値がゼロなら「ゼロ」,正なら「正」,それ以外なら「マイナス」と表示するためのアルゴリズムを書け.

[問3] 3 つのデータを読み込み,その最大値を表示するアルゴリズムを書け.

[問4]試験の点数を読み込み,その点数が
60 点未満なら「不可」
60 点以上で 70 点未満なら「可」
70 点以上で 80 点未満なら「良」
80 点以上なら「優」
と出力するアルゴリズムを書け

[問5]正の整数値 n を読み込み,偶数の時はその値を 2 で割り,また,奇数の時はその値を 3 倍したものに 1 を加えるという処理を n の値が 1 になるまで繰り返す処理を行うアルゴリズムを書け.ただし,1 回の演算を行う毎に現在の n の値を表示するものとする.

静岡理工科大学 総合情報学部 (by 菅沼) 菅沼ホーム 目次 演習解答例 付録 索引