CC++ & Algorithm

分支与循环综合嵌套

困难3
语言版本:C++Python
概述:学会在循环里面加入条件判断,让程序根据不同的情况做不同的事情。

循环里面加判断,程序更聪明——分支与循环综合嵌套

你有没有遇到过这种情况:老师让你在班里依次点名,但遇到请假的同学就不喊,遇到生病的同学就祝他早日康复?这其实就是“循环 + 条件判断”的场景——按顺序一个一个来,但中间根据情况做不同处理。在编程中,我们把这种在循环结构里嵌入条件判断的方式,叫做分支与循环综合嵌套

简单说,就是:重复做某件事,但每次做的时候要看情况决定怎么做。比如走路时每走一步都要判断前面是不是路口,是路口就拐弯,不是就直走。学会这种嵌套,你写程序就能处理很多真实世界里复杂又有规律的任务。


一、在 for 循环里做判断:一边重复一边选择

最常见的嵌套是 for 循环里放 if 语句。每次循环到一个新值时,先判断它满足什么条件,再执行对应的代码。

经典例子:“叮咚”游戏

从1数到10,遇到3的倍数说“叮”,遇到5的倍数说“咚”,同时是3和5的倍数(比如15)说“叮咚”。我们只用1到10,所以没有同时是3和5的倍数(15不在范围内),但程序里仍然要写好这个判断,防止后面扩充。

for i in range(1, 11):             # 循环从1到10,i代表当前数字
    if i % 3 == 0 and i % 5 == 0:  # 既是3又是5的倍数
        print("叮咚")
    elif i % 3 == 0:               # 是3的倍数(但不是5的倍数)
        print("叮")
    elif i % 5 == 0:               # 是5的倍数(但不是3的倍数)
        print("咚")
    else:                          # 其他情况
        print(i)

运行结果:

1
2
叮
4
咚
叮
7
8
叮
咚

注意顺序很重要:一定要把“既是3又是5的倍数”放在最前面,否则会先被 elif i % 3 == 0elif i % 5 == 0 捕获,就轮不到“叮咚”了。你可以试试把第一行判断和后面的交换位置,看看结果会变成什么样。

生活中的例子:检查零花钱是否超支

假设你每天花一点零花钱,把一周的花费存在一个列表里。你想知道哪些天花的钱超过了10元,并打印“超支”,否则打印“正常”。

daily_costs = [8, 12, 5, 15, 10, 7, 9]  # 一周每天的花费(单位:元)
day = 1                                  # 记录第几天
for cost in daily_costs:                 # 遍历每天的花费
    if cost > 10:
        print("第", day, "天超支啦,花了", cost, "元")
    else:
        print("第", day, "天正常花了", cost, "元")
    day = day + 1                        # 天数增加1

输出:

第 1 天正常花了 8 元
第 2 天超支啦,花了 12 元
第 3 天正常花了 5 元
第 4 天超支啦,花了 15 元
第 5 天正常花了 10 元
第 6 天正常花了 7 元
第 7 天正常花了 9 元

二、在 while 循环里做判断:不固定次数,边跑边看

while 循环一般用于“直到满足某个条件才停止”的场景。在里面加判断,可以让程序在循环过程中根据当前情况决定是否继续或做什么。

例子:猜数字游戏(简易版)

程序生成一个1~10的随机数,你每次猜一个数,程序会告诉你猜大了还是猜小了,直到猜对为止。

import random

secret = random.randint(1, 10)   # 系统随机生成一个1到10的秘密数字
guess = 0                        # 初始化猜的数字为0(保证进入循环)
print("猜一个1到10之间的数字")

while guess != secret:           # 只要没猜对,就一直循环
    guess = int(input("请输入你的猜测:"))   # 用户输入数字
    if guess > secret:           # 如果猜大了
        print("猜大了,再小一点")
    elif guess < secret:         # 如果猜小了
        print("猜小了,再大一点")
    else:                        # 猜对了
        print("恭喜!猜对了!")

每次猜完都会根据条件给出提示,循环继续或结束。这种“循环 + 条件判断”的结构在游戏、输入验证中非常常见。


