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 を返しているのです。

wiredBeep/topics/Programming/Lang/Cpp/n1-06 (last edited 2007-10-24 13:55:26 by beeplex)