はじめに:ユーザーと対話するプログラムへ
これまでのプログラムは、あらかじめ決められた処理を実行し、結果を表示するだけの一方的なものでした。しかし、ユーザーがキーボードから入力した値によってプログラムの動作が変わるようになれば、電卓やゲームのような、よりインタラクティブ(双方向)なアプリケーションを作成できます。
それを実現するのが、C++の「標準入力ストリーム cin
」です。
この記事では、cin
を使ってキーボードからの入力を受け取る基本的な方法から、入力値を使った計算、さまざまなデータ型の扱い、さらには定数や乱数の使い方までを網羅的に解説します。
cin
の基本的な使い方:キーボードからの入力
cin
(シーインと読みます)は、キーボードからの入力を受け取るための機能です。cout
が画面への「出力」だったのに対し、cin
はキーボードからの「入力」を担当します。
#include <iostream>
#include <string> // string型を使うために必要
using namespace std;
int main() {
int age; // 入力された年齢を格納する整数型の変数を宣言
cout << "あなたの年齢を入力してください: ";
cin >> age; // キーボードからの入力を変数ageに格納
cout << "あなたは " << age << " 歳なのですね。" << endl;
return 0;
}
実行例:
あなたの年齢を入力してください: 20
あなたは 20 歳なのですね。
cin >> age;
: この行が入力処理の核です。cin
: キーボードからの入力ストリーム(データの流れ)を意味します。>>
: 「抽出演算子」と呼ばれます。cin
の流れからデータを取り出し(抽出し)、右側にある変数に格納する働きをします。
また、以下のように複数の値を一度に入力させることも可能です。入力時には、値の間をスペースやタブ、改行で区切ります。
int a, b;
cout << "2つの整数をスペースで区切って入力してください: ";
cin >> a >> b; // 最初の入力がaに、次の入力がbに格納される
入力した値で計算する:算術演算子
変数に入力した値は、計算に使うことができます。C++には、基本的な計算を行うための算術演算子が用意されています。
演算子 | 意味 | 使用例 |
+ | 加算(足し算) | a + b |
- | 減算(引き算) | a - b |
* | 乗算(掛け算) | a * b |
/ | 除算(割り算) | a / b |
% | 剰余(割り算の余り) | a % b |
これらの演算子の多くは、計算対象となる値(オペランド)を2つ取るため、「2項演算子」と呼ばれます。
注意点: 剰余演算子%
は、double
型のような実数(小数)には適用できず、整数型のオペランドに対してのみ使用できます。
様々なデータ型の入力
実数(小数)の入力
小数を含む数値を扱いたい場合は、double
(ダブル)型を使います。
double height;
cout << "身長(m)を入力してください: ";
cin >> height;
cout << "あなたの身長は " << height << "m です。" << endl;
文字と文字列の入力
1文字だけを扱いたい場合はchar
型、複数の文字からなる文字列を扱いたい場合はstring
型を使います。string
型を使うには、#include <string>
が必要です。
// 1文字の入力
char initial;
cout << "あなたのイニシャルを1文字入力してください: ";
cin >> initial;
// 文字列の入力
string name;
cout << "あなたの名前を入力してください: ";
cin >> name; // 注意:空白文字(スペースなど)までの単語しか読み取れない
空白を含む一行を読み込むには
上記のcin >> name;
では、「Taro Yamada」と入力しても「Taro」しか読み取れません。これは、cin >>
がスペースや改行を区切り文字として認識するためです。
空白を含む一行全体を文字列として読み込むには、getline
関数を使います。
string fullName;
cout << "あなたのフルネームを入力してください: ";
getline(cin, fullName); // cinから改行までを読み込み、fullNameに格納する
cout << "ようこそ、" << fullName << " さん。" << endl;
ワンポイント: cin >>
を使った後に getline
を使うと、入力がうまく読み取れないことがあります。これは cin >>
が残した改行コードを getline
が読み込んでしまうためです。この問題を避けるには、間に cin.ignore()
を挟むテクニックがありますが、まずはgetline
が一行読み込みに使われることを覚えておきましょう。
定数const
でコードを分かりやすく
プログラムの中に直接書かれた数値(例: 3.14
)は、「マジックナンバー」と呼ばれ、後から見たときに「この数字は何を意味するのか?」が分かりにくくなる原因となります。
円周率のように、プログラム中で変わることのない値には、const
(コンスト)を使って名前を付けておくと便利です。これを定数(または定数オブジェクト)と呼びます。
const double PI = 3.14159; // 円周率を定数として宣言
double radius;
cout << "円の半径を入力してください: ";
cin >> radius;
double circumference = 2 * PI * radius;
cout << "円周の長さは " << circumference << " です。" << endl;
const
を使うと、値の意味が明確になるだけでなく、後から値を修正する必要が出た場合も、宣言部分の一箇所を直すだけで済むというメリットがあります。
おまけ:乱数を生成してみよう
プログラムにゲームのような偶発的な要素を加えたい場合、「乱数」を使います。ここでは、C++で簡易的に乱数を生成する伝統的な方法を紹介します。
乱数を使うには、#include <cstdlib>
と#include <ctime>
が必要です。
#include <iostream>
#include <cstdlib> // rand(), srand() を使うために必要
#include <ctime> // time() を使うために必要
using namespace std;
int main() {
// 乱数の種(シード)を現在の時刻で初期化。毎回違う乱数系列を生成するためのおまじない。
srand(time(NULL));
// 0から9までの範囲の乱数を生成
int luckyNumber = rand() % 10;
cout << "今日のラッキーナンバーは " << luckyNumber << " です!" << endl;
return 0;
}
srand(time(NULL))
: 乱数の発生パターンを初期化します。これをプログラムの最初に一度だけ実行しないと、毎回同じ乱数が生成されてしまいます。rand()
: 0から非常に大きな値までの範囲で、擬似的な乱数を一つ生成します。% 10
:rand()
が生成した数を10で割った余りを求めています。これにより、結果を0から9までの範囲に限定できます。
補足: この方法は手軽ですが、生成される乱数の質はあまり高くありません。より本格的なアプリケーションで高品質な乱数が必要な場合は、C++11以降で導入された<random>
ライブラリの使用が推奨されます。
まとめ
今回は、ユーザーからの入力を受け取るcin
を中心に、関連する多くの機能を学びました。
cin >>
: キーボードからの入力を変数に格納する。- 算術演算子: 入力した値を使って計算を行う。
double
,char
,string
: 整数以外の様々な型のデータを扱う。getline()
: スペースを含む一行の文字列を読み込む。const
: 変更しない値に名前を付け、コードを分かりやすくする。rand()
: プログラムにランダムな要素を加える。
ユーザーからの入力を受け取れるようになると、作れるプログラムの幅が格段に広がります。ぜひ色々な入力と計算を試してみてください。