ログイン
kid's world

プログラムを作るには

本章では、C++言語の最も基本的な構造(文法)について解説をし、それに則った簡単なプログラムを書き、実際にそのプログラムを実行してみます。


本サイトで学ぶこと

プログラムとは、例えばMicrosoft OfficeのWordやExcelに代表されるようなアプリケーション・ソフトウェアや、オペレーティング・システムであるWindowsやUNIXそのもののことを言います。つまりプログラムとは、コンピュータになんらかの作業をさせたいときに必要な道具のようなものです。コンピュータを使用するユーザは、この「プログラム」と呼ばれる道具をコンピュータの上で動かすことによって、自らが望む結果を得ようとするわけです。

ではそのプログラムは、一体何からできているのでしょうか。簡単に言ってしまうと、

コンピュータにさせたい仕事をずらずらと列挙したもの

から成り立っています。コンピュータはいったん「このプログラムを実行しろ」と命令されると、そのプログラムの中に書かれている仕事を、一つ一つ順々に読んで、文句もいわずにたんたんと処理していきます。例えばこんな感じです。

(例)計算プログラムA

次の文字を表示しなさい:「こんにちは」
次の計算をして、結果を表示しなさい:「10+29」
このプログラムの実行を終了しなさい

このような仕事が書かれている「計算プログラムA」を実行させると、コンピュータは「こんにちは」を表示し、次に「39」を表示して、実行を終えます。

しかし、実際にはこのような日本語でプログラムが書かれているわけではありません。プログラムを作るには、「プログラミング言語」と呼ばれる、特別な言語が用いられます。その種類は、機械語、FORTRAN、COBOL、ALGOL、BASIC、Pascalなど極めて多くのものがありますが、その中でも私たちはC++というプログラミング言語を学びます。

本書ではWindowsなどのオペレーティング・システムで動くようなウィンドウを持ったグラフィカルなプログラムを作るところまでは解説しません。その解説は他のいくつもの良書に任せることにして、本書ではそのようなプログラムを作るのに必要不可欠である、プログラミング言語「C++言語」のみを解説することにします。

プログラムに必ず存在するもの−その1−「文」

C++言語によって記述されるプログラムには、必ず「文」と呼ばれるものが存在します。

「文」

文には、たとえば文字の表示や入力の受け付けなど、コンピュータに行わせたい処理がかかれています。日本語の文は必ず最後が「。」で終わっていますが、C++言語も同じように、必ずセミコロン「;」で終わります。

なんたらかんたら; ←最後の「;」に注目!

私たちの周りには数え切れないほどのプログラムが存在し、それぞれがそれぞれの目的に応じて様々なことを行なうことができますが、C++言語でこのようなプログラムを作る場合は、これらはすべて文によって実現します。実際にどのような文を書けばよいのかは、あとで詳しく説明しますが、基本的に、

コンピュータに行なわせたいことを文として書く

ということが、C++言語でのプログラミングの基本的な概念だということを、ここでは覚えておいてください。

ただし、次第に明らかになってきますが、C++の文は、日本語の文とは異なり、複雑なことを一文で表現することはできません。そこで、必ずといっていいほど、いくつもの文を並べて書くことになります。

「文1」
「文2」
「文3」
  …

日本語とまったく同じように、C++言語においても、文は最初から一つずつ順番に読むというルールがあります。つまり、最初から一つずつ順番に実行されていきます。よって上のようなC++言語のプログラムを書いた場合は、

「文1」→「文2」→「文3」→…

という順番で、文にかかれている内容が実行されていきます。

プログラムに必ず存在するもの−その2−「関数」

プログラムの中には必ず分が存在するということが分かりました。しかし実は、文はC++のプログラムに単独で存在することができず、「関数」と呼ばれるものの中に入っていなければならないというルールがあります。イメージとしては、次のようになります。

「関数
  「文1」
  「文2」
  「文3」
」

関数と言われると、数学で習った関数を思い出しますが、これとは全く別物であると思ってください。「数」という文字に惑わされ、C++の関数は数を返すものだと思ってしまうと、混乱を招きます。C++の関数は、基本的には

いくつかの文を一つにまとめたかたまり

であると理解してください。

「関数」は、文と同じようにプログラムの中にいくつでも存在することができます。

「関数1」
「関数2」
「関数3」
 …

しかし、関数は文とは違って、

「関数1」→「関数2」→「関数3」→…

という順番で実行されるわけではありません。以上をまとめると、

C++言語で書かれたプログラムには、必ず一つ以上の関数が存在し、

それぞれの関数の中には必ず一つ以上の文が存在する

ということになります。

[図 01-01: プログラムは関数と文の集まり]


note:

「それぞれの関数の中には必ず一つ以上の文が存在する」という文は、厳密には誤りで、実は文を含まない関数を書くこともできます。また、関数の外にある文も存在します。しかし本章ではC++言語の基本的な思想を解説するために、あえてこのような表現をとりました。


