CC++ & Algorithm

循环综合应用实例

极难3
语言版本:C++Python
概述:通过三个贴近生活的例子,学会灵活运用循环和分支解决实际问题。

循环综合应用——让程序更聪明地处理数据

学完循环嵌套和分支,我们来挑战一些综合应用吧!这些例子会把循环、条件判断、列表甚至输入输出结合起来,就像做一道复杂的菜,需要把各种调料都用到。掌握这些技巧后,你就能用 Python 解决很多实际生活中的问题,比如统计零花钱、判断密码、生成有趣的数列等等。

下面我们通过三个贴近生活的例子,一步步学会如何灵活搭配循环和分支。


? 实例1:统计全班同学的成绩等级

这是干什么的?
老师想快速知道班里有多少人拿A、多少人拿B……手动数太麻烦,用循环和判断就能一键搞定。

代码怎么工作的?

  • 有一个列表 scores,里面存了5个同学的分数。
  • 创建一个字典 count,用来记录每个等级的人数,初始都是0。
  • for score in scores: 这个循环会依次取出每个分数,然后用 if-elif-else 判断属于哪个区间,并把对应的等级人数加1。
  • 最后打印出字典,就能看到各等级的人数。
scores = [85, 92, 73, 58, 88]   # 成绩列表
# 字典记录各等级人数,初始全部为0
count = {"A":0, "B":0, "C":0, "D":0, "E":0}
for score in scores:            # 循环每个分数
    if score >= 90:
        count["A"] += 1
    elif score >= 80:
        count["B"] += 1
    elif score >= 70:
        count["C"] += 1
    elif score >= 60:
        count["D"] += 1
    else:
        count["E"] += 1
print(count)  # 输出:{'A':1, 'B':2, 'C':1, 'D':0, 'E':1}

? 补充解释:为什么用字典?
字典就像是一个“标签抽屉”:每个等级是一个标签(如 "A"),抽屉里放的是人数。用字典比用5个独立变量更干净,也更容易扩展(比如增加等级F)。

⚠️ 新手常犯的错误

  1. 忘记缩进if-elif 里面的代码必须缩进4个空格(或一个Tab),否则会报错。
  2. 区间重叠:代码中先判断 >=90,再判断 >=80,这样90分只会进入A,不会进入B。如果把顺序搞反(先判断 >=80),那么90分也会被当成B。判断顺序一定要从高分往低分写。
  3. 字典拼写:写 count["A"] 时,冒号必须是英文半角 : 吗?其实字典的键是用方括号 [] 访问,不是冒号。这里容易和定义字典时的 : 弄混,留意区分。

生活中的类似场景

  • 统计班级里生日在春天的同学数量(用月份判断)。
  • 统计你一周花掉的零花钱额度:每天花多少,然后判断是“节省”“普通”还是“超支”。

? 实例2:密码验证程序

这是干什么的?
就像手机解锁,最多输错3次,否则就被锁住。程序中让用户输入密码,正确则显示欢迎,错误则继续尝试。

password = "python123"   # 正确的密码
for attempt in range(3):        # 允许尝试3次,attempt 从0到2
    user_input = input("请输入密码:")
    if user_input == password:
        print("欢迎进入系统!")
        break                   # 正确就退出循环
else:                           # 循环正常结束(没break)时执行
    print("尝试次数已用完,程序退出。")

? for-else 的妙用
Python 的 for 循环后面可以跟一个 else 块:只有当循环没有被 break 中断时,才会执行 else 里的代码。这里如果三次都输错,循环正常走完,就执行 else 输出“尝试次数已用完”。如果中途正确,break 跳出,else 就不会执行。

? 补充解释:range(3) 生成什么?
range(3) 会生成 0, 1, 2 三个数,所以循环会执行3次。attempt 这个变量虽然没在循环体里用到,但可以用来显示是第几次尝试(比如 print(f"第{attempt+1}次尝试"))。

⚠️ 新手常犯的错误

  1. elsefor 对齐错else 必须和 for 在同一缩进级别,而不是和 if 对齐。
  2. 忘记写 break:如果没有 break,就算输入正确,程序也会继续要求输入直到3次结束。
  3. 密码匹配用错符号== 比较两个值是否相等,一个等号 = 是赋值。
  4. input 得到的始终是字符串:如果密码是数字,也要写成字符串(如 "1234")来比较,否则会一直不匹配。

生活中的类似场景

  • 银行卡ATM输入密码,错误3次吞卡。
  • 游戏里输入激活码,限定3次机会。

? 实例3:生成斐波那契数列的前10个数

这是什么数列?
斐波那契数列特别有意思:从0和1开始,后面每个数都是前两个数的和。0, 1, 1, 2, 3, 5, 8, 13, 21, 34……它在自然界里也能找到,比如向日葵花盘上的螺旋线数量。

