- 2.1 アルゴリズム
- 2.2 コーディング
- 2.3 コンパイルと実行
- 演習問題2
- プログラムを作成する場合,その基本的な手順を Java のプログラム風に表せば以下のようになります.
- 問題の明確化
- 以下の処理を希望する結果が得られるまで繰り返す
- 問題を解くためのアルゴリズムを決める
- 以下の処理を誤りが無くなるまで繰り返す
- コーディング
- コンパイル
- プログラムの実行
- まず,最初は,解決すべき問題が与えられ,それを明確にすることです.もちろん,その問題は,コンピュータによって処理可能な種類のものでなければなりません.コンピュータは様々な問題を処理できますが,必ずしも人間が処理できるすべての問題を扱うことができるわけではありません.従って,問題が与えられたら,それをコンピュータによって処理できるか否かの検討を行うことが最初の仕事になります.もし不可能であれば,問題を変更,もしくは,コンピュータによる処理をあきらめざるを得ません.可能であれば,上の手順に従い,プログラムを開発していくことになります.以下,その手順に従い,詳細に説明していきます.
- 2.1 アルゴリズム
- 与えられた問題を,どのような手順(アルゴリズム)に従って解決すべきかを検討します.この問題解決の手順を表現するために,しばしば,フローチャート(流れ図)が使用されますが,本書では,先に使用した Java 風の表現を用います.アルゴリズムは,一般に,日本語で書かれますが,実際に実現する際にはプログラミング言語を使用します.従って,この段階から,日本語レベルでなく,使用するプログラミング言語のレベルで考えるようにした方が良いと思います.
- アルゴリズムの例として,例えば,二次方程式( ax2 + bx + c = 0 )を解くためのアルゴリズムを以下に示します.
- 二次方程式の係数の入力
- もし,係数 a が 0 であれば以下の処理を行う
- もし,係数 b が 0 であれば,
- 解が存在しないことを出力
- そうでなければ,
- 一次方程式として解を求める
- そうでなければ,以下の処理を行う
- 判別式を計算する
- もし,判別式が 0 以上であれば,
- 二実根(重根を含む)を計算して出力
- そうでなければ,
- 虚根の実数部と虚数部を計算して出力
- 2.2 コーディング
- 作成されたアルゴリズムに従って,何らかのプログラミング言語を使用してプログラムを作成することをコーディング( coding )といいます.通常,紙に書くのではなく,エディタを使用してコンピュータに直接入力し,適当なファイル名を付け,ディスク等に保存しておきます.この手続きによって生成されたプログラムを,原始プログラム(ソースプログラム,source program )と呼びます.
- ファイル名の付け方に絶対的な制約があるわけではありませんが,Java のプログラムの場合,「・・・.java」という名前を付け,「・・・」の部分はそのファイルに定義されている public 指定があるクラス名(後述)と同じにする必要があります.なお,C の場合は「・・・.c」,C++ の場合は「・・・.cpp」のような名前を付けるのが一般的です.
- 2.3 コンパイルと実行
- 残念ながら,コンピュータは,Java のような高級言語で書かれた原始プログラムを直接理解(実行)できません.コンピュータが理解し,実行できるのは機械語( machine language )で書かれた命令だけです.そこで,日本語を英語に翻訳するように,Java や C/C++ によって書かれたプログラムを,コンピュータが理解できる機械語に翻訳(コンパイル,compile )してやる必要があります.この翻訳を実行するソフトウェアをコンパイラ( compiler )と呼びます.例えば,ソースプログラムが Test.java( C/C++の場合:test.c,test.cpp )であった場合,以下に示すようなコマンドを使用してコンパイル可能です.
- javac Test.java (ソースプログラムが Shift JIS で書かれている場合)
- javac -encoding utf-8 Test.java (ソースプログラムが utf-8 で書かれている場合)
- gcc test.c ( C の場合)
- g++ test.cpp ( C++ の場合)
- g++ test.cpp -std=c++17 -o test C++17 の機能を利用(g++)
- cl test.cpp /std:c++17 C++17 の機能を利用(visual C++)
- 上記のようなコマンドを実行すると,Java の場合は Test.class,C/C++ の場合は a.exe ( UNIX や LINUX の場合が a.out )というプログラム(ファイル)が作成されます.C/C++ の場合は,作成されたプログラム名をコマンドプロンプトから入力するだけで実行可能ですが,Java の場合は,完全な機械語に翻訳されず,クラスファイルという中間言語(バイトコード)で記述されたファイル Test.class が出力されるため,Test.class を Java VM( Virtual Machine )という一種のインタープリータによって解釈してやらなければなりません.つまり,実行するためには,
- java Test
- というコマンドを入力してやる必要があります.面倒に思われるかもしれませんが,この点は Java の長所にも繋がっています.C/C++ の場合,ある CPU を搭載したコンピュータでコンパイルされたプログラムを,異なる CPU を搭載したコンピュータでそのまま実行することは不可能です.そのコンピュータにおいて再度コンパイルしてやる必要があります.しかし,Java の場合は,そのコンピュータに Java VM がインストールされていれば,どのコンピュータでコンパイルされたプログラムであっても,再コンパイルすることなしにそのまま実行可能となります.
- 原始プログラムは人間が作成したものです.従って,必ず誤りがあると言っても過言ではありません.もし,原始プログラム内に誤りがあった場合,コンパイラは,コンパイル結果を出力することなしに,エラーメッセージを出力して停止します.このような場合,エディタを使用して原始プログラムを修正した後,再びコンパイルする必要があります.そして,完全に誤りが無くなるまで以上の処理を繰り返します.プログラム上の誤りのことを,コンピュータ用語として,バグ(虫,bug )と呼び,また,誤りを修正することをデバッグ(虫取り,debug )と呼びます.
-
- コンパイルエラーがなくなったら,それを実行してみます.コンパイルまでの段階において全くエラーメッセージが出力されなかったとしても,実際に実行可能であるとは限りません.エラーメッセージを出力して(または,何も出力されないで),停止してしまう場合も多くあります.このときも,その原因を見つけた後,原始プログラムを修正し,コンパイルからやり直す必要があります.また,場合によっては,問題解決のアルゴリズム自体を変更する必要性が生じる可能性もあります.
- 実際に答えが出力されたとしても安心しないで下さい.その答えが正しいか否かをチェックすると共に,他のいろいろなケース(例えば,二次方程式の場合は,a,b,及び,c の値のいろいろな組み合わせ)に対しても,正しい答えが得られるか否かを調べて下さい.
- [問1]年齢を入力し,20 歳以上なら「大人」,そうでなければ「子供」と表示するためのアルゴリズムを書け.
- [問2]一つの整数データを読み込み,その値がゼロなら「ゼロ」,正なら「正」,それ以外なら「マイナス」と表示するためのアルゴリズムを書け.
- [問3] 3 つのデータを読み込み,その最大値を表示するアルゴリズムを書け.
- [問4]試験の点数を読み込み,その点数が
- 60 点未満なら「不可」
- 60 点以上で 70 点未満なら「可」
- 70 点以上で 80 点未満なら「良」
- 80 点以上なら「優」
- と出力するアルゴリズムを書け
- [問5]正の整数値 n を読み込み,偶数の時はその値を 2 で割り,また,奇数の時はその値を 3 倍したものに 1 を加えるという処理を n の値が 1 になるまで繰り返す処理を行うアルゴリズムを書け.ただし,1 回の演算を行う毎に現在の n の値を表示するものとする.