循环(loop)用于重复执行一段代码。while 循环会先判断条件(condition),只要条件为 true,就执行循环体;循环体执行完后,再回到条件处重新判断。
while 的基本结构
一个稳定的 while 循环通常包含三件事:
- 初值:循环开始前,先准备循环变量。
- 条件:每一轮开始前,判断是否继续循环。
- 更新:每一轮循环中,让循环变量发生变化。
int i = 1;
while (i <= 5) {
cout << "In loop: i = " << i << endl;
i++;
}
cout << "After loop: i = " << i << endl;运行结果:
循环中:i = 1
循环中:i = 2
循环中:i = 3
循环中:i = 4
循环中:i = 5
循环结束后:i = 6while 的特点是先判断、再执行。因此循环体可能执行多次,也可能一次都不执行。
逐行调试 while 循环
像调试器一样逐行执行代码。蓝色行是下一条语句,右侧会同步显示变量和输出。
01int i = 1;0203while (i <= 5) {04 cout << "循环中:i = " << i << endl;05 i += 1;06}07cout << "循环结束后:i = " << i << endl;
>>>
知识测验
累加与平均值
循环经常和累加变量一起使用。下面的程序读取 5 个人的身高,并计算平均值。
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
const int NUM_PEOPLE = 5;
double total = 0;
int i = 1;
while (i <= NUM_PEOPLE) {
double height;
cin >> height;
total += height;
i++;
}
double average = total / NUM_PEOPLE;
cout << fixed << setprecision(2) << "Average height: " << average << endl;
return 0;
}一次可能的运行过程:
请输入第 1 个人的身高:160.8
请输入第 2 个人的身高:175.2
请输入第 3 个人的身高:171.2
请输入第 4 个人的身高:181.3
请输入第 5 个人的身高:164
平均身高:170.50total += height 的意思是把本次输入的身高加到累计总和里。循环结束后,total 保存的是所有身高之和。
知识测验
do-while 与循环直到条件改变
while 适合处理“循环次数不一定一开始就知道”的任务。例如,计算一个整数有多少位。
int num;
cin >> num;
int digits;
if (num == 0) {
digits = 1;
} else {
digits = 0;
while (num != 0) {
num /= 10;
digits++;
}
}
cout << "Digits: " << digits << endl;一次可能的运行结果:
请输入一个整数:123
位数:3这里额外处理了 0。如果直接写 while (num != 0),输入 0 时循环一次也不会执行,位数会被错误地算成 0。
知识测验
猜数字游戏
还有一种常见场景是:程序不知道用户需要尝试多少次。猜数字游戏就是一个典型例子。程序先随机生成答案,然后不断读取用户输入;如果猜大了就提示“太大”,猜小了就提示“太小”;猜中后,do-while 的条件变为假,循环结束。
rand() % 100 + 1 使用标准库伪随机数生成器得到 1–100;实际项目通常还会设置种子,或使用 <random> 中更现代的工具。
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
int secret = rand() % 100 + 1;
int guess;
do {
cout << "Guess a number from 1 to 100: ";
cin >> guess;
if (guess > secret) {
cout << "Too high" << endl;
} else if (guess < secret) {
cout << "Too low" << endl;
}
} while (guess != secret);
cout << "Correct!" << endl;
return 0;
}一次可能的运行过程:
请猜一个数字:50
太大
请猜一个数字:25
太小
请猜一个数字:37
太小
请猜一个数字:43
太大
请猜一个数字:40
太大
请猜一个数字:38
太小
请猜一个数字:39
猜对了!你一共猜了 7 次。这里使用 do-while,因此至少会读取一次输入;猜中后循环条件变为假,程序继续执行循环后的语句。
猜数字循环实验
答案会在 1–100 之间随机生成。根据“太大/太小”提示缩小蓝色候选区间,猜中时观察 break 如何结束循环。
01int answer = rand() % 100 + 1;02while (true) {03 int guess; cin >> guess;04 if (guess == answer) {05 cout << "猜对了!" << endl;06 break;07 } else if (guess > answer) {08 cout << "太大" << endl;09 } else {10 cout << "太小" << endl; } }
>>>
用 while 计算倒数和
读取一个正整数 n,用 while 计算 1 + 1/2 + 1/3 + ... + 1/n。
- 读取一个正整数 n。
- 用 while 循环逐项累加 1/i。
- 最后输出保留两位小数的总和。
用 while 计算整数各位之和
逐位取出一个正整数的个位数,并把这些数字累加起来。
- 读取一个正整数 num。
- 在 while 循环中不断取出个位数并加入 sum_digits。
- 循环结束后输出各位数字之和。