ログイン
kid's world

文字を表示する

前章では、よくやく一つのプログラムを作ることができました。しかしそれはただ単に「なにもしない」というプログラムでしかありませんでした。本章からはいよいよコンピュータに何か意味のある処理をさせます。本章では、プログラムの基本である「画面に文字を表示する」という処理を行わせる方法を学習します。さらに、main関数とは別の関数をもう一つ作り、それを呼び出す方法を解説します。


画面に文字を表示する文

初めて作ったプログラムの感想はいかがでしたか? なにも表示されないのでつまらないですね。というわけで、早速ですがコンピュータになにか表示させるプログラムを作ってみましょう。もちろん「何か表示しろ」と日本語で書いても動いてくれません。C++言語では表示するために「cout」という命令を使います。

具体的に画面に何らかの文字を表示するには、文を以下のように書きます。

cout << 表示したいもの;

残念ながら、coutではグラフィックは表示できません。表示できるのは、文字として表現できるものだけです。つまり文字そのものや、数値などです。例えば、「10」という数値を表示したければ、

cout << 10;

と書きます。「Hello!」という文字列を表示したければ、

cout << "Hello!";

とします。ここで「文字列」という言葉を何気なく使いましたが、「A」や「B」など、文字の連なりのことを「文字列」と言います。C++言語では、文字列は必ずダブルクォート「"」で囲まなくてはなりません。ですから、

cout << Hello!;	// これは誤り

は誤りです。しかし、

cout << "10";

は誤りではありません。ただしこの場合、コンパイラは「10」を数値ではなく、文字として処理するという違いがあります。


note:

二つ上の例に、「//」という記号がありますが、この記号の後には、その行に限り何をかいても構いません。プログラムが分かりづらくなってきたときは、このようにして適切な説明文をつけると、プログラムが読みやすくなります。このような注釈文のことを「コメント」と言います。コメントには、「//」のほかにも、次の例のように「/*」と「*/」で囲む方法があります。

cout << "Hello!";    /* Hello!と表示します */

画面に文字を表示するプログラム

では、ここまでの知識で、数字の10と、「Hello!」という文字列を表示するプログラムを作ってみましょう。まず、以前に作った、なにもしないプログラムを見てみます。

void main()
{
}

前章で述べたように、文を書く場所は、「{」と「}」で囲まれた部分でした。ですから、

void main()
{
  cout << 10;
  cout << "Hello!";
}

というプログラムになります。プログラムは上から実行されていくので、10が表示されて、次に「Hello!」が表示されるはずですね?


note:

「cout」の左側にスペースが入っていますが、これはプログラムを見やすくするための一つの方法で、「インデントを入れる」などと言います。関数の中に文を書く際は、このようにして左側にスペースを入れるのが一般的です。

プログラムが複雑になってくると、どれが関数の名前で、どれが中身の文なのかが分かりづらくなってきます。それを防ぐために、このようにわざと目立つようにスペースを入れるのです。これは人間がソースファイルを見るときに便利なだけで、コンパイラはこの空白を無視しますので関係ありません。

本書では、半角で2つ分のスペースを入れていますが、これはプログラマによって自由に決めて構いません。スペースではなく、タブ記号を使うこともあります。ただし、例えば本書のように「スペース2つ分」と一度決めたら、そのルールは守りつづけるべきです。


では、前章で作成したソースファイルの中身を以上のように書き換え、コンパイルしてみましょう(以下は、Borland C++ 5.5を使ったコンパイルの例です)。

コンパイル例:

C:\cpp>bcc32 first1.cpp
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
first1.cpp:
エラー E2451 first1.cpp 3: 未定義のシンボル cout(関数 main() )
*** 1 errors in Compile ***

C:\cpp>

なんと、予想に反してエラーになってしまい、実行ファイルは生成されませんでした。表示されたエラーのメッセージをよくみてみると、「未定義のシンボル cout」と書かれた部分があります。どうやら、コンパイラはcoutが理解できなかったようです。

iostreamをインクルードする

文字を表示するためには「cout」を使わなければなりません。それにもかかわらず、コンパイラは「そんなものは知らない」と言ってエラーを表示して、コンパイルを中止してしまいました。では、どうすればいいのでしょうか。

答えは単純です。コンパイラは「cout」を知らなかったので、それを教えてやればいいのです。しかしその答えの単純さに対して、それを実現することはまったくたやすいことではありません。なぜならそのような「cout」をコンパイラに教える、つまり「cout」というプログラムを作るには、パソコンのハードウェアとオペレーティングシステムを熟知して、どのようにすれば画面に文字を表示できるのかを知った上で、うまく文字を表示できるプログラムを作らなければならないからです。

もちろん、初心者の私たちには、そのようなことはできません。だからといって、画面に文字を表示することをあきらめる必要はありません。

