C++超入門② 変数・型・入力と計算を覚えよう
intやdoubleなどの型、変数の宣言、キーボード入力、四則演算を使い、簡単な計算プログラムを作ります。
毎回同じ合計金額を表示するだけなら、電卓の答えを書いておけば済みます。でも、利用者が価格や個数を変えられたら、少し便利になりますよね。
今回は変数・型・入力・計算をつなぎます。「数字を入れたのに計算が変」「小数が消えた」といった、最初につまずきやすい点も順に見ていきましょう。
C++17以降を使います。#includeから始まるコードは全体で1本、それ以外の短い例はmainの中へ書く部分です。
1. 変数は、値を保存する名前付きの場所
int price = 150;
int count = 3;
int total = price * count;
std::cout << total << '\n';
結果は450です。priceが価格、countが個数、totalが合計という名前になっています。
int price = 150;は、整数用の変数priceを作り、初めに150を保存する文です。変数を用意することを宣言、最初の値を設定することを初期化と呼びます。
後からcount = 4;と書くのは代入です。=は数学の等号ではなく、「右側の計算結果を左側へ入れる」と読んでください。
後で値を変えても、以前の計算はやり直されない
int count = 3;
int total = 150 * count;
count = 4;
std::cout << count << '\n';
std::cout << total << '\n';
出力は4と450です。totalを計算した時点のcountは3でした。600にしたいなら、countを変えた後でもう一度total = 150 * count;を実行します。
自動更新の計算表ではなく、上から実行した時点の値が保存されると考えると整理できます。
2. 型は「どんな値を扱うか」のルール
| 型 | 用途 | 例 |
|---|---|---|
int |
整数 | 18、-3 |
double |
小数を含む数 | 2.5、168.5 |
bool |
真か偽 | true、false |
char |
1つのchar単位 | 'A' |
std::string |
名前や文章 | "Aoi" |
std::stringを使うときは#include <string>も必要です。
#include <iostream>
#include <string>
int main() {
int score = 80;
double height = 168.5;
bool isStudent = true;
char grade = 'A';
std::string name = "Aoi";
std::cout << name << ": " << score << '\n';
std::cout << height << ", " << grade << '\n';
std::cout << std::boolalpha << isStudent << '\n';
return 0;
}
std::boolalphaはboolをtrueやfalseで表示する指定です。指定しない場合は通常1や0で表示されます。
charにUTF-8の日本語1文字をそのまま入れられるとは限りません。日本語は通常複数バイトなので、文章にはstd::stringを使い、長さの数え方は配列とstringの回で扱います。
初期値を決めておく
int score;のように関数内の数値変数を未初期化のまま読み出してはいけません。0を使うならint score = 0;、またはint score{};と書きます。
int score{80};の波かっこによる初期化もよく使います。int score{80.5};のような、情報を失う狭める変換を拒否できる利点があります。まずはどちらかの形で初期化する習慣を付けましょう。
3. 変更しない値にはconst
const int MAX_PLAYERS = 4;
constが付いた変数へ、後から別の値を代入することはできません。これは「この値は途中で変えない」という意図をコードで表す方法です。
constがあると、誤ってMAX_PLAYERS = 5;と書いたときにコンパイラが止めてくれます。大文字の名前は定数によく使う慣習ですが、文法上の必須条件ではありません。
4. cinでキーボード入力を受け取る
#include <iostream>
#include <string>
int main() {
std::string name;
int age = 0;
std::cout << "名前(空白なし): ";
if (!(std::cin >> name)) {
return 1;
}
std::cout << "年齢(0-120): ";
if (!(std::cin >> age) || age < 0 || age > 120) {
std::cout << "入力を確認してください。\n";
return 1;
}
std::cout << name << "さんは" << age << "歳です。\n";
return 0;
}
名前にAoi、年齢に18を入力すると、Aoiさんは18歳です。となります。
std::cout <<は外へ出す方向、std::cin >>は変数へ入れる方向、と見比べると覚えやすいでしょう。
入力の成功と、内容の正しさは別
if (!(std::cin >> age))は、整数として読み取れなかった場合の確認です。!は真偽を反対にします。abcや型の範囲を超える数を入力したら、計算せず終了します。
その後のage < 0 || age > 120は、整数として読めても年齢の練習範囲に入らない値を断る処理です。ifの詳細は次の回で学びます。
std::cin >> ageは行全体を検査するわけではなく、18abcの先頭18だけを読む場合があります。厳密な行単位のチェックは最終回で扱います。入力ストリームの数値読み取りの仕様でも、この処理を確認できます。
名前に空白を入れたいとき
std::cin >> nameは空白で区切るので、Aoi Soraを1つの名前にはできません。1行を受け取るstd::getlineを使います。数値入力の後には改行が残る問題もあるため、あとで入力方法をそろえて扱います。
5. 計算の記号と、整数の割り算
| 記号 | 例 | 結果 |
|---|---|---|
+ |
7 + 2 |
9 |
- |
7 - 2 |
5 |
* |
7 * 2 |
14 |
/ |
7 / 2 |
3 |
% |
7 % 2 |
1 |
%は整数の余りです。割り算で余りが0なら、割り切れると判断できます。
3.5にしたいなら、割る前に小数へ
std::cout << 7 / 2 << '\n';
std::cout << 7.0 / 2 << '\n';
std::cout << static_cast<double>(7) / 2 << '\n';
結果は3、3.5、3.5です。static_cast<double>は値をdoubleへ変換する書き方です。
double answer = 7 / 2;では、右側で3ができてからdoubleへ入るので3.0です。「入れ物だけ小数にしたのに」と思ったら、計算する時点の型を確認します。
整数の割り算は0へ近づく方向に端数を除き、-7 / 2は-3です。整数の0除算や、符号付き整数の範囲を超える計算は未定義動作なので避けます。
6. 合計金額を求める小さなプログラム
この例は、価格を0〜1000円、個数を0〜20個へ制限します。合計の上限が20000なので、C++が保証するintの最小限の範囲でも収まります。
#include <iostream>
int main() {
int price = 0;
int count = 0;
std::cout << "価格(0-1000円)と個数(0-20): ";
if (!(std::cin >> price >> count) ||
price < 0 || price > 1000 || count < 0 || count > 20) {
std::cout << "入力を確認してください。\n";
return 1;
}
const int total = price * count;
std::cout << "合計は" << total << "円です。\n";
return 0;
}
150 4と入力すると600円です。価格と個数を受け取り、範囲を確認し、掛け算して表示する。この順番なら、計算してよい値かを先に判断できます。
7. 練習:小数の長さから面積を求めよう
横幅と高さをdoubleで受け取り、長方形の面積を表示します。練習用に、それぞれ0より大きく1000以下の有限な数を受け付けてください。
模範解答
#include <cmath>
#include <iostream>
int main() {
double width = 0.0;
double height = 0.0;
std::cout << "横幅と高さ: ";
if (!(std::cin >> width >> height) ||
!std::isfinite(width) || !std::isfinite(height) ||
width <= 0 || width > 1000 || height <= 0 || height > 1000) {
std::cout << "0より大きく1000以下の数を入力してください。\n";
return 1;
}
const double area = width * height;
std::cout << "面積は" << area << "です。\n";
return 0;
}
解説
2.5 4を入力すると、2.5 × 4で10を表示します。表示が10でも、areaの型はdoubleです。
std::isfiniteは、無限大や数として扱えない特別な値ではないかを確かめる道具で、<cmath>が必要です。今回は、読めたか・有限か・範囲内かを確認してから掛けます。
最初は小さな正しい入力で流れを確かめ、その後に0や文字も試すと、確認処理の意味が見えてきます。
次の一歩
「変数を用意 → 入力 → 確認 → 計算 → 表示」という形を押さえれば、ほかの計算プログラムにも応用できます。