C++によるプログラミング入門3
cinを使った入力
こんにちは。前回は画面への出力を見ました。今回はキーボードから入力する方法を学びます。
今回は「コンピュータが名前をきいて、それに答えると、コンピュータがあいさつする」というようなプログラムを考えてみましょう。まず、コンピュータは本当に質問したりしませんから、そのように見せかける必要があります。それは前回やったcoutでできそうです。
しかし、「質問された人」(これからは、「ユーザ」といいます)の入力はどうやって受け取ればよいでしょう。入力を受け取るためには、まず、入力をいれる「いれもの」が必要です。
実は、名前のような文字の列をいれる「いれもの」は
string name;
ここでstringは、「文字列」という意味です。こうすると、「文字列」をいれる「いれもの」であるnameができることになっているのです。stringは文字列を表わすと決まっているので、これを変えることはできません。しかし、nameはプログラマがかってに作る「いれもの」の名前なので、なんでもかまいません。ここでは、名前のいれものなので、nameとしただけです。(注:ちなみに、文字列のいれものとして、配列というものを使う方法もあります。新しいC++では、stringを使う方が一般的ですが、細かい操作を効率よくする場合などには、配列の方法も役に立ちます。これに関しては、旧作のC++入門を参照してください。こちらでは、stringでいきます。また、時間ができたらこちらでも説明するつもりです。)
ただし、stringを使うときには、
#include <string>
という行を上のほうに書くことになっています。これは、「stringを使うために必要な情報を取って来い」という程度の意味ですが、これも前回書いた「おまじない」の一種と考え、最初は気にせず使っていればよいと思います。(下でもう少し説明します。)
ということで、とりあえず、先のプログラムを完成させてみます。考えるのはプログラムの解説を見てからにしてください。
//hello2.cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "こんにちは。私はコンピュータです。" <<endl;
cout << "あなたの名前を入力してください。" <<endl;
cin >> name;
cout<<name<<"さん。よろしく。"<<endl;
}
そのため、このプログラムをコンパイル(コンパイル+リンクを簡単に「コンパイル」とだけ言うことにします)して実行すると、まず画面に
こんにちは。私はコンピュータです。
あなたの名前を入力してください。
と出力されます。
それからmainの中の4行目「 cin >> name; 」が実行されます。これは、「 ユーザの入力を待ち、入力があれば、それをnameに格納する 」という意味なのです。つまり、ここで、プログラムはユーザの入力待ちになり、いったん止まります。そして、ユーザが自分の名前をキーボードで書き込みエンターキー(リターンキー)を押すと、その文字列がnameに格納されるのです。
すると、すぐに最後の行が実行されてしまいます。これはいれられた名前のあとに続けて、「さん。よろしく。」と出力するので、例えばユーザが「小林」と入力していれば、
小林さん。よろしく。
と画面に出ることになります。以上、なんとなくでもわかったら、実験してみてください。プログラムを学ぶ基本は自分で入力し、コンパイルし、実行することです。
Fig.1 hello2.exeの実行例
実は、cinは、キーボードを表わしているのです。そして、>>は「押し込め」とか「流し込め」という意味です。したがって、「cin >> name;」は、「キーボードからnameにデータを流し込め」つまり「キーボードからの入力をnameに受け取れ」という意味になるのです。
ついでに、これを年齢もきくプログラムにしてみます。この場合は、年齢(つまり数)をいれる「いれもの」が必要になりますね。初心者にはややこしいですが、コンピュータの世界では、文字列と数は違うのです。さらに、数といってもいろいろあるのですが、年齢なら整数でしょう。整数の「いれもの」は、普通、
int x;
などとして、用意することになっています。ここでintが整数を表し、xが「いれもの」の名前です。「いれもの」の名前はstringのときと同じで自分でかってにつけていいのです。
また、整数の入力をxへ格納するのも、文字列のときと同様に、
cin >> x;
でできます。
以上を使うと、プログラムは次のようになります。このプログラムでは、年齢を入れる「いれもの」をtosiとすることにしました。また、プログラムにコメントをいれる話は前回しましたので、以後、解説も兼ねたコメントをいれることにします。このコメントはあってもなくてもプログラムの実行には何の関係もないのでした。
//hello3.cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name; //名前(文字列)の「いれもの」
int tosi; //年齢(整数)の「いれもの」
cout << "こんにちは。私はコンピュータです。" << endl;
cout << "あなたの名前を入力してください。" << endl;
cin >> name; //名前(文字列)の入力
cout << name << "さん。よろしく。" << endl;
cout << "ところで、" << name << "さん。失礼ですがお年はいくつですか?" << endl;
cout << "(入力はかならず、半角の数字でお願いします。)" << endl;
cin >> tosi; //年齢(整数)の入力
cout << "なるほど。" << tosi << "歳ですか。" << endl;
cout << "私はもうすぐ2歳のマシンです。"<<endl;
}
細かい話を少々します。まず、「Windowsのコマンドプロンプトで日本語が出せない」という質問を受けることがよくあります。設定によってはそうなっているかもしれませんが、コマンドプロンプトの窓を開いた状態で(普通にやるように)「Alt + 半角/全角」を試してみてください。普通はこれで日本語入力モードになると思います。そうならない場合は、パソコンの設定の問題だと思いますので、詳しい人にきいてみてください。
また、日本語(=全角)の数字は数として扱われません。数を入力するときは、(もう一度、日本語入力モードから半角入力モードに戻すなどして、)半角の数字で入力してください。そのことをユーザにわからせるため、年齢の入力の前に「cout << "(入力はかならず、半角の数字でお願いします。)" << endl;」をいれました。
Fig.2 hello3.exeの実行画面
データの「いれもの」は実は業界用語では「変数」といます。(そのくらい知っとるわいと怒ったあなた。まあ、いいじゃないですか。)変数と言う言葉をおぼえてください。「いれもの」つまり変数ははじめに用意してもよいし、途中で用意してもいいのですが、上でははじめに用意してみました。(注:ちなみに、Cでは、ブロックのはじめに定義しないとコンパイルエラーになります。)
最後に、「おまじない」と書いた部分について、説明しましょう。気にならなければ、しばらく気にする必要はありません。気になる場合だけ、以下を読んでください。
まず、「#include <iostream>」や「#include <string>」の意味です。簡単に言うと、「#include」は、「必要なものを持って来い」(インクルードするといいます)という程度の意味です。そして、<iostream>には、入出力に必要な「情報」が入っているのです。たとえば、cout、cin、endlというものの「名前」が、<iostream>に入っているのです。そのため、それらは「#include <iostream>」と書くことで使えるようになるのです。ためしに、「#include <iostream>」を削除したhello3.cppをコンパイルすると、エラーになると思います。(コンパイラによっては、エラーにしないかもしれません。それは、たまたま「プログラマにあまい」コンパイラなのです。)たとえば、Borland C++でコンパイルしたところ、次のようになりました。
Fig.3 「#include <iostream>」を削除するとコンパイル時にエラーになる
これは、「coutなんか知らない」「endlなんか知らない」「cinなんか知らない」という意味なのです。逆に言うと、プログラム中でcoutなどを使うために「#include <iostream>」と書くわけです。「#include <string>」も同様で、これにはstring関連の「情報」が入っているのです。
つまり、C++では、何かを使いたい場合、それに対応した「#include ○○」を書くことになるのです。ただし、ごく基本的なものに関しては、何もインクルードしなくてよいことになっています。たとえば、intは、何もインクルードしなくても使えるのです。こう書くと「何を使いたいときに何をインクルードするかわからない」と思うかもしれません。実際のところ、重要なものは使っているうちに覚えますし、必要ならマニュアル等を見ればよいということになります。この講座では、その都度説明しますので、最初から神経質にならないでください。大丈夫です。^^)
次に「using namespace std;」の意味を簡単に説明しましょう。実は、coutの正式な名前は、std::coutなのです。cin、endlも同様にstd::cin、std::endlです。ここで、stdは言わば苗字のようなものなのです。つまり、std::coutは「std家のcoutさん」みたいなものなのです。(ちなみに、stdは「標準」という意味です。)このように「苗字」を使うのは、名前が同じものがあった場合、それらの区別をするためです。これは、大きなプログラムを書く場合には重要なことです。というのは、プログラムが大きくなれば、似たような名前が増え、整理する必要が出てくるからです。
ただ、初心者が短いプログラムを書いて練習しているうちは、面倒なだけですね。「std::」を省略して書きたいと思うこともあるのです。そのような場合のために、「using namespace std;」があるわけです。これを書いておけば、「std::」を省略できるのです。一応、「using namespace std;」を使わずにhello.cppを書き直したものもお見せしましょう。
//hello.cpp書き換えバージョン
//「using namespace std;」はない
#include <iostream>
int main()
{
std::cout << "hello" << std::endl;
}
この入門講座では、大きいプログラムは書かないので、「using namespace std;」を使うことにします。これをusing宣言などといいます。
それでは、今日はこの辺で。