コンテンツにスキップ

第 3 回 | 2024-10-11

  • 変数の作り方と使い方を学ぶ
  • 変数の名前の付け方について学ぶ
  • 実行中のプログラムに数を与える標準入力の方法を学ぶ
  • オンラインコンパイラの使い方を覚える(replit)
  • 小数を扱う方法を学ぶ
  • 実用的なプログラムを作る

1. 変数

1.1 数に名前を付ける

  • コードに登場する数が、具体的に何の数を表すのか、名前を付けることができる。
    • 例えば、アイテムの値段を表す数に price という名前を付ける。
  • 整数に名前を付けるには、まず int(イント)を書き、スペースをあけて名前を書き、スペースをあけて=を書き、そのあとに値を書く。
    • 例 1: int price = 300;
    • 例 2: int money = 5000;
    • 例 3: int score = 99;
  • 数に名前を付けると、それは「変数」になる。
  • int は変数の性質を表す「」の名前で、その変数が整数であることを示す。
  • 変数を作ると、それ以降はプログラムに数を直接書く代わりにその変数を使える。

📙 Unit 14
#include <iostream>

int main()
{
	int price = 300;

	std::cout << price << "\n";

	std::cout << price * 2 << "\n";
}
出力
300
600

  • このお手本のプログラムでは、300 という数に price という名前をつけているので、300 はアイテムの値段であることがわかる。
  • アイテムを 2 個買った時の値段を、300 * 2 の代わりに price * 2 で表せる。

次のサンプルで、変数 age は主人公の年齢を表す。

📙 Unit 14
#include <iostream>

int main()
{
	int age = 12;

	std::cout << age + 3 << "\n"; // 3 年後の年齢

	std::cout << age + 10 << "\n"; // 10 年後の年齢
}
出力
15
22

1.2 変数の値を途中で変える

  • 代入の記号 =(イコール)を使うと、変数の値をプログラムの途中で変更できる。
📙 Unit 15
#include <iostream>

int main()
{
	int price = 300;

	std::cout << price << "\n"; // (1)!

	price = 200; // (2)!

	std::cout << price << "\n"; // (3)!
}
  1. この時点では 300

  2. ここで 200 に変更

  3. ここでは 200

出力
300
200

1.3 複数の変数を作る (1)

  • 同じスコープ内(今は main 内と考えればよい)で名前が重複しなければ、変数はいくつでも作れる。

📙 Unit 16
#include <iostream>

int main()
{
	int price = 300;

	int count = 10;

	std::cout << "全部で" << price * count << "円だよ\n";
}
出力
全部で3000円だよ

  • pricecountint 型の変数である。
  • 型が同じであれば、次のようにコンマ , で区切って 1 行に複数の変数を作ることもできる。

📙 Unit 16
#include <iostream>

int main()
{
	int price = 300, count = 10;

	std::cout << "全部で" << price * count << "円だよ\n";
}
出力
全部で3000円だよ

1.4 複数の変数を作る (2)

  • main に書いたプログラムは上から順に実行される。
  • 変数は使う前に必ず作っておく必要がある。
  • 次のコードの最初の時点の std::cout では、変数 bc は作られていないので、それらを使うことはできない。

📙 Unit 16
#include <iostream>

int main()
{
	int a = 10;

	std::cout << a + 5 << "\n";

	int b = 3, c = 5;

	std::cout << a * b * c << "\n";
}
出力
15
150

2. 変数の名前の付け方

変数に名前を付ける際にいくつかのルールがある。

