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回実行される
  • 無限ループ