第六回 if 文および if~else 文

ここでは if 文、および if~else 文を学ぶ。
これまでのプログラムは常に一本道であったが、if 文を学ぶと 状況に応じて処理が分岐するプログラムを記述できるようになる。

if 文

本ページでは、状況に応じて処理が分岐するプログラムが if 文により実現されることを学ぶ。

if 文は以下の構造を持っている。
if( 条件 )
{
	命令 (複数の命令でも良い)
}
上記のような記述により、以下のような動作が実現される。 これを模式的に表すと、以下の様になる。



すなわち、条件が満たされているか (true)、満たされていないか (false) で、
「命令」を実行するかどうかが変わる、ということである。
これは、プログラムの処理が条件によって分岐する、と言い替えることができる。

使用例としては例えば以下のプログラムが挙げられる。
ユーザーが入力した整数が 5 より大きいときにのみ「あなたの入力した数字は5より大きいですね」と表示するプログラムである。
入力した整数が 5 以下の場合は何も表示されない。
int i;
cin >> i;    // ユーザが入力した整数値を変数 i に代入

if(i>5)
{
	cout << "あなたの入力した数字は5より大きいですね\n";
}
このプログラムは「ユーザーからの入力」という今までにない内容を含んでいるので、
paiza.IO で実行するには、少し注意が必要である。

まず、これまで通りプログラムを記述 (貼り付け) する。
インデントの設定について下図を参考にしよう。

さらに、下図に示されているように、「入力」タブに5より大きい整数を「半角で」入力しておこう。図では10を記入した。
この数字が「cin >> i;」命令により、変数 i に格納されるのである。
そうしてから「実行」ボタンをクリックしよう。



そうすると、「出力」タブに「あなたの入力した数字は5より大きいですね」という文字列が表示される。



一方、「入力」タブに 5 以下の数を入力してから「実行」ボタンをクリックしても…



何も表示されない。すなわち、変数 i の大小により、処理が分岐したのである。




if~else 文

if文では、一つの条件に対しその条件が正しいか (true)、正しくないか (false) で 命令を実行するかしないかの2通りに分岐させた。
このとき、「命令を実行するかしないか」の2通りではなく、 「命令1と命令2のどちらを実行するか」の2通りの方が便利なことが多い。

それを実現するのがif ~ else 文である。if ~ else 文は以下のような構造をしている。
if( 条件 )
{
	命令1 (複数の命令でも良い)
}
else
{
	命令2 (複数の命令でも良い)
}
この場合の模式図は以下の様になる。



先程の if 文との違いは、「ある命令を実行するかしないか」ではなく「命令1と命令2のどちらを実行するか」の2択になることである。

使用例は、上で用いた例の続きとすれば以下のようになるだろう。
int i;
cin >> i;

if(i>5)
{
	cout << "あなたの入力した数字は5より大きいですね\n";
}
else
{
	cout << "あなたの入力した数字は5以下ですね\n";
}
先程の例と異なり、i が 5 以下の場合もメッセージが表示されるようになる。

実行して違いを確認してみよう。
以下では、プログラムを変更した後、「入力」タブに4 を入力している。



実行結果は、以下のように「あなたの入力した数字は5以下ですね」と表示されている。




すなわち、表示される内容が、i の大小により、以下の2択になったということである。

else if の利用

ここまでは、一つの条件に対しその条件が正しいか (true)、正しくないか (false) で2通りに分岐させた。
実際のプログラミングでは、命令を3通り、4通りと分岐させたいことがしばしばある。
そのような場合は else if によって条件を追加していくことができる。構造は以下の通り。
if( 条件1 )
{
	命令1 (複数の命令でも良い)
}
else if( 条件2 )
{
	命令2 (複数の命令でも良い)
}
else if( 条件3 )
{
	命令3 (複数の命令でも良い)
…
}
else if( 条件n-1 )
{
	命令n-1 (複数の命令でも良い)
}
else
{
	命令n  (複数の命令でも良い)
}
これを模式的に表すと下図のようになる。



具体例を見た方が分かりやすいだろう。以下の例はこれまでの例を発展させ、処理を3つに分岐させている。 else の使い方に注意しよう。このプログラムでは「i が 5 に等しい」という条件を直接書いていないが、
「i>5 でもなく i<5 でもない (すなわち i=5)」と言う形で「i が 5 に等しい」という条件を実現しているのである。
int i;
cin >> i;

if(i>5)
{
	cout << "あなたの入力した数字は5より大きいですね\n";
}
else if(i<5)
{
	cout << "あなたの入力した数字は5より小さいですね\n";
}
else
{
	cout << "あなたの入力した数字は5ですね\n";
}
実行結果は以下の通り。「入力」タブに 5 を記入したときの結果である。




数当てゲームを作ろう

さて、本日の課題として簡単な数当てゲームを作ってみよう。
コンピュータが 1 から 10 の数をランダムに選ぶので、
皆さんがそれを当てる、というゲームである。

プログラム全体を記すと以下のようになる。ただし、以下のプログラムには「??」と書かれた箇所が2箇所あり、
そこを埋めないとプログラムは完成しない。
#include <iostream>
#include <random>
using namespace std;
int main(void){
	// この4行で、変数 answer に 1 から 10 のどれかの整数がランダムに格納される
	random_device rd;
	mt19937 mt(rd());
	uniform_int_distribution<int> r(1,10);
	int answer = r(mt);

	int i;
	cin >> i;

	if( ?? )
	{
		cout << "あなたの入力した数字" << i << "は答えより大きいです\n";
	}
	else if( ?? )
	{
		cout << "あなたの入力した数字" << i << "は答えより小さいです\n";
	}
	else
	{
		cout << "正解です!\n";
	}

	cout << "答えは" << answer << "でした\n";
}
このプログラムは全体が表示されているので、 paiza.IO に貼り付ける方法がこれまでと異なる。

まず、paiza.IO のデフォルト状態のプログラム記述欄でキーボードで「Ctrl-a」を実行し、
プログラム全体を選択する。
そして、キーボードのDeleteキーを押して、プログラム全体を削除する。



その結果、もちろん以下のようにプログラムが全く書かれていない状態になる。



そして、本ページ上にある、コピーしたいプログラムをキーボードの Ctrl-c によりコピーする。
その後、何も書かれていない paiza.IO にてキーボードで Ctrl-v を実行し、数当てゲームの雛型を貼り付ける。
皆さんが記述すべき2箇所には「??」が記されている。



2箇所の「??」を埋め、数当てゲームを完成させよう。
前提条件として、変数 answer には、コンピュータがランダムに決定した 1 ~ 10 の整数のどれかが格納されていることが挙げられる。
これが数当てゲームの「答え」である。
また、皆さんが入力した数値は変数 i に格納されている。i と answer が等しいかどうかが問題なのである。

ちなみに、2箇所の「??」部を正しく埋めた後、「入力」タブに 8 と記入して実行した時の結果を表示してみる。

以下は、皆さんの入力 8 が答えよりも大きい場合の表示。



以下は、皆さんの入力 8 が答えと等しかった時の表示である。





課題→

オンラインコンパイラで C/C++ を自習しように戻る