2.1 変数の名前に使える文字

  • アルファベット
  • 数字。ただし、数字から始まる名前は NG(例: 2item
  • アンダースコア _

連続するアンダースコアを含んだり(例: a__b)、アンダースコアのあとに大文字から始まる名前(例: _Cpp)は、コンパイラや標準ライブラリ側(<iostream> の内部など)が特別な用途で使うため避ける必要がある。

2.2 変数の名前の付け方

複数の単語からなる場合、次の 2 通りの方法が一般的。

  • 単語の区切りで文字を大文字にする(例: itemPrice, playerMoney, boxWidth
  • _ で区切る(例: item_price, player_money, box_width

どちらを使っても構わないが、1 つのプログラム内ではどちらかに統一することでコードが読みやすくなる。

アルファベットの小文字と大文字は区別されるので、pricePrice は別の変数になる。C++ の変数名は小文字のアルファベットから始めるのが慣習

変数名の例 使えるか
price
Price ✅, ⚠️ ただし変数名は小文字から始まるのが一般的
itemPrice
item_price
itemPrice2
item price ❌ 間に空白がある
2itemPrice ❌ 数字から始まる
itemPrice! ! は使えない
item__price ⚠️ 連続するアンダースコアは避ける
_Price ⚠️ アンダースコアと大文字から始まる名前は避ける

3. 実行中のプログラムに数を与える

3.1 数を入力する

  • アイテムの個数を変えるたびにプログラムを修正してコンパイルし直すのは手間がかかる。そこで、<iostream> の機能である std::cin(エスティーディー・シーイン)を使うと便利になる。
  • std::cinを使うと、プログラムの実行中にキーボードで入力した値(標準入力)を、入力の記号 >>(右シフト)で示した先の変数に代入できる。
  • 実行するたびに異なる標準入力を与えれば、コードは同じままでも、異なる結果が得られるようになる。
📙 Unit 17
#include <iostream>

int main()
{
	int price = 300;

	int count; // (1)!

	std::cin >> count; // (2)!

	std::cout << "全部で" << price * count << "円だよ\n";
}
  1. この直後にキーボードで数を与えるので、特別に初期値を書く必要はない

  2. オンラインコンパイラ replit で実行した場合は、ここで入力待ちになる

入力例 1
3
出力例 1
全部で900円だよ

入力例 2
5
出力例 2
全部で1500円だよ

標準入力欄の使用

入門用オンラインコンパイラ(Simple C++ Editor)と中級向けオンラインコンパイラ(Wandbox)にはインタラクティブ機能が無いため、実行中にキーボード入力はできない。事前に「標準入力」欄に与えておく必要がある。

方法 ツール名 機能 対応する授業回
入門用オンラインコンパイラ Simple C++ Editor 日本語でのヘルプ 第 1 ~ 3 回
中級向けオンラインコンパイラ Wandbox コードの URL シェア機能 第 1 ~ 10 回

3.2 複数の数を入力する

  • 複数回 std::cin を使って、複数の数を入力することができる。
  • 複数の数を標準入力する場合、入力する側はそれぞれの数を半角空白か改行で区切る。
  • 2 つの数を入力すると、それらの和を出力するプログラムの例:

#include <iostream>

int main()
{
	int a;	
	std::cin >> a;

	int b;
	std::cin >> b;

	std::cout << a + b << "\n";
}
入力例 1(半角空白で区切る)
100 50
入力例 2(改行で区切る)
100
50
出力
150

3.3 入力の記号の連続

  • 入力の記号 >> は連続できる。3.2 は次のように書き換えられる。

#include <iostream>

int main()
{
	int a, b;
	std::cin >> a >> b;

	std::cout << a + b << "\n";
}
入力例 1
100 50
入力例 2
100
50
出力
150

練習

3 つの整数を入力すると、それらの和を出力するプログラムを作ってみよう。

解答例(クリックで開く)
#include <iostream>

int main()
{
	int a, b, c;
	std::cin >> a >> b >> c;

	std::cout << a + b + c << "\n";
}

4. オンラインコンパイラの使い方(replit)

4.1 replit を使う

方法 ツール名 機能 対応する授業回
高性能オンラインコンパイラ replit(レプリット) インタラクティブ実行 第 1 ~ 10 回

4.2 対話型プログラム

  • replit のような環境で、必要な入力を必要な時にキーボードから与え、入出力を交互に行うことができる。
  • このようなプログラムのことを「対話型(インタラクティブ)プログラム」という。
  • 対話型プログラムの例:

📙 Unit 17
#include <iostream>

int main()
{
	std::cout << "商品の値段:";
	int price;
	std::cin >> price;

	std::cout << "買う個数:";
	int count;
	std::cin >> count;

	std::cout << "全部で" << price * count << "円だよ\n";
}
入力
300
3
出力
全部で900円だよ

5. 小数を扱う

5.1 小数を扱う (1)

  • 小数以下も扱える数を、これまで扱ってきた「整数」と区別して「浮動小数点数」と言う。
  • 次のように数値に小数点が含まれると、その数は浮動小数点数として扱われる。

#include <iostream>

int main()
{
	std::cout << 1.5 << "\n";

	std::cout << -12.3 << "\n";

	std::cout << 40.0 << "\n";
}
出力
1.5
-12.3
40

数値 分類
30 100 8 -250 0 整数
1.5 -12.3 40.0 0.0 浮動小数点数

5.2 小数を扱う (2)

  • 浮動小数点数は +, -, *, / を使った計算ができる。
  • 浮動小数点数は整数と違い、% には対応していない。

#include <iostream>

int main()
{
	std::cout << 1.5 + 0.5 << "\n";

	std::cout << -12.3 * 3.0 << "\n";

	std::cout << 40.0 / 80.0 << "\n";
}
出力
2
-36.9
0.5

計算記号 整数 浮動小数点数
+
-
*
/
%

5.3 整数と浮動小数点数が交じる計算

  • 整数と浮動小数点数が交じる計算は、浮動小数点数で計算される。

#include <iostream>

int main()
{
	std::cout << 100 + 0.1 << "\n";

	std::cout << 1.0 / 2 + 0.1 << "\n";
}
出力
100.1
0.6

5.4 整数と浮動小数点数が交じる計算の注意

  • 式全体で見れば浮動小数点数が使われていても、整数どうしの計算になる部分があれば、その部分は整数で計算される。

#include <iostream>

int main()
{
	std::cout << 1 / 2 + 0.1 << "\n"; // 1 / 2 が 0 になるのでアウト

	std::cout << 0.1 + 5 / 2 << "\n"; // 5 / 2 が 2 になるのでアウト

	std::cout << 0.1 * 2 / 10 << "\n"; // 0.2 / 10 になるのでセーフ
}
出力
0.1
2.1
0.02

  • 次のように少なくとも 1 つの数が浮動小数点数であれば、計算結果は浮動小数点数になる。

#include <iostream>

int main()
{
	std::cout << 1 / 2.0 + 0.1 << "\n";

	std::cout << 0.1 + 5.0 / 2 << "\n";
}
出力
0.6
2.6

5.5 浮動小数点数型の変数

  • 浮動小数点数の変数を作るときは double 型を使う。使い方は int 型と同じである。

#include <iostream>

int main()
{
	double x = 1.5;

	std::cout << x * 3 << "\n";

	double y = 0.1, z = 0.2;

	std::cout << x + y + z << "\n";
}
出力
4.5
1.8

5.6 浮動小数点数型の入力

  • 浮動小数点数の標準入力も、整数の場合と同じように std::cin を使って行う。

#include <iostream>

int main()
{
	int sum;
	std::cin >> sum;

	double taxRate;
	std::cin >> taxRate;

	std::cout << sum * (1 + taxRate) << "\n";
}
入力
2000
0.1
出力
2200

  • double 型への標準入力(キーボード入力)は整数であっても問題ない。
  • 一方、int 型への標準入力に小数を付けてはいけない。

6. 実用的なプログラム

対話型のプログラムで、実用的なプログラムを作ってみよう。

6.1 おつりの計算

  • おつりを計算するプログラムを作る。

#include <iostream>

int main()
{
	std::cout << "商品の値段: ";
	int price;
	std::cin >> price;

	std::cout << "支払い金額: ";
	int money;
	std::cin >> money;

	int change = (money - price);
	std::cout << "おつりは " << change << " 円です。\n";
}
入力
880
1000
出力
おつりは 120 円です。

6.2 摂氏温度から華氏温度への変換

  • 摂氏温度を入力すると、それを華氏温度に変換するプログラムを作る。

#include <iostream>

int main()
{
	std::cout << "摂氏温度: ";
	double celsius;
	std::cin >> celsius;

	double fahrenheit = (celsius * 9 / 5 + 32);
	std::cout << "華氏温度: " << fahrenheit << "\n";
}
入力
20.5
出力
華氏温度: 68.9

6.3 秒数を分・秒に変換

  • 秒数を入力すると、それを分・秒に変換するプログラムを作る。

#include <iostream>

int main()
{
	std::cout << "秒数: ";
	int time;
	std::cin >> time;

	int minutes = time / 60;
	int seconds = time % 60;
	std::cout << minutes << " 分 " << seconds << " 秒\n";
}
入力
123
出力
2 分 3 秒

6.4 BMI の計算

  • 身長(m)と体重(kg)を入力すると、BMI を計算するプログラムを作る。

#include <iostream>

int main()
{
	std::cout << "身長(m): ";
	double height;
	std::cin >> height;

	std::cout << "体重(kg): ";
	double weight;
	std::cin >> weight;

	double bmi = weight / (height * height);
	std::cout << "BMI: " << bmi << "\n";
}
入力
1.75
70
出力
BMI: 22.8571

✅ 振り返りチェックリスト

  • 変数の作り方と使い方を学んだ
  • 変数の名前の付け方について学んだ
  • 実行中のプログラムに数を与える標準入力の方法を学んだ
  • オンラインコンパイラの使い方を学んだ(replit)
  • 小数を扱う方法を学んだ
  • 実用的なプログラムを作った

課題

ストーリー

コロナ禍が落ち着き、海外旅行や留学の機会が増えてきました。日本円を旅行先で使う現地通貨に両替することは、誰もが経験することでしょう。あなたが外貨両替店のシステム管理者だったら、お客さんにわかりやすく両替額を表示するシステムをどう作りますか?

練習問題では、最新の為替レートを使って、1万円をドルやユーロに両替した際の金額を計算し、出力するプログラムを作成します。提出課題では、さらに多くの通貨に対応したレート表を作成し、また店舗の手数料も考慮します。旅行やビジネスの場面を想像しながら、挑戦してみましょう。

🐣 練習問題

  • 為替レートが次の形式で標準入力から与えられます。
  • 1 万円を US ドルとユーロにそれぞれ両替したときの金額を、客にわかりやすい形式で出力してください。
入力の形式
usd
eur
入力データ 意味
usd 1 US ドルが何円であるか
eur 1 ユーロが何円であるか
入力例 1

入力
148.53
163.00
出力例
10,000 円 -> 67.3265 USD
10,000 円 -> 61.3497 EUR

入力例 2

入力
146.11
161.84
出力例
10,000 円 -> 68.4416 USD
10,000 円 -> 61.7894 EUR

解答例
#include <iostream>

int main()
{
	double usd, eur;
	std::cin >> usd >> eur;

	std::cout << "10,000 円 -> " << (10000 / usd) << " USD\n";
	std::cout << "10,000 円 -> " << (10000 / eur) << " EUR\n";
}

📝 提出課題

  • 為替レートと、店舗の手数料率が次の形式で標準入力から与えられます。
  • 入力に基づき、単位が日本円のレート表を、客にわかりやすい形式で出力してください。
  • 為替レートが 1 US ドル 150 円で、手数料率が 1.5 (1.5 %) であるとき、US ドルの売値は 152.25 円、買値は 147.75 円となります。
  • 採点時には、入力例とは異なる為替レートや手数料率を標準入力から与えます。それに基づいたレート表が出力されるかをチェックします。
入力の形式
eur
jpy
gbp
aud
cad
cny
inr
chf
feeRate
入力データ 意味
eur 1 ユーロが何 US ドルであるか
jpy 1 日本円が何 US ドルであるか
gbp 1 スターリング・ポンドが何 US ドルであるか
aud 1 オーストラリアドルが何 US ドルであるか
cad 1 カナダドルが何 US ドルであるか
cny 1 人民元が何 US ドルであるか
inr 1 インドルピーが何 US ドルであるか
chf 1 スイスフランが何 US ドルであるか
feeRate 店舗の手数料率、単位は %
入力例 1

入力
1.05286
0.00668
1.21488
0.63917
0.7339
0.13678
0.01202
1.09163
1.5
出力例
=== Currency Exchange ===
		We sell		We buy
USD:	151.946		147.455
EUR:	159.978		155.25
GBP:	184.596		179.14
AUD:	97.1194		94.2489
CAD:	111.513		108.217
CNY:	20.7832		20.1689
INR:	1.82639		1.77241
CHF:	165.869		160.966

客は店に 151.946 円払うと 1 US ドルをもらえます。客は 1 US ドルを店に渡すと 147.455 円をもらえます。
客は店に 159.978 円払うと 1 ユーロをもらえます。客は 1 ユーロを店に渡すと 155.25 円をもらえます。

入力例 2

入力
1.0973
0.00672
1.31227
0.67938
0.73649
0.14136
0.0119
1.16484
3
出力例
=== Currency Exchange ===
		We sell		We buy
USD:	153.274		144.345
EUR:	168.187		158.39
GBP:	201.137		189.42
AUD:	104.131		98.0653
CAD:	112.885		106.309
CNY:	21.6668		20.4046
INR:	1.82396		1.71771
CHF:	178.539		168.139

客は店に 153.274 円払うと 1 US ドルをもらえます。客は 1 US ドルを店に渡すと 144.345 円をもらえます。
客は店に 168.187 円払うと 1 ユーロをもらえます。客は 1 ユーロを店に渡すと 158.39 円をもらえます。

ヒント: 途中までの計算結果を出力して確かめる

課題を解くときは、途中の状態や計算結果を std::cout で出力し、プログラムが期待通り動いているかを確かめるとよいです。最終提出では、そうした途中の検証用の出力は除いてください。

提出方法

コードまたは【コードの共有 URL】を提出してください。1 つの提出に複数のプログラムを書いた場合は採点対象外となります。


【宣伝】セキュリティ・ミニキャンプ(オンライン)

学生に対して情報セキュリティやプログラミングに関する高度な技術教育を実施する事業「セキュリティ・キャンプ」 の一環として、「セキュリティ・ミニキャンプ」が年 10 回ほど、国(IPA)と業界団体の主催で開催されています。

11/30(土)オンライン開催のミニキャンプにて『2024 年の C++ クラス実装入門』という講義を私が担当します。ぜひ友人や先輩後輩を誘って参加してみてください。

応募課題(半日程度で終わる)があり、締め切りは 10/28(月)16:00 です。

11/30 セキュリティ・ミニキャンプ 開催概要