C++ 循环的简单应用
中等43用循环解决生活中的问题——累加、统计、重复游戏
小朋友们,学会了 for、while、do-while 三种循环,我们就可以用它们解决生活中的好多问题啦!比如:计算1加到100等于多少?统计一个班级里有多少人?或者做一个猜数字小游戏。下面我们看几个简单应用的例子,一边学一边想:这些代码背后的“重复”规律到底是什么?
1. 用 for 循环计算1到100的和——像存钱罐一样累加
就像你每天存钱,第一天存1元,第二天存2元……存到100天,一共多少钱?这个过程中,你每天都在做同一件事:把当天的钱数加到存钱罐里。用代码来实现,就需要一个变量 sum(总钱数)来“记住”累加的结果。
#include <iostream>
using namespace std;
int main() {
int sum = 0; // 存钱罐,一开始是空的
for (int i = 1; i <= 100; i++) { // i 从1到100,每天的钱数
sum = sum + i; // 把今天的 i 元放进存钱罐
}
cout << "1到100的和是:" << sum << endl;
return 0;
}
运行结果:1到100的和是:5050。
? 过程拆解:
- 第一天:
sum = 0 + 1 = 1 - 第二天:
sum = 1 + 2 = 3 - 第三天:
sum = 3 + 3 = 6 - ……
- 第100天:
sum = 4950 + 100 = 5050
注意:i++ 和 i = i + 1 是一样的,都是让 i 增加1。
? 生活中的类比:不光是存钱,还可以是数星星(一次数1颗,数100次),或者做口算题(每天做1道,第二天做2道……)。
⚠️ 新手易错:
- 忘记给
sum初始化成0,那么sum会是一个随机数,结果乱套。 - 循环条件写成
i < 100,那只会加到99,少了100。 - 在循环体里不小心把
i改掉了,比如写了i = i + 2,就会跳着加。
2. 用 while 循环统计数字的位数——不断“切掉”最后一位
比如输入一个数 1234,要输出它有4位。怎么数呢?你可以不停地除以10,每除一次,就“切掉”最后一位,直到数字变成0。切了多少次,就有多少位。
#include <iostream>
using namespace std;
int main() {
int n; // 输入的数字
int count = 0; // 位数计数器,初始0
cout << "请输入一个整数:";
cin >> n;
while (n != 0) { // 只要n还不等于0
n = n / 10; // 去掉最后一位(整数除法)
count++; // 切掉一次,位数加1
}
cout << "这个数有 " << count << " 位。" << endl;
return 0;
}
运行示例(输入1234):
- 第1次循环:
n = 1234 / 10 = 123,count = 1 - 第2次循环:
n = 123 / 10 = 12,count = 2 - 第3次循环:
n = 12 / 10 = 1,count = 3 - 第4次循环:
n = 1 / 10 = 0,count = 4 - 此时
n == 0,循环结束,输出4。
但注意一个陷阱:如果输入的是 0,while 循环一次都不执行,count 还是 0,但实际 0 有1位。所以真实编程中需要单独处理 n == 0 的情况。不过,这个例子本身是个很好的练习,让你理解循环的条件判断。
? 生活中的类比:就像你剥橘子,每剥一瓣就数一下。或者倒着数一堆硬币,每次拿走10个,数一共拿了多少次。
⚠️ 新手易错:
- 忘记在循环里更新
n,比如只写了n = n / 10但写成了n / 10(没赋值),就会死循环,程序一直在检查是不是0,永远不结束。 - 条件写成了
while (n != 0);多了分号,那循环体就成了空语句,程序会原地打转。 - 如果输入负数(比如 -123),第一次
n != 0成立,但-123 / 10在C++中结果是-12(向零取整),最后也会变成0,但位数统计会出错(负号不算位)。所以更好的做法是先用abs取绝对值。
3. 用 do-while 循环做简单菜单——至少玩一次的游戏
假设你和几个小伙伴玩“猜数字”游戏:先猜一次,然后问“还要再玩吗?”。这种 先执行,再判断 的场景,正好用 do-while 循环。它保证至少执行一次循环体,就像你拉朋友玩游戏,不管他愿不愿意,先玩一局再说。
#include <iostream>
using namespace std;
int main() {
char choice; // 存储用户的选择:y或n
do {
cout << "猜一个数字(1-10):";
int guess; // 每次猜的数
cin >> guess;
if (guess == 7) {
cout << "猜对了!" << endl;
} else {
cout << "猜错了。" << endl;
}
cout << "再玩一次吗?(y/n):";
cin >> choice;
} while (choice == 'y' || choice == 'Y'); // 小写或大写y都继续
cout << "游戏结束。" << endl;
return 0;
}
运行过程:
- 先执行循环体(猜一次、提示、询问)
- 然后检查条件:如果用户输入
y或Y,就再循环一次;否则退出。 - 注意
while后面必须有个分号,这是do-while的语法规定。
? 生活中的类比:很多APP的“每日签到”就是先展示签到界面,然后问“是否继续签到”。或者点外卖时先显示菜单,再问“还要加菜吗?”
⚠️ 新手易错:
- 忘记在
while后面加分号;,编译会报错。 - 条件写成了
choice == 'y' && choice == 'Y',那永远不可能为真(一个字符不能同时是y和Y),应该用||(或)。 - 如果没有对
choice进行初始化就直接判断,会出问题。
常见错误总结(练练火眼金睛)
| 错误类型 | 错误代码 | 正确写法 | 后果 |
|---|---|---|---|
| 死循环(条件永远成立) | while (1) 忘记改变条件 | 确保条件最终会变为假 | 程序一直运行,卡死 |
| 忘记初始化累加变量 | int sum; for(...) sum+=i; | int sum = 0; | 结果随机 |
| do-while 忘加分号 | while (条件) | 后面加 ; | 编译错误 |
while 条件里用了 = 而不是 == | while (n = 0) | while (n == 0) | 变成赋值,条件永远为假或真 |
完整示例:输出1到100中所有5的倍数
我们可以用循环加上 if 判断,输出所有满足“除以5余数为0”的数。这综合了循环和条件判断的知识。
#include <iostream>
using namespace std;
int main() {
cout << "1到100中5的倍数有:";
for (int i = 1; i <= 100; i++) { // i 从1到100
if (i % 5 == 0) { // 如果 i 能被5整除
cout << i << " "; // 输出这个数,加一个空格
}
}
cout << endl; // 换行
return 0;
}
运行结果:5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100
自己试试:改成输出所有偶数?改成输出所有平方数(1、4、9、16……)?只要修改 if 里的条件就可以了。
接下来可以学什么?
循环是一个非常强大的工具,但生活中很多问题需要两层重复,比如画一个星星方阵(行和列都要循环),这就引出了 嵌套循环。还有时候我们需要中途跳出循环(比如找到了答案就不继续找了),这时可以用 break 和 continue。另外,循环常常和数组搭配,用于处理一串数据(比如统计全班同学的分数)。慢慢来,每一次练习都会让循环在你的脑子里“转得更灵活”!
试试自己写一个程序:先猜一个1~100之间的随机数(用 rand()),然后用 do-while 让玩家一直猜,直到猜对为止,并记录猜的次数。加油!
例题精讲
以下程序使用while循环计算1到100的和,运行后输出结果是多少? #include <iostream> using namespace std; int main() { int sum=0, i=1; while(i<=100) { sum += i; i++; } cout << sum; return 0; }
在C++中,do-while循环的循环体至少会被执行一次。
以下程序使用for循环求1到100中所有奇数的和,请补全循环变量的增量语句。
#include <iostream>
using namespace std;
int main() {
int sum = 0;
for(int i=1; i<=100; ___) {
sum += i;
}
cout << sum;
return 0;
}观察以下for循环代码,输出“hello”的次数是? #include <iostream> using namespace std; int main() { for(int i=0; i<3; i++) { cout << "hello"; } return 0; }
如果while循环的初始条件为假,那么循环体一次都不会被执行。