関数は呼びだされる

次は、関数はどのように実行されるのかを解説します。C++言語における関数とは、

「なにか」から呼ばれて実行されるもの

であって、そこに存在しているだけでは何も起きません。呼ばれて初めて、その関数の中に含まれている文が上から順番に実行されていきます。この実行の流れを図で説明すれば、以下のようになります。

[図 01-02: 関数は呼ばれるもの]

では、関数は何によって呼び出されるのでしょうか。その答えの一つが「文」です。関数は文によって呼び出すことができます。たとえば「関数1」という関数があったとします。この関数を呼び出したければ、

関数1;

という文を書きます。すると、この文が実行されるときに、関数1が呼び出されて、関数1に含まれている文が実行されます。


note:

これは関数の呼ばれる概念を説明しているのであって、実際にはこのような書き方はしません。正しい書き方は、後で詳しく説明します。


プログラムはどのようにして動き始める?

関数は文から呼ばれて初めて動くと説明しました。そして、プログラムはその関数がいくつか合わさって構成されているということを学びました。しかし、ここで一つの疑問が生じます。

そもそも、そのプログラムは、どのようにして動き始めるのだろうか?

プログラムは文が実行されることによって何らかの処理を行います。しかし、文は必ず関数に含まれなければなりません。それらの文は、それが所属している関数が呼ばれない限り、決して実行されることはありません。まさに「鶏が先か卵が先か」という話になってしまいます。

[図01-03: はたしてこの関数1はどうやって呼び出されるのだろうか]

しかし答えは簡単です。プログラムが動き始める時には、必ずプログラムの中に存在する関数のうちの、どれか一つが呼ばれるのです。しかもその初めて呼ばれる関数は勝手に選ばれるわけではありません。その名も「main」という名前のついた関数が呼び出されます。つまり言い換えれば、

C++言語で書かれたプログラムには、必ずmainという名前の関数がある

ということになります。main関数を呼び出すのはそのプログラム自身ではなく、オペレーティング・システムです。オペレーティング・システムは、ユーザから「このプログラムが実行したい」と要求されると、そのプログラムにあらかじめ用意されているmain関数を呼び出すことによって、プログラムを実行を開始するわけです。

[図01-04: オペレーティング・システムから呼び出されるmain関数]


note:

 厳密にはオペレーティングシステム側からはmainという関数を呼び出すという操作を行っているわけではありませんが、C++のプログラムの概念としては適当な説明であるので、このような解説をしています。


日本語からC++言語への翻訳

 では、いよいよ画面に「こんにちは」と表示するプログラムを書いてみましょう。ためしに、次のようなプログラムを書いてみます。

「main関数
 「こんにちは」を表示して下さい。
 この関数の処理はこれで終わりです。
」

ところが、上記のプログラムは、C++言語のプログラムの概念に一致してはいるものの、実際には通用しません。なぜなら、日本語には日本語流の書き方があるように、C++言語にはC++言語流の書き方があるからです。上に書いたプログラムは「日本人」には理解できますが、「コンピュータ」には理解できない代物です。そこで、プログラムを作る張本人である人間が、コンピュータが理解できるC++言語に翻訳しながら、自分がコンピュータにさせたいことを書いていかなければなりません。

それこそが、本サイトで学ぶことです。

C++言語流の関数の書き方

では、C++言語の文法にのっとった関数の書き方を解説します。先ほど紹介した関数は、以下のような書式で書くことが決められています。

戻り値の型 関数名(引数リスト)
{
  文のリスト
}

この書式にのっとってプログラムを書けば、私たちがコンピュータに言いたいことが理解してもらえるようになります。

いくつか新しいキーワードがでてきましたので、ここで解説しておきます。現在はまだ必要ではない知識も含まれていますので、分からないところがあっても構いません。実際に使うようになったら、再び詳しく説明します。

引数リスト

関数は文によって呼び出す際に、何らかの情報を与えて呼び出すことが可能です。その情報は、「引数」によって受け渡されます。引数は数値かもしれませんし、文字かもしれません。そもそも、その関数を呼び出すときに何も情報を必要としないのであれば、「引数リスト」の部分には何も書かなくてもかまいません。

本章では、引数は使用しないので何も書きません。引数を使った関数呼び出しの例は、後で詳しく解説します。

文のリスト

前述のように、関数は呼び出されると、自分に含まれている文を、上から順番に実行していきます。その文は、「文のリスト」の部分に書きます。

戻り値の型

関数は、呼び出されるときに引数として情報を受け取るだけではなく、何らかの処理をしたその結果を、関数を呼び出した文へ返すこともできます。その情報は引数と同様に、返す値は数値でも、文字でもなんでも構いません。その値のことを「関数の戻り値」や、「関数値」といいます。もちろん、何も値を返さないようにすることもできます。