三、新手最容易犯的错误

  1. 缩进错误
    if 下面的代码一定要多缩进一个空格(或一个Tab)。如果缩进不对,Python会报错或逻辑混乱。
    ❌ 错误写法:

    for i in range(5):
    if i > 2:      # 缩进不对,超出了循环体
        print(i)
    
  2. 条件顺序搞反
    前面“叮咚”例子已经说明了。还有比如判断“大于5且是偶数”,如果写成 num % 2 == 0 and num > 5 是一样的,但千万别写成 num > 5 and num % 2 == 0 and ... 却忘记加括号,其实顺序本身不碍事,但逻辑要清晰。

  3. 忘记冒号
    ifelifelseforwhile 后面都要加英文冒号 :。漏掉它程序会报语法错误。

  4. 变量名拼写不一致
    比如循环变量写了 i,后面判断里用成了 I(大写i),Python会认为没定义。建议用有意义的英文单词,并保持大小写一致。

  5. 忘记更新循环控制变量
    while 循环里,如果条件永远不变,会变成死循环。比如猜数字游戏里,如果没写 guess = input(...) 更新猜测值,就会一直在同一个值上循环。


四、完整可运行示例:FizzBuzz 游戏(带统计)

FizzBuzz 是编程面试中很经典的小问题,规则和“叮咚”相似:从1数到30,3的倍数说“Fizz”,5的倍数说“Buzz”,同时是3和5的倍数说“FizzBuzz”,其他数字直接打印。我们再加一个功能:统计一共说了多少次“Fizz”和“Buzz”。

fizz_count = 0    # 统计Fizz出现次数
buzz_count = 0    # 统计Buzz出现次数

for num in range(1, 31):                             # 从1到30
    if num % 3 == 0 and num % 5 == 0:                # 同时是3和5的倍数
        print("FizzBuzz")
    elif num % 3 == 0:                               # 只是3的倍数
        print("Fizz")
        fizz_count = fizz_count + 1                  # 计数加1
    elif num % 5 == 0:                               # 只是5的倍数
        print("Buzz")
        buzz_count = buzz_count + 1                  # 计数加1
    else:
        print(num)

print("-------------")
print("Fizz出现了", fizz_count, "次")
print("Buzz出现了", buzz_count, "次")

运行结果(只展示部分输出):

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...
Fizz出现了 8 次
Buzz出现了 4 次

你可以试试修改范围,比如从1到100,看看Fizz、Buzz各出现几次。


五、相关知识点指引

  • 条件判断ifelifelse 的基本用法([链接到条件判断文章])
  • for循环:遍历列表、字符串、range() 等([链接到for循环文章])
  • while循环:无限循环与控制条件([链接到while循环文章])
  • 列表:存储多个数据并逐个处理([链接到列表文章])
  • range函数:生成整数序列([链接到range函数文章])

掌握了循环里加判断,你就已经可以用程序解决很多需要“重复检查”的问题了。比如:统计考试成绩的优良中差、找出列表里所有符合条件的元素、控制机器人沿着路线走但遇到障碍就转向…… 大胆去试一试吧!

例题精讲

1单选题

以下Python代码段运行后,输出结果是什么? sum = 0 for i in range(1, 6): if i % 2 == 0: continue sum += i print(sum)

A6
B9
C15
D0
2判断题

在while循环中,如果条件永远为真,并且循环体内没有break语句,那么循环将无限执行下去。这种结构通常称为“死循环”。请判断该说法是否正确。

3填空题
下面的程序使用while循环和if语句,统计输入的正整数中偶数的个数。当输入0时结束。请补全代码。
count = 0
num = int(input())
while num != 0:
    if ___:
        count += 1
    num = int(input())
print(count)
4单选题

阅读以下代码,输出的结果是? for i in range(1, 4): for j in range(1, 4): if i == j: print(i, end=' ')

A1 2 3
B1 1 1
C1 2 3 3
D3 2 1
5填空题
以下程序通过for循环遍历字符串s,统计其中大写字母的个数。请补全代码。
s = "Hello World!"
count = 0
for ch in s:
    if ___:
        count += 1
print(count)