実は、「cout」など、プログラムを作る上での基本的に必要とされる重要な機能は、コンパイラとは別に、ライブラリという形で提供されています。例えば今問題となっている「cout」は、「iostream」という名前のライブラリの中に含まれています。ライブラリは、プログラムの最初の部分で、以下のように記述しておくだけで使うことができます。

#include <iostream>
using namespace std;

この作業を、

iostreamをインクルードする

となどと言います。「#include」や「namespace」など初めてお目にかかるキーワードがたくさん出てきましたが、これらは決まり文句ですので、このまま覚えてしまって下さい。これに従い、以下のようにプログラムを書きかえれば、エラーが出ることなく、コンパイルすることができます。

#include <iostream>
using namespace std;

void main()
{
  cout << 10;
  cout << "Hello!";
}

では、コンパイルして、実行してみましょう。

C:\cpp>bcc32 first1.cpp
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
first1.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\cpp>first1
10Hello!
C:\cpp>

エラーが出ることもなく、実行も無事に終了しました。


note:

この書き方は、標準C++に対応したコンパイラで通用するものです。古いコンパイラではコンパイルできずに、エラーになることがあります。そのときは、

#include <iostream>
using namespace std;

の部分を

#include <iostream.h>

と置き換えてコンパイルしてください。しかし本サイトでは、従来のコンパイラにはない新しいライブラリを多く利用しますので、なるべく最新のコンパイラを利用するようにしてください。


改行をさせる

実行結果は、期待した通りのものになりましたか? ちょっと違う気がしますね。多くの方は、

10
Hello!

と表示されると思われたのではないでしょうか。

実は、coutは「改行しなさい」といわれなければ、いつまでたっても改行せずにずらずらと一行に表示してしまいます。これはcoutに限らず、プログラミングするときはいつもそうなのですが、コンピュータはプログラマにおんぶにだっこですべての判断を任せます。改行しろというまでは、決して改行しないのです。コンピュータはプログラマに素直に従いますが、柔軟性はまったくありません。プログラムに柔軟性を与えるのは、プログラマであるあなたなのです。できのよいプログラムは、腕のよいプログラマから生まれます。

話が脱線しましたが、coutには「改行」という特別な意味を持たせた「endl」という、マニピュレータと呼ばれるものが用意されていますので、これを使って改行をさせます。使い方は簡単です。改行したい時に、以下のような文を書きます。

cout << endl;

よって、先ほどのプログラムは、以下のように書きかえることで、意図した通りの表示をしてくれるようになります。

#include <iostream>
using namespace std;

void main()
{
  cout << 10;
  cout << endl;
  cout << "Hello!";
  cout << endl;
}

実行結果:

C:\cpp>first1
10
Hello!

C:\cpp>

coutを一度だけ使って表示させる

先ほどの例のようにわざわざcoutを4回も使わなくても、実は以下のようにすることで、coutを一度だけ使って以前のプログラムとまったく同じ表示をさせることができます。

#include <iostream>
using namespace std;

void main()
{
  cout << 10 << endl << "Hello!" << endl;
}

このように、

「<< 表示したいもの」

の形式で連続して書くことによって、一つのcoutで連続して数値や文字列を表示することができます。

計算をさせる

ここまでの解説で、ようやく文字を表示させるプログラムを作ることができるようになりました。次は、コンピュータに計算をさせてみましょう。コンピュータに計算をさせて、その結果を表示させることは、とても簡単なことです。以下のプログラムは、10と20を足し算した結果である「30」を表示します。

#include <iostream>
using namespace std;

void main()
{
  cout << 10 + 20 << endl;
}

このように、プログラムの中で普通の数学の式を書くようにして、コンピュータに計算をさせることができます。

キーボードには掛け算や割り算の記号がありませんが、それらはアスタリスク「*」とスラッシュ「/」を使います。これらの記号を「演算子」と言います。以下に計算に関する演算子(算術演算子)の中から、よく使われるものを表にします。

記号名前意味
+加算演算子足し算の結果を返す
-減算演算子引き算の結果を返す
*乗算演算子掛け算の結果を返す
/除算演算子割り算の結果を返す
%剰余演算子割り算を行ない、余りを返す

これらの演算子には数学で習った計算と同じように優先順位がありますので、

cout << 10 + 20 * 30 << endl;

という分は、まず「20 * 30」の掛け算が先に計算されて、その結果に10が足されます。よって「610」が画面に表示されます。優先順位をかえたければ、括弧を使うことができます。括弧で囲まれた部分は優先順位のいかんに関わらず、優先的に計算されます。ですから、

cout << (10 + 20) * 30 << endl;

は、900と表示されます。いろいろな計算をさせて、正しく計算されているかどうかを確認してみましょう。


note:

いくつかこのようなプログラムを書いていると分かりますが、まれに正しい答えが表示されないことがあります。例えば、割り算をさせても小数点以下が表示されないことがあります。これはコンピュータが計算を間違えたわけではなく、必ずそれなりの理由があります。これについては後ほど解説します。


挨拶する関数

