分支与循环综合嵌套
困难16让程序学会选择与重复——分支与循环嵌套的妙用
有时候,程序需要一边重复做某件事,一边在重复的过程中根据情况做出不同的选择。比如你玩“猜数字”游戏:电脑随机想一个数,你每猜一次,它都要判断你是猜大了还是猜小了,直到猜对为止。这个过程既有循环(反复猜),又有分支(每次判断大小)。把分支放在循环里面,就叫“分支与循环综合嵌套”。这种结构能帮我们解决很多有趣的问题,比如统计全班有多少人及格、找出所有能被3整除的数、或者让电脑自动帮你计算零花钱的分配。
为什么要嵌套?——生活中的例子
- 统计成绩:老师想看看班里50个同学,哪些人及格了(分数≥60),哪些人没及格。就需要循环每个人,对每个人的分数做一次分支判断。
- 猜数字:你要一直猜,每次猜完电脑都要给你一个提示(大了/小了/对了)。循环负责让你继续猜,分支负责决定提示什么。
- 游戏里的角色:一个怪物每隔1秒移动一次,每次移动前要判断周围有没有障碍物,有的话就拐弯。循环控制时间,分支控制方向。
总之,循环负责重复,分支负责在每个重复步骤里做出选择。
如何在循环里放入分支——基本语法
最常见的写法是:用 for、while 或 do-while 循环来遍历或重复,内部用 if-else if-else 进行条件判断。
例子1:输出1到20之间的所有奇数
这段代码就是从1循环到20,每次判断当前数是不是奇数。如果是奇数,就输出它。
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 20; i++) { // i从1到20,每次加1
if (i % 2 == 1) { // 判断i除以2的余数是否为1(奇数)
cout << i << " "; // 是奇数就输出,后面加个空格
}
}
return 0;
}
运行结果: 1 3 5 7 9 11 13 15 17 19
例子2:计算1到100中所有偶数的和
我们可以用循环累加,嵌套分支只加偶数。
#include <iostream>
using namespace std;
int main() {
int sum = 0; // 存放总和,初始为0
for (int num = 1; num <= 100; num++) { // num从1到100
if (num % 2 == 0) { // 如果是偶数(能被2整除)
sum = sum + num; // 把num加进总和
}
}
cout << "1到100所有偶数的和是:" << sum << endl;
return 0;
}
运行结果: 1到100所有偶数的和是:2550
小窍门:想判断奇数用
num % 2 == 1,判断偶数用num % 2 == 0。
猜数字游戏详解
猜数字是最经典的“循环嵌套分支”应用。下面是一个简化版,假设答案是42。你可以在代码里看到:用 do-while 保证至少猜一次,每次猜完进入 if-else 判断。
#include <iostream>
using namespace std;
int main() {
int guess; // 存放你猜的数
cout << "猜一个1-100之间的数:";
do {
cin >> guess; // 输入你的猜测
if (guess > 42) // 比答案大
cout << "大了,再猜:";
else if (guess < 42) // 比答案小
cout << "小了,再猜:";
else // 等于答案
cout << "恭喜你猜对了!";
} while (guess != 42); // 只要没猜对就继续循环
return 0;
}
注意:这里的 do-while 循环会先执行一次循环体(让你先猜一次),再检查条件。如果第一次就猜对了,条件 guess != 42 为假,循环结束;如果猜错了,会继续提示并等待下一次输入。
为了让游戏更真实,我们可以加上随机数,让电脑每次自动产生不同的答案。需要引入 <cstdlib> 和 <ctime> 两个头文件,用 rand() 生成随机数,srand(time(0)) 设置随机种子。这是扩展内容,感兴趣的同学可以自己试试。
常见错误与陷阱
初学嵌套时,容易犯以下错误:
-
忘记用花括号{}
如果if或else后面只有一条语句,花括号可以省略,但强烈建议永远加上花括号,避免后面添加语句时出错。
❌ 错误示例:if (guess > 42) cout << "大了"; cout << "再猜"; // 这一行不在if里面,会无条件执行✅ 正确:
if (guess > 42) { cout << "大了"; cout << "再猜"; } -
条件写反
- 判断奇数用
% 2 == 1,判断偶数用% 2 == 0。不要混淆。
- 判断奇数用
-
循环条件导致无限循环
比如猜数字中,如果漏掉了输入语句,或者while条件写成了guess == 42(应该是不等于),就会无限循环或者一次都不执行。 -
变量未初始化
sum在累加之前必须赋初值0,否则会得到随机值。 -
混淆
=和===是赋值,比如guess = 42是把42赋给guess。==是判断相等,比如guess == 42是判断guess是否等于42。
在if的条件里一定要用==!
完整示例:猜数字游戏(随机答案,带猜数次数统计)
下面是一个完整的程序,它包含:
- 随机生成一个1~100之间的整数
- 循环让用户猜
- 每次提示“大了”“小了”或“猜对了”
- 记录并显示猜了多少次
#include <iostream>
#include <cstdlib> // 用于 rand() 和 srand()
#include <ctime> // 用于 time()
using namespace std;
int main() {
// 初始化随机种子,让每次运行答案不一样
srand(time(0));
int secret = rand() % 100 + 1; // 随机1~100之间的整数
int guess; // 存放用户每次猜的数
int count = 0; // 记录猜的次数,初始为0
cout << "欢迎来到猜数字游戏!答案在1~100之间。" << endl;
do {
cout << "请输入你的猜测:";
cin >> guess;
count = count + 1; // 每猜一次,次数加1
if (guess > secret) {
cout << "大了!" << endl;
} else if (guess < secret) {
cout << "小了!" << endl;
} else {
cout << "恭喜你猜对了!" << endl;
cout << "你一共猜了 " << count << " 次。" << endl;
}
} while (guess != secret); // 没猜对就继续
return 0;
}
运行示例:
欢迎来到猜数字游戏!答案在1~100之间。
请输入你的猜测:50
小了!
请输入你的猜测:75
大了!
请输入你的猜测:63
大了!
请输入你的猜测:57
恭喜你猜对了!
你一共猜了 4 次。
这个程序把循环、分支、输入输出、变量累加都用上了,是“嵌套结构”的经典代表。
相关知识点指引
如果你想更深入地理解这类程序,可以继续学习以下内容:
- 条件语句:
if、else if、else的区别和用法。 - 循环语句:
for、while、do-while三种循环各自适合什么场景。 - 随机数:
rand()和srand(),以及如何控制范围。 - 布尔表达式:
true、false,以及&&(与)、||(或)、!(非)的运用。 - 累加器和计数器:比如统计总和、统计次数,是变量使用的常见技巧。
掌握分支与循环嵌套,你就能写出更有“智商”的程序,解决日常生活中的许多小问题。动手试试吧!
例题精讲
执行以下程序段,输出结果是: for(int i=1; i<=5; i++){ if(i%2==0) cout << i << " "; }
在while循环中可以使用break语句提前终止循环,但break只能出现在循环或switch语句中。
猜数字游戏:随机数target=42,用户循环输入猜测,猜对则退出。请填空。
#include <iostream>
using namespace std;
int main(){
int target=42, guess;
while(___1___){
cin >> guess;
if(guess == target) ___2___;
else if(guess > target) cout << "大了" << endl;
else cout << "小了" << endl;
}
cout << "恭喜" << endl;
return 0;
}读取一个整数x=5,执行以下代码,输出结果是: int x; cin >> x; for(int i=1; i<=x; i++){ if(i==3) continue; cout << i << " "; }
输出1到100中所有能被3或5整除的数。请填空。
#include <iostream>
using namespace std;
int main(){
for(int i=1; i<=100; ___1___){
if(___2___){
cout << i << " ";
}
}
return 0;
}