C++言語講座 第1章 6回 while文とdo~while文、bool型
while文とdo~while文
while文
前回説明したif文は、「もし○○だったら」という条件分岐をするためのものでした。今回扱うwhile文とdo~while文は、同じ処理やほとんど同じ処理を何回も繰り返すためのループをつくるものです。まず簡単なプログラムを作ってみましょう。
[List 1]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 int sum = 0; // 合計
7 int x; // 入力された値
8
9 cout << "入力された整数を全部足し上げます。"
10 << "(0を入力すると終了します)" << endl;
11 cout << "整数を入力して下さい:";
12 cin >> x;
13
14 while (x != 0) {
15 sum += x;
16 cout << "いままでの合計は " << sum << endl;
17
18 cout << "整数を入力して下さい:";
19 cin >> x;
20 }
21
22 cout << "合計は " << sum << endl;
23
24 return 0;
25 }
1 while (x != 0) { … }
というところが新しいですね。これが、while文です。whileとは英語で「○○の間」という意味です。この文は、
x != 0 の間 { … } を何度でも実行し続ける
という意味なのです。
このプログラムは、まず最初に x に整数を入力してもらってから、while ループに入ります。そして、x が 0 でない間、ループを何度も実行するのです。
1 sum += x;
というところで、何をしているか分かりますか? これは、オブジェクト sum に x の値を加えているところです。つまり、
1 sum = sum + x;
の省略です。同じように -= 、*= 、/= という演算子もあります。
このプログラムを実行して、最初に
整数を入力して下さい:
と表示されたところで、0 を入力してください。どうなりましたか? while ループは一回も実行されませんでしたね? while 文は
条件を調べる → ループを実行 → 条件を調べる → ループを実行 → 条件を調べる → …
というように、まず最初に 条件(ここでは x != 0)が成り立っているか調べます。最初から x が 0 だったら、ループは一度も実行されません。このため、whileループは前判定ループと呼ばれます。
do~while文
前判定ループがあるなら、後ろ判定ループもあるはずです。サンプルプログラム 1の三択ゲームをもう少し遊びやすくしてみましょう。
[List 2]
1 #include <iostream>
2 #include <cstdlib>
3 using namespace std;
4
5 int main()
6 {
7 // 乱数の初期化
8 srand(time(NULL));
9
10 int x;
11 string str;
12
13 do {
14 cout << "箱が三つあります。一つだけがあたりです。"
15 << "あたりはどれでしょう。(1~3の整数で)" << endl;
16 cin >> x;
17
18 if (x == rand() % 3 + 1) {
19 cout << "あたり" << endl;
20 cout << "やったね" << endl;
21 } else if (x < 1 || 3 < x) {
22 cout << "そんな箱ないがな!" << endl;
23 } else {
24 cout << "はずれ" << endl;
25 cout << "残念…" << endl;
26 }
27
28 cout << "まだ続けますか?"
29 << "終了するときは q と入力してください:";
30 cin >> str;
31 } while (str != "q");
32
33 return 0;
34 }
1 do { … } while (str != "q");
がdo~while文です。do~while文は while文とほとんど同じですが、条件(str != "q")を、ループの最初ではなく、最後に判定します。つまり、
ループを実行 → 条件を調べる → ループを実行 → 条件を調べる → ループを実行 → …
という順番で処理を行うわけですね。
while文もdo~while文も、実行する処理が1行だけのときは、{ } は必要ありません。
bool型
ちょっと話題を横道にそらせましょう。おまけのようなものだと考えて下さい。
今までいくつかの比較演算子が出てきました。比較演算子というのは、== (等しい)、!= (等しくない)、> (大なり)、< (小なり)、>= (大なりイコール)、<= (小なりイコール)です。また、ふたつの論理演算子 && (かつ)と || (または)も出てきました。これらは名前のとおり、 演算子の一種です。演算子というのは、+ (足す)、- (引く)などと同じで、なにか計算をするためのものです。例えば、+ 演算子で整数を足し合わせた結果は、
1 int x = 10 + 20;
のように、int 型のオブジェクトに代入できました。ということは、比較演算子や論理演算子で計算した結果も、なにかのオブジェクトに代入できるはずです。やってみましょう。
[List 3]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 bool b;
7 int x;
8
9 cout << "何か整数を入力して下さい:";
10 cin >> x;
11
12 b = x > 0;
13
14 if (b)
15 cout << "bは0より大きい整数です" << endl;
16 else
17 cout << "bは0以下の整数です" << endl;
18
19 return 0;
20 }
何をしているか分かりましたか? まずは、
1 b = x > 0;
というところです。これは、
x > 0
という計算の結果を、b というオブジェクトに代入しているところです。「x > 0 という計算の結果」とは、どういう意味でしょう? これは簡単にいえば、「x > 0 が正しいかどうか」です。つまり、
1 b = x > 0;
という行では、「x > 0 が正しいかどうかという情報」を b に代入しているのです。
そして、
1 if (b)
では、b に代入された、「正しいかどうかという情報」を元に、x > 0 が正しければ
1 cout << "bは0より大きい整数です" << endl;
を、間違っていれば、
1 cout << "bは0以下の整数です" << endl;
を実行しているわけです。
b は、
1 bool b;
と宣言されているように、bool型(ぶーるがた)のオブジェクトです。この「bool型」は、上で書いた「正しいかどうかという情報」を扱うための型です。(ある比較演算などが)「正しい」というのを、C++では true (トゥルー) と書きます。日本語では「真」と言うこともあります。反対に(ある比較演算などが)「間違っている」というのを、false (フォルス) と書きます。日本語では「偽」です。
[List 4]
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 bool b;
7 b = true;
8
9 if (b)
10 cout << "bはtrueです" << endl;
11 else
12 cout << "bはfalseです" << endl;
13
14 return 0;
15 }
[List 4]の
1 b = true;
を、
1 b = false
に書き変えたり、
1 b = 256 >= 128 && 64 <=64;
などの比較演算に変えたりしてみましょう。
いろいろな比較演算子や論理演算子は、この bool型の true か false を返しているのです。
