CC++ & Algorithm

while循环

困难6
语言版本:C++
概述:就像反复做同一件事直到条件改变,while循环让计算机重复执行代码直到条件不再成立。

while循环:让计算机重复做一件事

就像反复做同一件事直到条件改变,while循环让计算机重复执行代码直到条件不再成立。在生活里,我们经常需要重复动作:比如每天刷牙、每周上同一门课,或者在游戏里不断按空格键跳跃。C++ 中的 while 循环就是帮我们做这种重复工作的工具。

生活中的比喻

想象你在玩一个闯关游戏:每次赢了一局,就能再玩一局,一直玩到输掉为止。这里的规则是“只要赢,就继续玩”。在C++中,while循环就像这个规则:

while (条件) { 要重复做的事情 }

只要条件成立(为真),花括号里的代码就会一遍又一遍地执行;一旦条件不再成立(为假),循环就会停止,程序继续往下走。

再举个例子:你妈妈让你“如果有零花钱,就买一瓶牛奶”。这里的条件是“有零花钱”,重复做的事情是“买牛奶”。如果零花钱花光了,条件不成立,就不买了。循环也是一样。

while 循环的完整写法

while (条件表达式) {
    // 循环体:要重复执行的代码
}

重要特点:先判断条件,再决定是否执行循环体。如果一开始条件就不成立,循环体一次都不执行。

一个完整的例子

下面的程序用 while 循环输出 1 到 5 这几个数字:

#include <iostream>
using namespace std;

int main() {
    int i = 1;             // 从1开始
    while (i <= 5) {       // 只要i小于等于5,就继续循环
        cout << i << " ";  // 输出当前的i
        i++;               // 把i增加1(i = i + 1的简写)
    }
    cout << endl;          // 换行
    return 0;
}

运行结果:1 2 3 4 5

循环是怎么工作的?

  1. 程序先检查 i <= 5 是否成立。此时 i 等于 1,成立,进入循环。
  2. 输出 1,然后 i 变成 2。
  3. 再次检查条件:2 <= 5,成立,继续输出 2……
  4. 直到 i 变成 6 时,6 <= 5 不成立,循环结束。

你可以把循环想象成“重复检查 → 做事 → 再检查”的流程,就像玩游戏时每赢一局就先看看能不能继续玩。

更多实际应用

1. 计算 1 到 100 的总和

#include <iostream>
using namespace std;

int main() {
    int sum = 0;           // 总和,初始为0
    int i = 1;             // 从1开始
    while (i <= 100) {     // 加到100为止
        sum = sum + i;     // 把当前的i累加到sum里
        i++;               // 准备加下一个数
    }
    cout << "1到100的和是:" << sum << endl;
    return 0;
}

运行结果:1到100的和是:5050

生活例子:你每天存 1 块钱到存钱罐,第一天存 1 块,第二天再存 2 块……连存 100 天,总共存了 5050 元。

2. 输入密码直到正确

#include <iostream>
using namespace std;

int main() {
    int password = 123456;                // 正确密码
    int input;                            // 用户输入
    cout << "请输入密码:";
    cin >> input;                         // 第一次输入
    while (input != password) {           // 只要输入不对就重复
        cout << "密码错误,请重新输入:";
        cin >> input;                     // 再次输入
    }
    cout << "登录成功!" << endl;
    return 0;
}

这里 while 循环让用户不断尝试,直到输入正确为止。注意,第一次输入在循环外面,这是因为我们至少需要一次输入来判断是否进入循环。

3. 累加用户输入的数字直到输入0

#include <iostream>
using namespace std;

int main() {
    int num;                  // 每次输入的数字
    int total = 0;            // 总和
    cout << "请输入数字(输入0结束):";
    cin >> num;
    while (num != 0) {        // 只要不是0,就继续累加
        total = total + num;
        cout << "请输入下一个数字(输入0结束):";
        cin >> num;           // 再次输入,更新条件
    }
    cout << "所有数字的总和是:" << total << endl;
    return 0;
}

小心无限循环

如果忘记写改变条件的语句(比如 i++),或者条件永远为真(比如写成 while (1) 且没有 break 语句),程序就会一直运行下去,永不停止。这就像没完没了地玩游戏,电脑会卡住甚至死机。

常见错误示例

int i = 1;
while (i <= 5) {
    cout << i << " ";
    // 忘记写 i++,导致 i 永远等于1,条件永远成立
}

这段程序会不停地输出 1 1 1 1 1...,直到你强制关闭程序。

解决:确保循环体内有改变条件的语句。如果必须使用无限循环,请使用 break 语句跳出。

新手容易犯的其他错误

  1. 在 while 后面的括号后加了分号

    while (i <= 5);   // 这里的分号表示循环体为空,后面{}不属于循环
    {
        cout << i;
        i++;
    }
    

    这样会导致只有空循环在无限执行(因为 i 不会变化),而花括号里的代码只执行一次。记住:不要在 while (条件) 后直接加分号,除非你故意写空循环。

  2. 条件写成赋值符号 = 而不是比较符号 ==

    while (i = 5)  // 错误:将5赋值给i,表达式的结果是5(非零,永远为真)
    

    这样会变成无限循环。应该用 i == 5

  3. 忘记初始化循环变量

    int i;           // 未赋值,i 的值不确定
    while (i <= 5) { // 危险!i可能是随机大数,循环可能根本不会执行或执行多次
        ...
    }
    

while 循环的另一种形式:do-while

C++ 还有一种 do-while 循环,它先执行一次循环体,再判断条件,所以至少会执行一次。适合“至少要做一次”的场景,比如上面猜密码的例子也可以用 do-while 简化:

int password = 123456;
int input;
do {
    cout << "请输入密码:";
    cin >> input;
} while (input != password);

这样就不用在外边先写一次输入了。区别在于:while 先判断后执行,do-while 先执行后判断。

总结

while 循环非常适合做“条件重复”的工作。记住三步:初始化变量设定条件在循环里改变变量,这样就能安全地控制循环次数。如果想至少执行一次,可以考虑 do-while

相关知识点指引

  • for 循环:另一种常用循环,适合已知次数的重复。
  • break 和 continue:在循环中提前跳出或跳过本次循环。
  • 嵌套循环:一个循环里面再放一个循环,比如打印九九乘法表。

例题精讲

1单选题

执行以下代码后,变量 i 的值是多少? int i = 0; while (i < 5) { i++; }

A4
B5
C6
D0
2判断题

在C++中,while循环的循环体有可能一次都不执行。

3填空题
以下代码使用while循环计算1到100的和,请填空。
int sum = 0;
int i = 1;
while (___) {
    sum += i;
    ___;
}
4单选题

关于while循环和do-while循环,下列描述正确的是?

Awhile循环先判断条件后执行循环体,do-while循环先执行循环体后判断条件
Bwhile循环先执行循环体后判断条件,do-while循环先判断条件后执行循环体
Cwhile循环和do-while循环都是先判断条件后执行循环体
Dwhile循环和do-while循环都是先执行循环体后判断条件
5填空题
以下程序反复读入整数,直到输入0为止,并统计输入的非零整数个数。请填空。
int x, cnt = 0;
cin >> x;
while (___) {
    cnt++;
    ___;
}