少々面倒ですが、関数を書くときには、必ずどのような値が関数値として返されるのか(例えば文字なのか、整数値なのか)を明確に書いておかなければなりません。その値の種類のことを「データ型」といいます。例としてデータ型のなかでよく使われるものを以下にあげておきます。データ型については後で詳しく解説します。

整数値=int, long
実数値=float, double
値なし=void

関数から値を返すには「return」という文を使いますが、この文の使い方、および返された情報をどのように受け取るかについても、後で詳しく説明します。本章では値を返す関数は作りませんので、return文の説明はしません。戻り値の型として、値を返さない「void」という型名を使います。

ちょっと難しかったでしょうか。でも概念的に難しいことではないはずです。理解できないというよりは、最初からいろいろ出てきて記憶しづらいと言った方が正確かもしれませんね。これからも覚えにくい専門用語が出てくるのですが、一つ一つしっかりと覚えていってください。仮に覚えられなかったとしても、その概念を理解することだけは必ずしてください。

main関数を作る

ここまで分れば、「何もしない」関数であれば書くことができます。では実際に書いてみましょう。もう一度、以下に関数の文法を示します。

戻り値の型 関数名(引数リスト)
{
  文のリスト
}

今回は引数を必要としないので、空欄にしておきます。

戻り値の型 関数名()
{
  文のリスト
}

関数名は、オペレーティング・システムから呼び出される名前である、「main」とします。このようにしておけば、プログラムが実行されるとこの関数が呼び出されるので、都合が良いですね。

戻り値の型 main()
{
  文のリスト
}

この関数では何も処理を行ないませんので、値を返すこともありません。よって、戻り値の型はvoidとします。

void main()
{
  文のリスト
}

最後に、この関数は何も処理しないのですから、文は書きません。

void main()
{
}

これで、C++言語の文法に則ったプログラムを書くことができました。

コンパイルと実行

では、実際にこのプログラムを実行してみましょう。プログラムを実行するためには、「実行ファイル」が必要となります。Windowsでは、「.exe」という拡張子のついたファイルが、実行ファイルであり、エクスプローラなどでみると、色々な形をしたアイコンとして見ることができます。


note:

拡張子とは、ファイル名に存在する最後のピリオド「.」より後ろの文字のことです。Windowsでは、初期設定では拡張子を表示しないようになっていますので注意してください。この文字によって、ファイルの種類(プログラム、テキスト、画像、音声など)を区別しています。


しかし、実行ファイルの中に上記のプログラムがそのまま書いてあるわけではありません。実行ファイルは、C++言語よりも難しい、コンピュータが直接理解できる言葉、「機械語」で書かれています。

幸いなことに、私たちはその難解な機械語を知る必要はなく、C++言語から機械語に自動的に翻訳をしてくれるソフトウェアが存在します。それが「コンパイラ」です。

コンパイラはC++言語によって書かれたファイル、「ソースファイル」を渡されると、それを機械語に翻訳し、実行ファイルを生成してくれます。この作業を「コンパイル」と言います。

ソースファイルを作るには「エディタ」と呼ばれるソフトが必要になります。Windowsではメモ帳がその役割を果たしてくれます。

以上のことを整理して一つの図にまとめると、以下のようになります。

[図01-05:ソースファイルから実行ファイルができるまで]


note:

実際には、実行ファイルの生成には、コンパイラによるコンパイルの他に、リンカによるリンクという作業をしなければなりません。しかし本章では、これらの一連の作業を簡単にコンパイルと言っています。


ソースファイルを作る

ソースファイルの拡張子は、「.C」、「.cc」、「.cpp」、「.cxx」など、いろいろなものがあります。Windowsでは「.cpp」が一般的で、UNIXやLinuxでは、「.cc」や「.C」が一般的です。本書では「.cpp」で統一することとします。

ソースファイルの書き方、コンパイルの仕方、実行の仕方はオペレーティング・システムの違いなどによって異なるため、本章では解説しません。実にさまざまな方法がありますので、プログラミング経験者などに聞いてみてください。Windows、UNIXでの作業例は、付録にありますので、それを参考にして、実際にプログラムをコンパイルして実行してみてください。

さて、プログラムを作ることはできましたか? 実行は出来ましたか? 実際に実行すると分かりますが、どのオペレーティング・システムを使用していても、どのコンパイラを使用していても、生成された実行ファイルを実行しても何も起こらなかったはずです。これはあたりまえのことです。なぜなら、mainという関数は作りましたが、その中にはなにひとつとして文を書かなかったからです。しかし、なにも表示されないこの間に、main関数がオペレーティングシステムから呼び出されたということを、頭の中でイメージして、再確認しておいて下さい。これはプログラムがどんなに複雑になっても変わることのない基本的な概念です。

[図01-06:このプログラムの実行の流れはこうなっていた]

まとめ

戻り値の型 関数名(引数リスト)
{
  文のリスト
}

キーワード

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告