第三章程序控制结构
3.1程序控制结构
- 顺序结构:按照语句的顺序,从上而下,一条一条地顺序执行
- 选择结构:又称“分支结构”,分支语句根据一定的条件决定执行那一部分的语句序列
- 循环结构:使一个语句组根据一定的条件执行若干次

3.2选择语句 (条件语句)
3.2.1 if语句
如果满足某种情况,那么就进行某种处理
if 表达式:
语句块

3.2.2 if...else语句
如果满足某种条件,就进行某种处理,否则进行另一种处理
if 表达式:
语句块1
else:
语句块2

3.2.3 if...elif...else多分支语句
如果满足某种条件,就进行某种处理,否则如果满足另一种条件则执行另一种处理
if 表达式1:
语句块1
elif 表达式2:
语句块2
elif 表达式3:
语句块3
...
else:
语句块n

3.2.4 if语句的嵌套
if 表达式1:
if 表达式2:
语句块1
else:
语句块2
else:
语句块3
3.2.5练习题
【例1】判断奇偶数:编写一个程序,让用户输入一个整数,判断该数是奇数还是偶数。
num=int(input("请输入一个整数:")) if num%2==0: print(f"{num}是偶数") else: print(f"{num}是奇数")
【例2】成绩等级判断:编写一个程序,输入一个0-100之间的分数,根据以下规则输出等级:
90-100: A
80-89: B
70-79: C
60-69: D
0-59: F
score = float(input("请输入成绩:")) if score > 100 or score < 0: print("输入成绩无效") elif score >= 90: print("您的等级为A") elif score >= 80: print("您的等级为B") elif score >= 70: print("您的等级为C") elif score >= 60: print("您的等级为D") else: print("您的等级为F")
【例3】比较三个数大小:编写一个程序,输入三个不同的整数,找出并输出最大的数。
a=float(input("请输入第一个数:")) b=float(input("请输入第二个数:")) c=float(input("请输入第三个数:")) max_num=a if max_num<b: max_num=b if max_num<c: max_num=c print("最大值是{}".format(max_num)) # print(f"最大值是{max_num}")
【例4】闰年判断:写一个程序,输入一个年份,判断它是否为闰年。
闰年规则:能被4整除但不能被100整除,或者能被400整除。year=int(input("请输入一个年份:")) if (year%4==0 and year%100!=0) or (year%400)==0: print(f"{year}年是闰年") else: print(f"{year}年不是闰年")
【例5】计算器简单版:编写一个简单的计算器程序,输入两个数字和一个运算符(+、-、*、/),根据运算符进行相应的计算并输出结果。
a=float(input("请输入第一个数值:")) operator=input("请输入运算符:(+、-、*、/)") b=float(input("请输入第二个数值:")) if operator=="+": print(f"{a}+{b}={a + b}") elif operator=="-": print(f"{a}-{b}={a - b}") elif operator=="*": print(f"{a}*{b}={a * b}") elif operator=="/" and b!=0: print(f"{a}/{b}={a/b}") else: print("输入有错误")
【例6】 三角形类型判断:编写一个程序,输入三角形的三条边长,判断它是什么类型的三角形:
等边三角形(三边相等)
等腰三角形(两边相等)
普通三角形(三边都不相等)
如果不能构成三角形,给出相应提示
a=float(input("请输入第一条边的长度:")) b=float(input("请输入第二条边的长度:")) c=float(input("请输入第三条边的长度:")) if a+b>c and a+c>b and b+c>a: if a==b==c: print("该三角形是等边三角形") elif a==b or a==c or b==c: print("该三角形是等腰三角形") else: print("该三角形是普通的三角形") else: print("这三条边不能构成三角形")
【例7】身体质量指数(BMI)计算与分类:编写一个程序,计算BMI并根据以下标准分类:
输入:身高(米)和体重(千克)
计算公式:BMI = 体重 / (身高²)
分类标准:
偏瘦:BMI < 18.5
正常:18.5 ≤ BMI < 24
过重:24 ≤ BMI < 28
肥胖:BMI ≥ 28
h=float(input("请输入您的身高:")) w=float(input("请输入您的体重:")) BMI=h/(w**2) if BMI < 18.5: print("偏瘦") elif BMI >= 18.5 and BMI < 24: print("正常") elif BMI >= 24 and BMI < 28: print("过重") else: print("肥胖")
【例8】个人所得税计算:编写一个程序,根据月收入计算应缴纳的个人所得税(简化版):
起征点:5000元
税率表:
0-3000元:3%
3000-12000元:10%
12000-25000元:20%
25000-35000元:25%
35000-55000元:30%
55000-80000元:35%
80000元以上:45%
income = float(input("请输入月收入: ")) base = 5000 # 起征点 taxable_income = income - base if taxable_income <= 0: tax = 0 elif taxable_income <= 3000: tax = taxable_income * 0.03 elif taxable_income <= 12000: tax = 3000 * 0.03 + (taxable_income - 3000) * 0.10 elif taxable_income <= 25000: tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (taxable_income - 12000) * 0.20 elif taxable_income <= 35000: tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (25000 - 12000) * 0.20 + (taxable_income - 25000) * 0.25 elif taxable_income <= 55000: tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (25000 - 12000) * 0.20 + (35000 - 25000) * 0.25 + (taxable_income - 35000) * 0.30 elif taxable_income <= 80000: tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (25000 - 12000) * 0.20 + (35000 - 25000) * 0.25 + (55000 - 35000) * 0.30 + (taxable_income - 55000) * 0.35 else: tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (25000 - 12000) * 0.20 + (35000 - 25000) * 0.25 + (55000 - 35000) * 0.30 + (80000 - 55000) * 0.35 + (taxable_income - 80000) * 0.45 print(f"应缴纳个人所得税: {tax:.2f}元")
【例9】石头剪刀布游戏:编写一个完整的石头剪刀布游戏程序:
玩家通过输入选择石头、剪刀或布
电脑随机出拳
根据游戏规则判断胜负:
石头赢剪刀
剪刀赢布
布赢石头
记录并显示比分(玩家胜、电脑胜、平局)
提供"再来一局"选项,直到玩家选择退出
# 1. 石头剪刀布游戏 import random options = ["石头", "剪刀", "布"] player_score = 0 computer_score = 0 ties = 0 while True: print("\n--- 石头剪刀布游戏 ---") print("请选择: 1.石头 2.剪刀 3.布 0.退出") choice = input("您的选择 (0-3): ") if choice == '0': break if choice not in ['1', '2', '3']: print("无效选择,请重新输入") continue player_choice = options[int(choice) - 1] computer_choice = random.choice(options) print(f"您出了: {player_choice}") print(f"电脑出了: {computer_choice}") if player_choice == computer_choice: print("平局!") ties += 1 elif (player_choice == "石头" and computer_choice == "剪刀") or \ (player_choice == "剪刀" and computer_choice == "布") or \ (player_choice == "布" and computer_choice == "石头"): print("您赢了!") player_score += 1 else: print("电脑赢了!") computer_score += 1 print(f"当前比分: 玩家 {player_score} - 电脑 {computer_score} - 平局 {ties}") print("游戏结束!") print(f"最终比分: 玩家 {player_score} - 电脑 {computer_score} - 平局 {ties}")
根据需要调整
3.3循环语句
3.3.1while循环语句
注意while的表达式一定要保证程序正常结束,否则会造成死循环
while 表达式:
语句块(循环体)