a, b = 0, 1   # a是第一个数,b是第二个数
for i in range(10):     # 打印10个数
    print(a, end=" ")   # 打印当前a,不换行,用空格隔开
    a, b = b, a + b     # 同时更新a和b:新的a变成原来的b,新的b变成原来的a+b

输出:0 1 1 2 3 5 8 13 21 34

? 解释:a, b = b, a + b 这条语句
这是 Python 特有的“多重赋值”。它会先计算右边的两个值(原来的b,原来的a+b),然后再同时赋值给左边的a和b。所以不需要临时变量,非常简洁。如果分成两行写:

temp = a
a = b
b = temp + b

效果一样,但更啰嗦。

⚠️ 新手常犯的错误

  1. 写成 a = b; b = a + b:如果先执行 a = b,那么a已经变成了原来的b,接着计算 a + b 时,a 已经变了,结果会出错(变成 2*b)。一定要同时赋值。
  2. 循环次数搞错:range(10) 循环10次,打印10个数;如果只想打印10个数,初始a和b要设置好。有人会把 a,b=1,1 开始,那打印的就是另一个版本的斐波那契(少了第一个0)。

生活中的类似场景

  • 小兔子繁殖问题:一对大兔子每个月生一对小兔子,小兔子出生后第二个月才能生,每个月兔子总对数正好是斐波那契数列(意大利数学家斐波那契当年就是用这个问题提出的)。
  • 楼梯台阶:上10级台阶,每次可以走1级或2级,有多少种走法?答案也是斐波那契数列。

? 综合挑战:一个完整的“成绩+密码+数列”小程序

下面的代码把三个例子整合成一个简单的菜单程序。用户可以选择要执行的功能,体会循环、分支、列表、字典的配合使用。

# 功能菜单
def show_menu():
    print("1. 统计成绩等级")
    print("2. 密码验证")
    print("3. 打印斐波那契数列")
    print("0. 退出")

while True:                     # 主循环,一直运行直到用户选择退出
    show_menu()
    choice = input("请选择功能(0-3):")
    
    if choice == "1":
        # 实例1:成绩等级统计
        scores = [85, 92, 73, 58, 88]   # 成绩列表
        count = {"A":0, "B":0, "C":0, "D":0, "E":0}  # 字典记录各等级人数
        for score in scores:
            if score >= 90:
                count["A"] += 1
            elif score >= 80:
                count["B"] += 1
            elif score >= 70:
                count["C"] += 1
            elif score >= 60:
                count["D"] += 1
            else:
                count["E"] += 1
        print("成绩等级统计结果:", count)
    
    elif choice == "2":
        # 实例2:密码验证(最多3次)
        password = "python123"          # 正确密码
        for attempt in range(3):
            user_input = input("请输入密码:")
            if user_input == password:
                print("欢迎进入系统!")
                break
        else:
            print("尝试次数已用完,程序退出。")
    
    elif choice == "3":
        # 实例3:斐波那契数列前10项
        n = int(input("你想打印前几项?请输入数字:"))
        a, b = 0, 1
        for i in range(n):
            print(a, end=" ")
            a, b = b, a + b
        print()   # 换行
    
    elif choice == "0":
        print("再见!")
        break
    
    else:
        print("输入无效,请重新选择。")

运行这个程序,你可以反复选择不同功能,直到输入0退出。这里用了一个 while True 无限循环,直到用户输入 0break 跳出。


? 相关指引

掌握了这三个例子,你就学会了如何把循环forwhile)、分支if-elif-else)、列表字典以及输入输出结合起来。想要更进一步,可以学习:

  • 循环嵌套:比如用一个循环套另一个循环,生成乘法口诀表。
  • 列表推导式:用简洁的一行代码生成新列表。
  • 函数的定义和调用:把常用功能封装成函数,让主程序更清晰(就像上面菜单里用了 def show_menu())。
  • 更多数据结构:如元组、集合,以及如何用循环处理它们。

继续加油!代码写得越多,这些“综合应用”就会变得像搭积木一样简单有趣。

例题精讲

1单选题

以下关于嵌套循环的描述,哪个是正确的?

A外层循环每执行一次,内层循环执行一次
B内层循环的循环变量不能与外层相同
C嵌套循环的总执行次数等于各层循环次数的乘积
D使用break语句可以同时跳出所有循环
2判断题

在Python中,使用嵌套for循环可以打印出九九乘法表。

3填空题
下面的代码使用嵌套循环打印一个5行5列的星号矩形,请填空。
for i in range(5):
    for j in range(___):
        print('*', end='')
    print()
4单选题

执行以下代码后,输出结果中数字10出现了多少次? for i in range(3): for j in range(4): print(i*10 + j)

A0次
B1次
C2次
D3次
5填空题
下面的代码使用while循环嵌套打印一个高度为h的直角三角形(第一行1个*,第二行2个*...)。请填空。
h = 5
i = 1
while i <= h:
    j = 1
    while j <= ___:
        print('*', end='')
        j += 1
    print()
    i += 1