ここまではmain関数ひとつのプログラムを作ってきました。少し気が早いかもしれませんが、main関数とはもう一つ別の関数を作って、それをmain関数から呼び出すというプログラムを作ってみましょう。

現在の段階ではまだ、文字を表示することや、簡単な計算をさせることしかできませんので、「文字を表示する関数」を作ってみることにします。この関数を呼び出すと、画面に「Hello!」と表示するようにします。関数名も、「hello」という名前にしましょう。では、main関数を作ったときのことを思い出して、hello関数を書いてみましょう。

void hello()
{
  cout << "Hello!" << endl;
}

関数は書けましたが、この関数をmain関数よりも上に書くか、下に書くかという疑問が浮かびます。しかし、関数を書く位置は、どこでも構いません。main関数よりも上でも、下でも大丈夫です。ただし、混乱しないためにも、書き方をどちらか一方に決めるということは大事なことです。本サイトでは、main関数を一番上に書く方式で統一します。

[図 02-01: 本書での関数を書く順序]

ところで、main関数を作ったときには触れませんでしたが、C++言語においては、main関数を除き、関数をプログラム中に書くときは必ず「プロトタイプ宣言」と呼ばれる宣言をしなければなりません。C++言語では、「宣言」と「定義」という言葉がたくさん出てきますが、簡単に言えば、

宣言は、コンパイラにこれから使う名前と性質を教えること

であり、

定義は、宣言されたものの実体

であるといえます。つくまり、関数に関おいては、

宣言=プロトタイプ宣言

定義=先ほど書いた関数そのもの

という関係になっています。プロトタイプ宣言とは、関数名とともに、関数がどのようなデータ型を返し、どのような引数を取るのかをコンパイラに教えるものです。次のような文法で宣言します。

戻り値の型 関数名(引数リスト);

すぐに分かると思いますが、これは、関数(の定義)の最初の一行に、セミコロン「;」がついただけのものです。よってhello関数のプロトタイプ宣言は、

void hello();

となります。プロトタイプ宣言は、全ての関数よりも前の部分に書くようにします。

次は関数を呼び出す方法です。関数は呼び出されなければ、その関数の中にある文が実行されることはありません。よってmain関数の中に、hello関数を呼び出す文を書きます。関数を呼び出す方法は簡単です。次のような文を書きます。

関数名(引数リスト);

ですから、hello関数を呼び出すには、

hello();

という文を書きます。

以上で、必要な知識は全てそろいました。プロトタイプ宣言をすることを忘れずに、プログラムを書いてみましょう。以下のプログラム例では、分かりやすいようにコメントをつけてあります。

#include <iostream>
using namespace std;

void hello(); //hello関数のプロトタイプ宣言

void main()
{
  hello(); //hello関数の呼び出し
}

//hello関数の定義
void hello()
{
  cout << "Hello!" << endl;
}

実行結果

hello!

関数を書くメリット

上の例では、このような関数を書くメリットは、あまり感じられないかもしれません。しかしhello関数は、「Hello!という文字を画面に表示する」という立派な仕事をしてくれる、部品であることに間違いはありません。ここで大事なことは、

ということです。すなわち役割が明確に分担されているということです。このように役割を分担することによって、

というメリットが生まれます。コンピュータに対してのみメリットがあるわけではなくて、プログラマに対してのメリットが多くあるということに注意してください。

というのは、プログラムがどんどん複雑になればなるほど、機能を拡張したり、バグが見つかったときにそれを訂正することが大変になってくるのです。しかし関数という部品に別れていれば、問題のありそうな部品を調べるだけでよくなるのです。しかも、うまく役割を分担して関数を多用すれば、かなり複雑なプログラムも、意外と簡単に作ることができ、どこに何が書いてあるのかが楽にわかるようになります。

例えば後からメッセージを1回ではなく、3回表示したいと思ったら、main関数を、

void main()
{
  hello();
  hello();
  hello();
}

と変更するだけで、同じメッセージが3回表示されるようになります。さらに、表示するメッセージを変えたいと思えば、例えばhello関数を

void hello()
{
  cout << "こんにちは、私の名前は小出俊夫です。" << endl;
}

などと書けばよいことになります。

繰り返しになりますが、重要なことは、役割分担をしっかりしてあるので、main関数はhello関数がどのようにして文字を表示しているかを気にすることなく、単純に

hello();

と書けばよく、hello関数は、main関数から(もしかしたら他の関数からかもしれません)どのように呼び出されるかを気にとめることなく、画面に文字を表示する文字や、その方法を勝手に決めることができるということです。

もし関数を使わなかったら…上の例ではまだなんとかなりますが、プログラムが複雑になればなるほど、ずらずらと長いmain関数を書かなければならず、どこに何が書いてあるのかも楽につかみとることかできずに、大変なことになります。

まとめ

戻り値の型 関数名(引数リスト);
関数名(引数リスト);

キーワード

広告


©Toshio Koide 1996-2007.

目次

リンクについて

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

メール

mail.gif

広告