分支与循环综合应用
较难7巧用分支与循环:FizzBuzz游戏带你入门
想象你在玩一个数数游戏:从1数到100,但是遇到3的倍数要说“Fizz”,遇到5的倍数要说“Buzz”,如果既是3的倍数又是5的倍数(比如15)就要说“FizzBuzz”。如果都不是,就老老实实报数字。
这个游戏里需要两个本领:
- 循环:从1一直数到100,一个数字一个数字地处理。
- 分支:对每个数字,根据不同的条件(是否被3或5整除)做出不同的反应。
在编程中,我们经常要把“重复做一件事”和“根据条件做不同选择”结合起来。今天我们就用C++中的for循环和if-else分支,来玩转这个经典游戏,并学会如何举一反三。
一、先理解循环:让电脑自动数数
循环就是让电脑反复执行某段代码,直到满足停止条件。比如要从1数到100,我们不用写100遍cout << 1; cout << 2; ...,只需写一个循环:
for (int i = 1; i <= 100; i = i + 1) {
// 每次循环,i 的值会从1变成2、3……一直到100
}
生活中例子:体育老师让全班同学报数,从第1个同学到第40个同学。老师只需要喊一句“从1到40报数”,不用一个一个点名。循环就是这句指令。
关键点:
int i = 1;循环变量初始值i <= 100;循环继续的条件(当条件为真时继续)i = i + 1;每次循环后更新(也可以写成i++,效果一样)
二、再学会分支:电脑能根据条件做选择
分支让程序“看情况说话”。比如判断一个数是不是3的倍数,用取模运算符%:
i % 3 == 0表示 i 除以3余数为0i % 5 == 0表示 i 除以5余数为0
生活中例子:妈妈让你去买酱油,如果商店有打折就买两瓶,否则买一瓶。这个“如果……否则……”就是分支。
分支的基本格式:
if (条件) {
// 条件成立时执行
} else if (另一个条件) {
// 另一个条件成立时执行
} else {
// 所有条件都不成立时执行
}
注意:条件判断的顺序很重要!比如要先判断“既是3又是5的倍数”,再判断“只是3的倍数”,否则先判断“只是3的倍数”就会把15也归入“Fizz”里,这就错了。
三、循环和分支合体:FizzBuzz游戏代码
把循环和分支结合起来:在循环体里,对每一个数字i用分支判断该输出什么。
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0 && i % 5 == 0) { // 同时被3和5整除
cout << "FizzBuzz" << endl;
} else if (i % 3 == 0) { // 只被3整除
cout << "Fizz" << endl;
} else if (i % 5 == 0) { // 只被5整除
cout << "Buzz" << endl;
} else { // 其他情况
cout << i << endl;
}
}
return 0;
}
代码解释:
for (int i = 1; i <= 100; i++)让i从1增加到100,每次增加1。这就是循环。- 大括号里面是一连串的
if-else if-else:先判断是否同时被3和5整除(i % 3 == 0 && i % 5 == 0),再判断是否只被3整除,然后判断是否只被5整除,最后兜底输出数字本身。
四、新手容易犯的几个错误
-
条件顺序搞反:如果把
i % 3 == 0放在i % 3 == 0 && i % 5 == 0前面,那么当i=15时,第一个条件i % 3 == 0成立,就会输出“Fizz”而不是“FizzBuzz”。一定要把最特殊的条件放在最前面。 -
忘记花括号:如果
if后面只有一条语句,可以省略花括号;但如果有多条语句,必须用花括号括起来。比如:if (i % 3 == 0) cout << "Fizz"; // 只有这一句属于if cout << "Buzz"; // 这句永远会执行,跟if没关系!这会导致逻辑错误。
-
分号乱加:不要在
if或else后面加分号,如if (条件);会使得条件判断后什么也不做,后面的语句总会执行。 -
循环条件写错:比如
i <= 100写成i < 100就会漏掉100;或者忘记写i++导致死循环。
五、更多生活中的例子
掌握了循环+分支,你可以解决很多类似问题:
-
全班成绩等级:循环每个同学,分支判断分数:
for (int student = 1; student <= 40; student++) { int score; // 分数 cin >> score; if (score >= 90) cout << "优秀" << endl; else if (score >= 60) cout << "及格" << endl; else cout << "不及格" << endl; } -
红绿灯时间模拟:循环60秒,每5秒判断一次颜色:
for (int sec = 1; sec <= 60; sec++) { if (sec <= 30) cout << "绿灯" << endl; else if (sec <= 33) cout << "黄灯" << endl; else cout << "红灯" << endl; } -
零花钱计算:每天存钱,周末给双倍:
int total = 0; // 总零花钱 for (int day = 1; day <= 7; day++) { int amount = 10; // 每天存10元 if (day == 6 || day == 7) { amount = amount * 2; // 周末双倍 } total = total + amount; } cout << "一周存了" << total << "元" << endl;
六、完整可运行示例(加上注释)
以下是一个可直接复制到编程环境运行的FizzBuzz程序,每行都加了中文注释:
#include <iostream>
using namespace std;
int main() {
// 从1循环到100,每次 i 增加1
for (int i = 1; i <= 100; i++) {
// 最特殊的情况:同时被3和5整除(即15的倍数)
if (i % 3 == 0 && i % 5 == 0) {
cout << "FizzBuzz" << endl;
}
// 其次:只被3整除(3的倍数但不是15的倍数)
else if (i % 3 == 0) {
cout << "Fizz" << endl;
}
// 再其次:只被5整除(5的倍数但不是15的倍数)
else if (i % 5 == 0) {
cout << "Buzz" << endl;
}
// 最后:既不是3也不是5的倍数,输出数字本身
else {
cout << i << endl;
}
}
return 0;
}
你可以把这个代码拷贝到你的编程环境里运行一下,看看输出是不是符合游戏规则。你还可以修改条件,比如把3改成4、5改成7,创造属于你自己的暗号游戏!
七、你学到了什么?
- 循环让重复工作自动化,不必写100遍判断。
- 分支让程序能根据不同情况作出不同选择。
- 两者结合就能解决很多现实问题,比如检查全班同学的分数等级、模拟红绿灯时间变化等。
进一步探索:
- 除了
for循环,还可以用while循环完成同样任务,试试看。 - 分支还可以嵌套(在分支里再写分支),比如先判断星期几再判断天气。
- 试着把FizzBuzz改成:遇到3的倍数说“哈”,5的倍数说“嘿”,同时是倍数说“哈哈”,其他报数。
如果你已经掌握了这种组合,恭喜你,你已经跨过了编程中非常重要的一道坎。接下来可以挑战更多有趣的问题,比如猜数字游戏、密码验证等等。加油!
例题精讲
下列程序段执行后,输出结果是什么? int sum = 0; for (int i = 1; i <= 10; i++) { if (i % 2 == 0) continue; sum += i; } cout << sum;
在循环中使用if语句时,如果if条件满足,执行break会立即终止循环,而continue会跳过本次循环剩余语句并开始下一次循环。
完成下列代码,计算1到n之间所有能被3或5整除的数的和。
int n, sum = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
if ( ___) {
sum += i;
}
}
cout << sum;关于以下代码段,下列说法正确的是? int x = 12345, count = 0; while (x > 0) { if (x % 2 == 1) count++; x /= 10; } cout << count;
补全代码,输入一个正整数n,输出n行等腰实心三角形图案(第一行1个星号,居中)。
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) cout << " ";
for (int j = 1; j <= ___; j++) cout << "*";
cout << endl;
}