目录
第四章 流程控制
1.顺序结构
(1)程序设计的面向过程思想
<1> 变量初始化(名称、个数、初始值)
<2> 输入(input() )(内容,间隔符)
<3> 处理(算法)
<4> 输出(print())(内容,格式)
(2)原则:自顶向下,逐步细化,由上到下逐条执行,清晰第一,效率第二
(3)例1:输入一个十进制数,输出二进制、八进制、十六进制
num = int(input('输入一个十进制数:'))
print('二进制为:',bin(num))
print('八进制为:',oct(num))
print('十六进制为:',hex(num))
结果:
例2:输入华氏温度,输出摄氏温度,公式为:C=5/9*(F-32)
F = int(input('输入华氏温度:'))
C=5/9*(F-32)
print('摄氏温度:%.2f'%C)
例3:键盘输入两个整数a和b,合并成一个新四位数,例如:a=54,b=12,c=5142
a = int(input('输入两位数的a:'))
b = int(input('输入两位数的b:'))
c = a//10*1000+b//10*100+a%10*10+b%10
print('c为:',c)
例4:发工资遇到一个问题,根据每个人工资总额计算钞票面值的张数,且总张数最少
15896
100:158
50:1
20:2
10:0
5:1
1:1
money = int(input('工资金额为:'))
print('100元的张数为:',money//100,'张')
print('50元的张数为:',money%100//50,'张')
print('20元的张数为;',money%100%50//20,'张')
print('10元的张数为:',money%100%50%20//10,'张')
print('5元的张数为:',money%100%50%20%10//5,'张')
print('1元的张数为:',money%100%50%20%10%5//1,'张')
例5:输入三角形边长,输出面积:
公式:
其中s=(a+b+c)/2
import math
a = int(input())
b = int(input())
c = int(input())
s = (a+b+c)/2
area = math.sqrt(s*(s-a)*(s-b)*(s-c))
print('面积为:',area)
2.选择结构
(1)单分支结构
<1> 语法:
if 表达式:
语句块
<2> 流程图
<3> 例:输入两个数,输出最大值
a = int(input())
b = int(input())
max = a
if a<b:
max = b
print(max)
<4> 注意:
1> 表达式:一般表达式、常量、变量、关系表达式、逻辑表达式
2> 优先级:!(非)>算数运算符>关系运算符>and和or>赋值运算符
3> 规则:逻辑表达式只检测是否为非0或非空字符串或非none就会执行对应分支
4> 分支语句的缩进
(2)双分支结构
<1> 语法:
if 表达式:
语句块1
else:
语句块2
<2> 流程图:
<3> 例:输入一个整数,判断奇偶数
c = int(input('请输入一个整数:'))
if c%2==1:
print('奇数')
else:
print('偶数')
c = int(input('请输入一个整数:'))
if c&1==1:
print('奇数')
else:
print('偶数')
<4> 判断一个数能被7或11整除,但不能同时被7或11整除
d = int(input('请输入一个整数')) # 优先级:and>or
if (d%7==0 or d%11==0) and d%77!=0:
print('yes')
else:
print('no')
<5> 例:判断闰年:可被4整除,不能被100整除,可被400整除
year = int(input('请输入四位数年份:'))
if year%4==0 and year%100!=0 or year%400==0:
print('此年为闰年')
else:
print('此年是平年')
(3)多分支结构
<1> 语法1:
if 表达式1:
语句块1:
else:
if 表达式2:
语句块2:
else:
......
# 逻辑嵌套推荐不超过七层
<2> 语法2:
if 表达式1:
语句块1:
elif 表达式2:
语句块2:
elif 表达式3:
语句块3:
...
else:
语句块n
<3> 流程图:
<4> 例:输入三个整数,降序输出:
a = int(input())
b = int(input())
c = int(input())
if a>b:
if a>c:
if b>c:
print(a,b,c)
else:
print(a,c,b)
else:
print(c,a,b)
else:
if a>c:
print(b,a,c)
elif b>c:
print(b,c,a)
else:
print(c,b,a)
<5> 例:输入一个百分制成绩,输出等级
m = int(input('请输入一个百分制成绩(0-100):'))
if m>100 or m<0:
print('输入有误,请输入0-100范围内的数字')
elif m>=90:
print('优秀')
elif 90>m>=80:
print('良好')
elif m>=60:
print('及格')
else:
print('补考')
<6> 注意:
1> if else elif之后的冒号不能省略:
2> elif和else不能单独使用
3> 通过缩进判断是否是同一语句块
3.循环结构
(1)while循环:
<1> 格式:
while 条件表达式:
循环体语句
<2> 流程图
(2)for循环
<1> 格式:
for 迭代变量 in 对象:
循环体
# 数值循环:
for 迭代变量 in range (start,end,step):
循环体
<2> range()函数
1> Python3中内置函数,用于生成一系列连续的整数
2> start:计数起始值,省略则为0
3> end:计数终止值,不包含(开区间)。如:range(9) 表示产生0-8的整数,end参数不可省略
4> step:步长,默认为1
PS:range()函数只有一个参数时,该参数表示end,两个参数时为start和end,三个参数时最后一个为step
例:
# while循环
sum = 0 # 累加和变量
i = 1
while i<=100:
sum = sum+i
i+=1
print('sum=',sum)
# for循环
sum = 0
for i in range(101):
sum+=i
print('sum=',sum)
<3> 注意
1> 循环表达值为非0时执行循环体
2> 循环区间尽量使用开区间
3> 循环嵌套时钟长循环应在内部,短循环在外部,以减少内外循环跨越次数
4> 循环嵌套应限制在3层以内,以提高理解性
4.程序实例
(1)累加和迭代
<1> 框架:
sum = 0
for i in range(终止值):
sum = sum+新项
<2> 例:计算下列多项式的值:
sum = 0
for i in range(1,101):
sum = sum + 1/i
print('sum = %.6f'%sum)
# sum = 5.187378
<3> 例:计算下列多项式的值:
sum = 1
num = 1
for i in range(2,101):
num = num + i
sum = sum + 1/num
print('sum = %.6f'%sum)
# sum = 1.980198
<5> 例:计算下列多项式的和
# 备份旧分子
# 新分子 = 旧分子 + 旧分母
# 新分母 = 备份分子
a = 3
b = 2
sum = 0
for i in range(20):
sum = sum + a/b
t = a
a = a + b
b = t
print('sum=%.6f'%sum)
# sum=32.278295
<6> 例:计算π的近似值公式
pi = 1
f = -1
i = 3
while 1/i>1e-6:
pi = pi +1/i*f
f = -f
i = i+2
print('pi=%.6f'%(pi*4))
# pi=3.141591
# 多项式迭代某一项运算结果大于1e-6时说明其值需要累加,误差较大时需要继续运算,小于等于1e-6时则结束循环迭代,表明当前项数值,误差可控可以结束循环
<7> 例:用泰勒级数计算e的近似值
sum = 1
t = 1
i = 1
while 1/t>1e-6:
t = t*i
sum = sum + 1/t
i += 1
print('sum=%.6f'%sum)
# sum=2.718282
<8> 例:计算a+aa+aa+aaa…aaa的值,计算前六项和,a=2
a = 2
sum = 0
for i in range(6):
sum = sum + a
a = a*10 + 2
print('sum = ',sum)
# sum = 246912
(2)素数判断
<1> break语句(结束循环):终止当前循环,执行循环外的下一条语句,一般与if搭配使用
例:计算r=1到r=10时的圆的面积,直到面积大于100为止
import math as a
for r in range(1,11):
area = a.pi*r*r
if area>100:
break
print('r:',r,'area: is:%.6f'%area)
# r: 6 area: is:113.097336
<2> continue语句(加速循环):跳出当前次循环,继续执行下一次循环,一般与if语句搭配使用,若执行到continue语句,该语句之下的所有循环体语句将不在执行,直接跳到下一次步长迭代处
例:将100-150之间的不能被3整除的数输出,一行输出10个数
i = 0
for n in range(100,151):
if n%3 == 0:
continue
print(n,end=' ')
i+= 1
if i%10 == 0:
print()
# 100 101 103 104 106 107 109 110 112 113
# 115 116 118 119 121 122 124 125 127 128
# 130 131 133 134 136 137 139 140 142 143
# 145 146 148 149
<3> for-else结构:for循环执行完或者未进入循环(即for循环不是通过break语句跳出而中断的)情况下执行else。
例:找出2,3,5的最小公倍数
for i in range(1, 100):
if i % 2 == 0 and i % 3 == 0 and i % 5 == 0:
print('%d是2,3,5的最小公倍数' % i)
break
else:
print('未找到!')
# 30是2,3,5的最小公倍数
执行过程:当for循环正常执行完毕则会执行else之后的语句,若执行break异常跳出,则不会执行else语句。
(若删除break,所有公倍数都会被打印,又满足循环正常结束,则else之后的‘未找到!’也正常打印出来)
<4> 素数:只能被1和自己整除的数为素数
例:输入整数,判断是否为素数:
法一:
p = int(input('请输入一个正整数:'))
if p<2: # 保证输入数据大于2
print('请输入大于2的正整数!')
else:
for i in range(2,p):
if p%i == 0:
print('平数')
break
else: # 循环顺利结束后执行
print('素数')
判断的范围【2,n-1】
判断的方法【整除%】
法2:
p = int(input('请输入一个正整数:'))
i = 2
if p<2: # 保证输入数据大于2
print('请输入大于2的正整数!')
else:
while p%i !=0: # 检测结果是否为非0
i = i+1
if i == p:
print('素数')
else:
print('平数')
法3:筛选法
(3)穷举法
<1> 在指定范围内寻找符合条件的数
<2> 框架:
for i in range(起始,终止,步长)
if 条件表达式:
处理
<3> 例:输出100以内的素数
for i in range(2,100): #遍历2-99
for j in range(2,i):
if i%j == 0:
break
else:
print(i,end=' ') # 输出素数
<4> 例:输出200-400的非素数
for m in range(200, 400):
for n in range(200, m):
if m % n == 0:
print(i, end=' ')
break
<5> 例:输出大于s且紧随s的k个素数
s = int(input('请输入起始值:'))
k = int(input('请输入需要的素数个数:'))
i = s + 1
t = 0 # 计数器,记录找到的素数个数
while t < k: # 当自己找到的素数个数t小于指定个数k的时候,继续寻找
for j in range(2, i): # 判断i是否为素数
if i % j == 0:
break
else:
t = t + 1 # 记录找到的素数个数
print(i, end=' ') # 输出素数
i = i + 1 # 继续下一个数的寻找
<6> 输入100以内被9整除,余数为2的数,计算其平均值的平方根并输出
a = 0
t = 0 # 计数器
for i in range(100):
if i % 9 == 2: # 计算对9取余,余数为2
print(i,end=' ')
a = a + i # 计算和值
t = t + 1 # 记录个数
print('\n a=%.2f'%((a/t)**0.5))
<7> 输出水仙花数,一个三位数,每位立方和等于原值
for i in range(100,1000):
if (i%10)**3 + (i//10%10)**3 + (i//100)**3 ==i:
print('水仙花数:',i)
<8> 例:输出1000以内的完数,完数:因子之和等于原值,如:6==1+2+3
for i in range(6,1000): #遍历0-999
sum = 0 # 每判断一个i,必须先清零其因子之和
for j in range(1,i): # 寻找因子
if i%j == 0:
sum = sum + j # 计算因子之和
if sum==i:
print(i,end=' ')
<9> 例:输出100以内的同构数,同构数:一个正整数出现在它的平方书的右侧则为同构数。
如:5==25 6==36 25==625
for i in range(100):
# 100以内同构数平方后可能为2位数或者3位数
if i==i*i%10 or i==i*i%100:
print(i,end=' ')
<10> 例:输出200以内的回文数字
for i in range(200):
t = 0 # 倒置后数
m = i
while m > 0: #对i进行整数倒置
t = t*10 + i%10
m=m//10
if t == i:
print(i,end=' ')
(4)数学问题
<1> 例:求整数a与b的最小公倍数
# 法1:
a = int(input('请输入第一个整数:'))
b = int(input('请输入第二个整数:'))
i = 1
while 1: # 循环恒真时执行下列语句
if i % a == 0 and i % b == 0:
print('最小公倍数:', i)
break # 第一次找到公倍数就跳出,保证是最小公倍数
i = i + 1
# 法2
a = int(input('请输入第一个整数:'))
b = int(input('请输入第二个整数:'))
i = 0
while 1: # 循环恒真时执行下列语句
i += a # i默认是a的倍数,
if i % b == 0:
print('最小公倍数:', i)
break # 第一次找到公倍数就跳出,保证是最小公倍数
<2> 例:求整数x和y的大公约数以及最小公倍数
x = int(input('请输入第一个整数:'))
y = int(input('请输入第二个整数:'))
l = x * y # l是最小公倍数
while x % y != 0: # 辗转相除法
t = x % y
x = y
y = t
g = y # g是最大公约数
l = l // g
print('最大公约数:', g, '最小公倍数', l)
<3> 例:在键盘输入四位数整数,转换为英文单词输出。如:1024 one zero two four
a = int(input('请输入一个四位数整数:'))
t = 1000
if a >= 1000 and a < 10000:
while t > 0:
if a // t % 10 == 0:
print('zero', end=' ')
elif a // t % 10 == 1:
print('one', end=' ')
elif a // t % 10 == 2:
print('two', end=' ')
elif a // t % 10 == 3:
print('three', end=' ')
elif a // t % 10 == 4:
print('four', end=' ')
elif a // t % 10 == 5:
print('five', end=' ')
elif a // t % 10 == 6:
print('six', end=' ')
elif a // t % 10 == 7:
print('seven', end=' ')
elif a // t % 10 == 8:
print('eight', end=' ')
elif a // t % 10 == 9:
print('nine', end=' ')
t = t // 10
else:
print('您输入的数据有误')
# 整数由左向右拆分
<4> 例:fibonacci数列,古典数学问题:一对兔子,出生后第三个月都生出一对兔子,小兔子到第三个月又生出一对兔子,兔子不死,问兔子的出生规律:1 1 2 3 5 8 13……
a1 = 1
a2 = 1
for i in range(6):
print(a1,a2,end=' ')
a1 = a1 + a2
a2 = a1 + a2
# fibonacci:当前项等于前两项之和
<5> 例:计算fibonacci数列中大于t的最小值,如:t = 6,输出8
a1 = 0
a2 = 1
a3 = 1
t = int(input('请输入需要的t的大小:'))
while a3 <= t:
a1 = a2
a2 = a3
a3 = a1 + a2
print('大于t的fibonacci最小值为:', a3)
<6> 有一张足够大的纸,厚度为0.09mm,对折多少次后超过8848m(珠穆朗玛峰高度)
t = 0
h = 0.09e-3 # 纸的厚度,单位统一为米
while 1:
h = h * 2 # 对折,厚度乘2
t = t + 1 # 记录对折次数
if h>8848:
break
print('对折了',t,'次')
<7> 例:爱因斯坦阶梯问题,多级阶梯,每步跨2阶余1阶、跨3阶余2阶、跨5阶余4阶、跨6阶余5阶、跨7阶正好到顶。一共多少阶?
i = 7
while 1:
if i%2==1 and i%3==2 and i%5==4 and i%6==5 :
break
i +=7
print('阶梯总数为:',i) #119
<8> 例:百钱买百鸡问题。鸡翁值钱5,鸡母值钱3,鸡雏3值1钱,百钱买白鸡,鸡翁,鸡母,鸡雏各几何?
for c in range(101):
for h in range(101):
for ch in range(101):
if c + h + ch ==100 and c*5 + h*3 + ch//3 == 100 and ch%3 ==0:
print('公鸡=',c,'只','母鸡=',h,'只','小鸡=',ch,'只')
<9> 例:搬砖问题:36个人36块砖,男4女3,小孩2人1块,一次性搬完,需要各多少人?
for m in range(10):
for w in range(14):
for c in range(37):
if m+w+c==36 and m*4 + w*3 + c//2 == 36 and c%2 == 0:
print('男=',m,'人','女=',w,'人','小孩=',c,'人')
<10> 例:猴子偷桃:一天吃一半还多吃一个,第七天吃完,偷桃总数?
n = 0
for i in range(7):
n = (n + 1) * 2
print('桃子总数:', n)
(5)打印图形
<1> 如下:
h = int(input('请输入图形高度:'))
for i in range(h):
for j in range(0, h - i - 1):
print(' ', end='')
for k in range(0, 2 * i + 1):
print('*', end='')
print()
<2> 打印以下图形:
h = int(input('请输入图形高度:'))
for i in range(h):
for j in range(i):
print(' ', end='')
for k in range( 2 *(h-i)-1 ,0, -1):
print('*', end='')
print()
<3> 例:打印以下图形
h = int(input('请输入图形高度:'))
for i in range(h):
for j in range(h-i):
print(' ',end='')
for k in range(i+1):
print('*',end='')
print()
5.项目:打印指定月份的日历
(1)软件瀑布模型:自顶向下,重复分析
问题的定义:需要解决的问题是什么?
可行性分析:该软件是否可以实现,成本分析、技术分析
需求分析:需求功能的分解(重要)---软件架构师
概要设计:模块功能设计、模块规模设计、参数传递、数据库设计等
详细设计:数据结构,算法
实现:编写代码,实现功能
测试:单元测试、集成测试、功能测试、回溯测试
运行维护:上线运行、版本迭代
(2)日历软件的制作:
问题定义:用户输入年、月、日,屏幕打印日历,参照windows日历
可行性分析:yes
需求分析:
输入:年、月、日
处理:
<1> input()接收输入结果
<2> 判断闰年、判断大月、小月
<3> 大月:31天 小月:30天 二月:28 29(闰年)
<4> 判断输入月份在1-12之间
<5> 判断每月第一天是星期几:蔡勒公式
1> 蔡勒公式:判断1582年10月4日以后的任意日期是星期几 #计算每月第一天是星期几
2> w=(y%100)+(y%100//4)+(y//100//4)-(2*(y//100))+26*(m+1)+1-1
3> w是星期几的数字代号,星期一:1 星期二:2 。。。。。。。星期日:0
4> w可能为负数,需要处理为整数
5> 蔡勒公式中若为1月或2月表示为上一年的13月和14月,需要进行处理
<6> 输出一\t二\t三\t四\t五\t六\t日
<7> 根据计算的w将本月的第一天与对应的星期几对齐
<8> 输出每月的数字,间隔符是\t,逢7换行
输出
概要设计:略
详细设计:略
实现:
测试:黑盒---4组
(3)代码实现:
# y:年 m:月 d:日 w:周几 其他未控制
# 2022-10-19 1.0版本
y = int(input('请输入年份:'))
m = int(input('请输入月份:'))
t = 0 # t用于表示平年和闰年的标志位
if y % 4 == 0 and y % 100 != 0 or y % 400:
t = 1
if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m == 10 or m == 12:
d = 31 # 计算大月天数
elif m == 2 and t == 0:
d = 28 # 计算平年2月天数
elif m == 2 and t == 1:
d = 29 # 计算闰年2月的天数
elif m == 4 or m == 6 or m == 9 or m == 11:
d = 30 # 计算小月天数
else: # 保证输入月份在1-12月
print('输入有误,请重新输入')
if m >= 1 and m <= 12:
print('\n======', y, '年', m, '月', '======\n')
if m == 1:
m = 13
y = y - 1 # 若为1月则蔡勒公式中为上一年13月
elif m == 2:
m = 14
y = y - 1 # 若为1月则蔡勒公式中为上一年13月
# 蔡勒公式
w = (y % 100) + (y % 100 // 4) + (y // 100 // 4) - (2 * (y // 100)) + 26 * (m + 1) + 1 - 1
w = (w % 7 + 7) % 7 # 保证w为正数
if w == 0: # 蔡勒公式中星期日数值为0,改为7
w = 7
print('一\t二\t三\t四\t五\t六\t日')
i = 1
while i < w: # 将本月第一天与星期几对齐
print('\t', end='')
i += 1
i = 1
while i <= d: # 循环输出本月的天数
print('%2d' % i, '\t', end='')
w = w % 7 # 逢7换行
if w % 7 == 0:
print()
w = w + 1
i = i + 1
print('\n=========================\n')
import calendar as c
y=int(input('请输入四位数年份数字:'))
m=int(input('请输入月份数字:'))
cal = c.month(y,m)
print(cal)