3.3.2for循环语句
for 迭代变量 in 对象:
语句块(循环体)




3.3.3循环嵌套

3.3.4练习题
【例1】打印数字序列:编写一个程序,使用循环打印1到10的数字,每个数字占一行。
# 使用for循环 print("使用for循环:") for i in range(1, 11): print(i) # 使用while循环 print("\n使用while循环:") i = 1 while i <= 10: print(i) i += 1
【例2】计算1到n的和:编写一个程序,让用户输入一个正整数n,计算并输出1到n的所有整数之和。
# 使用for循环 n=int(input("请输入n的整数数值:")) sum=0 for i in range(1,n+1): sum=sum+i print(f"1到{n}的和为:{sum}") # 使用while循环 i=1 sum=0 n=int(input("请输入n的整数数值:")) while i<=n: sum=sum+i i=i+1 print("1到{}的和为:{}".format(n,sum))
【例3】乘法表:编写一个程序,打印5的乘法表(从1×5到10×5)。
# 使用for循环 for i in range(1,11): print(f"{i}*5={i*5}") # 使用while循环 i=1 while i<=10: print(f"{i}*5={i*5}") i = i + 1 # 扩展:使用for循环打印99乘法表 for i in range(1,10): for j in range(1,i+1): print(f"{i}*{j}={i*j}",end="\t") print() # 扩展:使用while循环打印99乘法表 i=1 j=1 while i<=10: j=1 while j<=i: print(f"{i}*{j}={i*j}",end="\t") j=j+1 print() i = i + 1
【例4】 统计正负数:编写一个程序,让用户连续输入10个整数,统计其中正数、负数和零的个数。
# 使用for循环 positive_count = 0 negative_count = 0 zero_count = 0 print("请输入10个整数:") for i in range(10): num = int(input(f"第{i+1}个数字: ")) if num > 0: positive_count += 1 elif num < 0: negative_count += 1 else: zero_count += 1 print(f"正数个数: {positive_count}") print(f"负数个数: {negative_count}") print(f"零的个数: {zero_count}") # 使用while循环 positive_count = 0 negative_count = 0 zero_count = 0 i=1 print("请输入10个整数:") while i<=10: num=int(input(f"请输入第{i}个数字:")) if num > 0: positive_count += 1 elif num < 0: negative_count += 1 else: zero_count += 1 i+=1 print(f"正数个数: {positive_count}") print(f"负数个数: {negative_count}") print(f"零的个数: {zero_count}")
【例5】斐波那契数列前n项:斐波那契数列是一个经典的数学数列,其中每个数字是前两个数字之和。具体定义如下:
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2) (当n≥2)
编写一个程序,输出斐波那契数列的前10项(0,1, 1, 2, 3, 5, 8, 13, 21, 34)。
# 使用for循环(并行赋值) a,b=0,1 print(f"第1项为{a}") print(f"第2项为{b}") for i in range(3,11): # a = b # b = a + b##这样是错误的,相当于b新=b旧+b旧 #应使用并行赋值 a,b=b,a+b#a和b的更新同时进行 print(f"第{i}项为{b}") # 使用for循环(使用临时变量) a,b=0,1 print(f"第1项为{a}") print(f"第2项为{b}") for i in range(3,11): c = a + b print(f"第{i}项为{c}") a=b b=c #使用while循环 a,b=0,1 print(f"第1项为{a}") print(f"第2项为{b}") n=3 while n<11: a,b=b,a+b print(f"第{n}项为{b}") n+=1
【例6】素数判断:编写一个程序,让用户输入一个正整数,判断该数是否为素数(质数),是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
#使用for循环 a=int(input("请输入一个正整数:")) if a>0: if a==1: print(f"不是素数") elif a==2: print(f"是素数") else: is_prime =True for i in range(2, 11): if a % i == 0 and i != a: is_prime=False print(f"{a}不是素数") break if is_prime: print(f"{a}是素数") else: print("错误")# 使用for循环 a = int(input("请输入一个正整数:")) if a > 0: if a == 1: # 1不是素数 print(f"{a}不是素数") elif a == 2: # 2是素数 print(f"{a}是素数") else: is_prime = True # 检查从2到a的平方根的所有数 for i in range(2, int(a**0.5) + 1): if a % i == 0: is_prime = False break if is_prime: print(f"{a}是素数") else: print(f"{a}不是素数") else: print("请输入一个正整数!")# 使用for循环 a = int(input("请输入一个正整数:")) if a <= 1: print(f"{a}不是素数") else: is_prime = True for i in range(2, int(a**0.5) + 1): if a % i == 0: is_prime = False break print(f"{a}是素数" if is_prime else f"{a}不是素数")# 使用while循环 a = int(input("请输入一个正整数:")) if a <= 1: print(f"{a}不是素数") else: is_prime = True i = 2 while i < (int(a ** 0.5) + 1): if a % i == 0: is_prime = False break i += 1 # 添加这行:递增循环变量 print(f"{a}是素数" if is_prime else f"{a}不是素数")
【例7】数字反转:编写一个程序,让用户输入一个整数,将该数字反转后输出(例如:输入12345,输出54321)。
# 方法1: 使用字符串反转 num=int(input("请输入一个整数,进行反转:")) reversed_str = str(num)[::-1] reversed_num = int(reversed_str) print(f"反转后的数字: {reversed_num}")#使用while循环 num = int(input("\n请输入一个整数: ")) reversed_num = 0 original = num is_negative = False # 处理负数 if num < 0: is_negative = True num = -num while num != 0: digit = num % 10 reversed_num = reversed_num * 10 + digit num = num // 10#将num除以10,然后取结果的整数部分,再赋值给num # 如果是负数,添加负号 if is_negative: reversed_num = -reversed_num print(f"{original} 反转后为: {reversed_num}")
【例8】寻找水仙花数:编写一个程序,找出100-999之间的所有水仙花数。
水仙花数:一个三位数,其各位数字立方和等于该数本身(例如:153 = 1³ + 5³ + 3³)#使用for循环 for i in range(100,1000): a=i%10 b=(i//10)%10 c=i//100 if i==a**3+b**3+c**3: print(f"{i}是水仙花数")#使用for循环 for i in range(100,1000): num_str=str(i) if i==(int(num_str[0])**3+int(num_str[1])**3+int(num_str[2])**3): print(f"{i}是水仙花数")
【例9】猜数字游戏:编写一个完整的猜数字游戏:
电脑随机生成一个1-100之间的数字
玩家有7次猜测机会
每次猜测后,程序提示"太大了"、"太小了"或"恭喜猜对了"
如果猜对,显示用了多少次猜测
如果7次都没猜对,显示正确答案并游戏结束
游戏结束后询问是否再玩一次
#使用for循环 from numpy import random num_com=random.randint(1,100) print(num_com) for i in range(7): num_pla = int(input("请输入:")) if num_com==num_pla: print(f"恭喜猜对了,您猜了{i+1}次") break elif num_com>num_pla: print("太小了") else: print("太大了") else: # 只有当循环正常结束(没有通过break退出)时,才会执行这里的代码 print(f"抱歉您的机会用完了,正确答案是{num_com}")
循环控制语句练习:break, continue, else在循环中的应用
【例1】找到1-50中第一个能被7整除的数
for i in range(1, 51): if i % 7 == 0: print(f"找到: {i}") break else: print("没有找到符合条件的数")
【例2】1-20中不是3的倍数的数
for i in range(1, 21): if i % 3 == 0: continue print(f"{i}", end=" ")
3.4综合实例
【例1】利用蒙特卡罗方法计算圆周率
蒙特卡罗方法是一种基于随机抽样和概率统计的数值计算方法,核心思想是通过 “大量随机试验模拟真实场景”,蒙特卡罗方法的本质是利用 “频率近似概率” 的统计学原理:当随机试验的次数足够多时,事件发生的频率会逐渐趋近于其理论概率。通过对问题构建 “概率模型”,重复生成随机样本并计算结果,最终用样本的统计均值(或其他统计量)作为问题的近似解。
import numpy as np N=10000 M=0 for i in range(N): x,y=np.random.uniform(-1,1), np.random.uniform(-1,1) dis=x**2+y**2 if dis <=1: M+=1 pi=4*(M/N) print(pi)优化:
import numpy as np N = 10000 # 一次性生成所有点 x = np.random.uniform(-1, 1, N) y = np.random.uniform(-1, 1, N) # 向量化计算距离 distances = x**2 + y**2 M = np.sum(distances <= 1) pi = 4 * M / N print(f"估算的π值: {pi}")
【例2】打印出如下效果的实心三角形:
n=int(input("请输入打印行数:")) for i in range(n): for j in range(i+1): print("*", end="") else: print() # 等价于print('\n',end='')
【例3】打印出如下效果的空心三角形:
n=int(input("请输入打印行数:")) for i in range(n): for j in range(i+1): if j==0 or i==j or i==n-1 : print("*", end="") else: print(" ",end="") print()



被折叠的 条评论
为什么被折叠?



