while文
条件が成立している間、処理を繰り返す
概要
while文は、 条件が true である限り、処理を繰り返し続けます。
for文は「ちょうど10回」というように回数が決まっているのに対して、 while文は「条件を満たしている限り」という、 条件ベースの繰り返しです。
while文の基本形
while (条件) {
// 条件が true の間、ここが繰り返される
}
for文とは異なり、 初期化と終了処理はループの外で行うのが一般的です。
シンプルな例
#include <iostream>
int main() {
int i = 0;
while (i < 5) {
std::cout << i << std::endl;
i++;
}
return 0;
}
0
1
2
3
4
このコードはfor文での例と同じ結果をもたらしますが、 初期化と更新を明示的に書く必要があります。
実践例
例1: ユーザー入力のループ
#include <iostream>
int main() {
int input;
while (true) {
std::cout << "1-3の数値を入力(0で終了): ";
std::cin >> input;
if (input == 0) {
break; // ループを抜ける
} else if (input >= 1 && input <= 3) {
std::cout << "入力値: " << input << std::endl;
} else {
std::cout << "無効な入力です" << std::endl;
}
}
std::cout << "終了します" << std::endl;
return 0;
}
例2: 2の倍数を数える
#include <iostream>
int main() {
int count = 0;
int num = 1;
while (num <= 100) {
if (num % 2 == 0) {
count++;
}
num++;
}
std::cout << "1から100までの2の倍数: " << count << std::endl;
return 0;
}
1から100までの2の倍数: 50
例3: 数値を段階的に縮める
#include <iostream>
int main() {
int n = 100;
std::cout << n;
while (n > 1) {
n = n / 2; // 半分にする
std::cout << " -> " << n;
}
std::cout << std::endl;
return 0;
}
100 -> 50 -> 25 -> 12 -> 6 -> 3 -> 1
do-while文
do-while文は、 最初に処理を実行してから条件をチェックします。 つまり最低でも1回は実行されるループです。
do {
// ここが最低1回は実行される
// 条件をチェック
} while (条件);
例
#include <iostream>
int main() {
int i = 0;
do {
std::cout << "i = " << i << std::endl;
i++;
} while (i < 3);
return 0;
}
i = 0
i = 1
i = 2
もし条件が最初からfalseだったとしても、 do-whileは1回実行されます。
do {
std::cout << "これは実行される" << std::endl;
} while (false); // 条件は false
// while文なら実行されない
while (false) {
std::cout << "これは実行されない" << std::endl;
}
while vs for
| for | while | |
|---|---|---|
| 用途 | 回数が決まっているループ | 条件が不明確なループ |
| 例 | 1から100まで処理 | ユーザー入力待ち |
| 初期化 | for文内で明示 | ループ外で明示 |
| 可読性 | 良い(回数が見やすい) | ループ全体を見ないと不明確 |
ループ制御(复習)
break:ループを抜ける
while (true) {
int x;
std::cin >> x;
if (x == 0) {
break; // ループ終了
}
std::cout << x * 2 << std::endl;
}
continue:次の繰り返しへ
int i = 0;
while (i < 10) {
i++;
if (i % 2 == 0) {
continue; // 偶数は飛ばす
}
std::cout << i << " ";
}
1 3 5 7 9
実践例:ゲームロジック
例:数当てゲーム
#include <iostream>
int main() {
int secret = 42;
int guess;
int attempts = 0;
std::cout << "数当てゲーム(1-100)" << std::endl;
while (true) {
std::cout << "数値を入力: ";
std::cin >> guess;
attempts++;
if (guess == secret) {
std::cout << "正解!" << std::endl;
std::cout << "試行回数: " << attempts << std::endl;
break;
} else if (guess < secret) {
std::cout << "もっと大きい数です" << std::endl;
} else {
std::cout << "もっと小さい数です" << std::endl;
}
}
return 0;
}
ポイント
- while文は条件ベースのループ
- 回数が不確定なループに向いている
- 初期化と更新はループ外で行う
- do-while は最低1回は実行される
- 無限ループに注意(条件が常にtrue)
よくある誤り
誤り1: 無限ループ
int i = 0;
while (i < 10) {
std::cout << i << std::endl;
// i++ がない!
}
誤り2: do-whileの構文
do {
std::cout << "Hello" << std::endl;
}
while (condition) // セミコロンがない!(必須)
誤り3: 条件をミスタイプ
int x = 5;
while (x = 10) { // = は代入(x を 10 に設定)
std::cout << x << std::endl; // 常に true
}
やってみよう
練習1: ユーザーから入力を受け取り、その合計を計算するプログラム。0が入力されたら終了。
練習2: 1 から始めて、その数の2倍にして増やしていき、1000を超えるまで繰り返し、最終値を表示するプログラム。
練習3: 九九を表示するプログラムを while を使って書く。
チャレンジ: コンピュータが考えた秘密の数を当てるゲーム(1-100)。ユーザーが当たるまで続ける。
まとめ
- while文は条件が成立する限りループ
- for文と異なり、ループ回数が不確定
- 初期化と更新を手動で管理する必要がある
- do-while は最低1回実行される
- 無限ループ