版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章程序流程控制结构化程序设计5.1顺序结构5.2分支结构5.3循环结构5.4流程跳转语句5.5异常处理5.6本章小结5.7本章实训5.8本章导读35.1结构化程序设计5结构化程序设计的特点:一个入口、一个出口。5.1结构化程序设计5.2顺序结构7顺序结构表示程序中的各操作是按照它们出现的先后顺序执行。5.2顺序结构radius=6378.137#地球赤道半径6378.137kmdensity=5507.85#地球平均密度5507.85kg/m³pi=3.141592653589793#圆周率pi值volume=4/3*pi*radius**3#计算地球体积,立方千米print(f'地球体积约为{volume}立方千米')#地球体积约为1086851326519.959立方千米weight=volume*1000**3*density#计算地球质量,kgprint(f'地球质量约为{weight}千克')#地球质量约为5.986214078772957e+24千克5.3分支结构9分支结构需要根据某一特定的条件选择其中的一个分支执行。用if、elif、else关键字或其组合来选择要执行的语句,有单选择、双选择和多选择三种形式。语法格式:5.3分支结构if条件测试表达式1:
语句块1
elif条件测试表达式2:
语句块2
elif条件测试表达式3:
语句块3
……
else:
语句块n#if必须有且只能有一个#elif有0个或多个#else有0个或1个10if…elif…else语句将整个区间分为若干个区间,当满足其中某一个区间的条件时,一定不会再满足后续的其他条件,程序即终止判定。5.3分支结构
elseifelifelifelifelif语句块5语句块4语句块3语句块2语句块1语句块6if115.3.1单分支单分支结构1score=int(input())ifscore>=60:#若成绩大于或等于60
print('成绩合格')125.3.1单分支单分支结构2score=int(input())if0<=score<=100:#若成绩大于或等于0且小于或等于100
print('成绩合法')135.3.1单分支单分支结构3score=int(input())ifscore>100orscore<0:#不合理分数时为“Dataerror!”
result='Dataerror!'if60<=score<=100:#区间为60=<score<=100
result='合格'if0<=score<60:#区间为0=<score<60
result='不合格'print(result)14二分支结构15.3.2二分支score=int(input())ifscore>=60:
print('成绩合格')else:
print('不合格')15二分支结构25.3.2二分支score=int(input())if0<=score<=100:
print('正常成绩')else:
print('异常成绩')16二分支结构35.3.2二分支score=int(input())ifscore>100orscore<0:
print('异常成绩')else:
print('正常成绩')17多分支结构5.3.3多分支结构实例说明:输入一个整数,当输入不在[0,100]区间时输出提示“Dataerror!”;当输入满足要求的前提下,用多分支结构实现百分制转五分制。实现规则是根据分数所在区间[0,60)、[60,70)、[70,80)、[80,90)、[90,100],分别输出字符“E”、“D”、“C”、“B”、“A”。5.3.3多分支结构18实例5.1百分制分数转五分制19score=int(input())ifscore>100orscore<0:#不合理分数时为“Dataerror!”
result='Dataerror!'elifscore>=90:#区间为90=<score<=100
result='A'elifscore>=80:#区间为80=<score<90
result='B'elifscore>=70:#区间为70=<score<80
result='C'elifscore>=60:#区间为60=<score<70
result='D'else:#区间为0=<score<60
result='E'print(result)实例代码:多分支实现实例5.1百分制分数转五分制不同的条件下只会进入其中一个分支只需要在每个分支里改变变量的值退出分支语句后用一个print()函数进行输出20score=int(input())#int()函数将输入的整数字符串转换成整数if90<=score<=100:#等价于score>=90andscore<=100
result='A'if80<=score<90:
result='B'if70<=score<80:
result='C'if60<=score<70:
result='D'if0<=score<60:
result='E'ifscore<0orscore>100:
result='Dataerror!'print(result)实例5.1百分制分数转五分制不论前面是否已经找到满足条件的分支,后续所有if语句都会被执行需要判定每个if语句中的条件,降低效率并容易引入错误。实例代码:单分支实现21score=int(input())ifscore>100orscore<0:#先去除异常数据
result='Dataerror!'else:#此分支下0=<score<=100
ifscore>=90:#此分支下90=<score<=100
result='A'
else:#此分支0=<score<90
ifscore>=80:#此分支下80=<score<90
result='B'
else:#此分支0=<score<80
ifscore>=70:#此分支下70=<score<80
result='C'
else:#此分支0=<score<70
ifscore>=60:#此分支下60=<score<70
result='D'
else:#此分支0=<score<60
result='E'print(result)#各分支下只改变result的值,此处统一输出一次实例5.1百分制分数转五分制务必严格控制各级别代码块的缩进量,以正确层次结构多层缩进,不利于阅读能用多分支时,不建议用二分支实例代码:二分支实现实例说明:某城市出租车计费标准如下:(1)起步里程为3公里(含3公里),起步费13元;(2)载客里程3~15公里范围的,除起步费外,超过3公里的部分按基本单价2.3元/公里计算;(3)载客里程超过15公里的,15公里内的按照(2)计算,超过15公里的基本单价加收50%的费用;(4)时速低于12公里/小时的慢速行驶时间计入等待时间,每等待1分钟加收1元;在同一行内输入用半角逗号分隔的乘车里程(整数)和等待时间,计算并输出车费。5.3.3多分支结构22实例5.2出租车计费23distance,waiting_time=eval(input())#将逗号分隔的数字转元组同步赋值给两个名字,例如输入25,12start_fare=13#起步价为13元,单独定义,方便修改此值ifdistance<=3:#如果行驶里程不超过起步里程
fare=start_fare#收费为起步价elif3<distance<=15:#如果行驶里程超过起步里程但不超过15公里
fare=start_fare+(distance-3)*2.3#收费为起步费+超过3公里的部分2.3元/公里+等待费用else:#如果行驶里程超过15公里,15公里内的按照(2)计算,超过15公里的基本单价加收50%的费用2.3*(1+0.5)
fare=start_fare+(15-3)*2.3+(distance-15)*2.3*(1+0.5)ifwaiting_time>0:#若等待时间不为0
fare=fare+waiting_time*1#等待时间每分钟1元print("{:.0f}".format(fare))#保留0位小数,输出结果87实例代码:实例5.2出租车计费实例说明:某公司五险一金扣缴比例为应发工资的35%,请编写个人所税计算程序,输入应发工资,输出应缴个人所得税款金额和实发工资金额,结果保留小数点后两位。5.3.3多分支结构24实例5.3个税计算器背景知识:个人所得税的计算,可以将应纳税所得额分成不同级距和相应的税率来计算。速算扣除数是指用应纳税所得额直接乘当前税率计算税款时,需扣除的数额。例如应纳税所得额为20000元时,应阶梯计税,3000按3%计税,9000按10%计税,8000按20%计税,共缴税2590元。若直接按当前收入对应的20%的税率计算,需缴税款为4000元,其中有3000元多计了17%的税(510),9000元多计了10%的税(900),应扣减掉1410,所以税率20%时速算扣除数为1410元。即应纳税额=20000*20%-1410元=2590元,速算扣除数使计算更简洁。实例5.3个税计算器25所得税计算公式如下:应纳税额=(工资薪金所得-五险一金-个税免征额)×适用税率-速算扣除数目前中国个税免征额为5000元/月,7级超额累进个人所得税税率与速算扣除数表如下:实例5.3个税计算器26全月应纳税所得额(含税级距)税率(%)速算扣除数不超过3,000元30超过3,000元至12,000元的部分10210超过12,000元至25,000元的部分201,410超过25,000元至35,000元的部分252,660超过35,000元至55,000元的部分304,410超过55,000元至80,000元的部分357,160超过80,000元的部分4515,160实例5.3个税计算器27思路:收入在不同区间时,只有税率与个税速算扣除数值发生变化,在每个区间改变这两个值即可结束分支后计算税额并格式化输出28salary=float(input())#应发工资薪金所得wage=salary-salary*0.35-5000#计算应纳税工资ifwage<=0:#收入减五险一金低于个税免征额时
rate,fee=0,0#税率和扣除数值均为0elifwage<=3000:#按应纳税工资分阶确定税率和扣除数
rate,fee=3,0#设定此区间税率和扣除数值elifwage<=12000:
rate,fee=10,210elifwage<=25000:
rate,fee=20,1410elifwage<=35000:
rate,fee=25,2660elifwage<=55000:
rate,fee=30,4410elifwage<=80000:
rate,fee=35,7160else:
rate,fee=45,15160tax=abs(wage*rate/100-fee)#计算应纳税额,加绝对值避免-0.0real_wage=salary-salary*0.35-tax#实发工资print(f"应缴税款{tax:.2f}元,实发工资{real_wage:.2f}元。")实例代码实例5.3个税计算器29条件表达式是用一条语句实现一个二分支结构四条语句的功能。语法格式:三元操作符条件表达式值为True,计算表达式x的值并返回其运算结果条件表达式值为False,计算表达式y的值并返回其运算结果5.3.4条件表达式xif条件elsey30m,n=eval(input())#输入用逗号分隔的两个整数,输出其中较大的值ifm>n:#若m较大
max_number=m#最大值为melse:#否则
max_number=n#最大值为nprint(max_number)#输出最大的那个值用户输入的两个数中的较大者命名为max_number并输出。5.3.4条件表达式m,n=eval(input())#输入用逗号分隔的两个整数print(mifm>nelsen)#用条件表达式获得较大的值输出二分支程序实现:条件表达式语句实现:31score=int(input())#输入一个整数成绩result='成绩合格'ifscore>=60else'成绩不合格'#根据条件判定是否合格print(result)#输出成绩是否合格的结果输入一个整数成绩,用条件表达式实现成绩大于等于60时,输出成绩合格,否则输出成绩不合格:5.3.4条件表达式325.3.4条件表达式username=input()#输入表示用户名的字符串result="用户名正确"ifusername=='admin'else"用户名错误"print(result)实现验证用户名,当用户名为“admin”时输出“用户名正确”,否则输出“用户名错误”:5.4循环结构34循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。5.4循环结构35while循环语句一般用于循环次数不确定的情况下,通过判断是否满足某个指定的条件来决定是否进行下一次循环,也称为条件循环语句。while循环的语法如下:判断条件为布尔型。判断条件为True时,执行while下面缩进的语句块,然后再次检查判断条件的值,重复以上操作,直到判断条件为False结束循环。循环体中有语句使循环判断条件的结果发生变化。5.4.1while循环while判断条件:
语句块(使判断条件表达式的值趋向于False)36while循环的语法如下:5.4.1while循环while判断条件:
语句块(使判断条件表达式的值趋向于False)判断条件为布尔型先检查判断条件若为True则执行语句块,然后再次检查判断条件若为False结束循环实例说明:马斯是澳大利亚的一个农场主,喜欢背着自己的猎枪在农场里寻觅猎物。为了满足自己的爱好,1859年他回欧洲探亲的时候,购买了生存能力强的24只欧洲野兔,并将它们放生至农场各处,任其自由发展。澳大利亚的气候四季分明,草质鲜嫩肥美,没有野兔的天敌,加之野兔的繁殖能力很强,最终导致野兔泛滥成灾,极大的破坏了澳大利亚的生态环境。兔子的繁殖能力很强,计算兔子数量可以用这样一个模型:一对大兔子每月能生一对小兔子,且每对新生的小兔子经过一个月可以长成一对大兔子,具备繁殖能力,如果不发生死亡,且每次均生下一雌一雄,假如兔子都不死,那么估算一下四年后这一对兔子会繁殖成多少对。5.4.1while循环37实例5.4澳大利亚野兔泛滥问题实例5.4澳大利亚野兔泛滥问题381月2月3月4月5月生产成长成熟成长成长成熟生产生产生产数列:1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,……斐波那契数列,黄金分割数列F(1)=1F(2)=1F(n)=F(n-1)+F(n-2)(n≥3,n∈N*)39deffibonacci(n):
"""用递归方法实现斐波那契数列"""
ifn<=1:#递归出口,前两项都是1
returnn#返回第n项的值
else:
returnfibonacci(n-1)+fibonacci(n-2)#后两项之和作为下一项n=int(input())
#输入一个正整数n,例如输入24foriinrange(1,n+1):#遍历1到n的整数
print(fibonacci(i),end='')#输出前n项的斐波那契数列#输出:11235813213455891442333776109871597258441816765109461771128657实例代码:实例5.4澳大利亚野兔泛滥问题参数,指定计算斐波那契数列的第n项递归调用fibonacci()函数计算第n-1项和第n-2项的和如果n小于等于1,则返回n使用for循环输出斐波那契数列的前n项40斐波那契数列递归算法的时间复杂度每个递归调用产生两个新的递归调用,递归树的节点数呈指数级增加需要消耗大量的栈空间时间复杂度为O(2n)效率低下实例5.4澳大利亚野兔泛滥问题41递推方法实现实例5.4澳大利亚野兔泛滥问题11235813aba+baba+baba+baba+baba+b同步赋值a,b=b,a+b实例5.4澳大利亚野兔泛滥问题42算法描述:(1)初始化变量a和b,都设置为1,分别代表第1个月和第2个月的兔子数(2)初始化变量month,设置为2,代表当前的月份,前两个月的兔子数量已给出(3)进入一个while循环,进入循环的条件是月份month小于48a.在循环中更新兔子的数量。将b的值赋值给a,将a和b的和赋值给bb.然后,将月份加1,下个循环计算下个月兔子数量(4)最后,打印出48个月后的兔子数量。43a,b=1,1#初始两个月的数量值month=2#初始月份数,已经给出了前两个月兔子数量whilemonth<48:#设定终止条件,当月份数量小于48时进入循环
a,b=b,a+b#将b和a+b值分别赋值给变量名a和b
month=month+1#月份数加1print(f'第{month}个月时兔子数量为{b}')#第48个月时兔子数量为4807526976实例代码:实例5.4澳大利亚野兔泛滥问题44斐波那契数列递推算法的时间复杂度每次循环都会计算下一个斐波那契数列的项时间复杂度是O(n)时间复杂度是线性的,与斐波那契数列的项数成正比实例5.4澳大利亚野兔泛滥问题实例说明:历史上有许多计算圆周率的公式,其中,格雷戈里和莱布尼茨发现了下面的公式:这个公式累加1项时圆周率值是4.00,累加2项值是2.67,累加3项是3.47...,随项数增长结果趋近于圆周率值。编程对其各项进行累加,直到最后一项的绝对值小于10-6为止,输出此时的圆周率值。5.4.1while循环45实例5.5Leibniz公式计算圆周率实例5.5Leibniz公式计算圆周率46思路:循环次数未知,终止条件已知,while循环条件值为True时进入循环,在循环里使判断条件值发生改变,条件值为False时,不再进入循环按公式的通项编写程序,用题目要求的终止条件构建循环条件语句,循环中每次累加上新产生的最后一项用负1的幂运算获得正负号循环体中逐渐增大项的序号i,使循环条件表达式的值不断变小,使之在有限次循环后变成小于10-6的数,终止循环。实例5.5Leibniz公式计算圆周率47算法描述:(1)初始化两个变量pi和i,pi设置为0,i设置为1。pi用于存储π的计算结果,i用于表示当前计算的项的序号(2)进入一个while循环,进入循环的条件是当前项大于或等于1e-6a.在循环中,首先计算当前项的值,然后将其加到pi上。当前项的值为(-1)的(i-1)次方除以(2*i-1)b.将i加1,以便计算下一项(3)最后,将pi乘以4,得到π的计算值,并打印出来48pi,i=0,1#设定pi初值0,i为累加项序号while1/(2*i-1)>=1e-6:#条件表达式值为True时进入循环
pi=pi+(-1)**(i-1)/(2*i-1)#累加,每次循环加上最后一项
i=i+1#计算下一项序号,此语句也会使abs(1/(2*i-1))逐渐值变小print(pi*4)#乘4得以π的计算值,放循环外只输出一次,3.141590653589692实例代码:实例5.5Leibniz公式计算圆周率49pi,i=0,1#设定pi初值0,i为分母变量名sign=1#sign用于改变符号while1/i>=1e-6:#条件表达式值为True时进入循环
pi=pi+sign*1/i#累加,每次循环加上最后一项
sign=-sign#每循环一次改变一次符号,实现正负项交替
i=i+2#下一项分母比当前项大2,此语句也会使1/i值变小print(pi*4)#乘4得以π的计算值,放循环外只输出一次,3.141590653589692代码优化:实例5.5Leibniz公式计算圆周率实例说明:现有方程:f(x)=x5−15x4+85x3−225x2+274x−121,已知f(x)在[1.5,2.4]区间单调下降,且在该区间f(x)=0有且只有一个根,用二分法求解该根。对于区间[a,b]上单调连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。二分法示意图如图所示。5.4.1while循环50实例5.6二分法求函数的零点实例5.6二分法求函数的零点51算法描述:(1)确定区间[a,b],验证f(a)·f(b)<0,确定在给定区间函数曲线与x轴有交点再用二分法(2)循环求区间(a,b)的中点c,然后计算函数在c处的值f(c)a.判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),终止循环b.若f(c)<0,则令b=c,丢弃区间的右半部分c.若f(c)>0,则令a=c,丢弃区间的左半部分(3)输出计算结果52deff(x):
"""计算并返回函数值"""
returnx**5-15*x**4+85*x**3-225*x**2+274*x-121#计算函数值defbinary_search(low,high):
"""二分法函数,low和high为起点和终点的初值,返回函数值为0的近似解"""
whileTrue:#构建无限循环,重复下面的语句
x=(low+high)/2#二分法,确定中间值
ifabs(f(x))<10**(-6):#若函数值小于指定精度,近似认为函数值为0
returnx#返回此时x值,同时结束循环
eliff(x)<0:#否则若函数值小于0
high=x#取当前x值为新的high值,丢弃右边一半
else:#否则若函数值大于0
low=x#取当前x值为新的low,丢弃左边一半low,high=1.5,2.4#起点和终点的初值iff(low)*f(high)<0:#确认两点函数值在x轴两侧时用二分法
print(binary_search(low,high))#输出此时x值1.8490159034729006else:
print("在给定区间内函数曲线与x轴无交点")实例代码实例5.6二分法求函数的零点53时间复杂度二分法每次循环都可以使搜索空间缩小一半,可以快速的定位到查找目标时间复杂度为O(log(n))高效实例5.6二分法求函数的零点54for循环也被称为遍历循环,一般用于循环次数可确定的情况下。依据可迭代对象中的子项,按他们的顺序进行迭代。while循环的语法如下:5.4.2for循环for循环变量in可迭代对象:
语句块55可迭代对象可迭代对象,可以视做一个容器,里面存放了有限个元素,并且每个元素都可以按某种顺序逐个访问。range、字符串、列表、集合、字典和文件对象等。从可迭代对象中逐一提取元素,赋值给循环变量,每提取一个元素执行一次语句块中的所有语句。总的执行次数由可迭代对象中元素(项)的个数确定。5.4.2for循环实例说明:编写程序,用户输入一个字符串,以回车结束,统计字符串里小写字母、数字字符和其他字符的个数(回车符代表结束,不计入统计)。5.4.2for循环56思路:字符串是可遍历的,遍历字符串,依次取其中一个字符用分支语句判定当前字符属于字母、数字还是其他,分别计数实例5.7分类统计字符串中的字符57text=input()#输入一个字符串letter,digit,other=0,0,0#分别用来记录字母、数字、其他字符的个数#遍历字符串中的每个字符,分类统计不同类字符的个数forsintext:#遍历字符串中的每个字符,s为当前遍历到的字符
ifsin'abcdefghijklmnopqrstuvwxyz':#成员运算符,若s在字符串中则返回True
letter=letter+1#小写字母个数加1
elifsin'0123456789':#成员运算,若s在字符串中则返回True
digit=digit+1#数字个数加1
else:#其他字符都进入这个分支
other=other+1#其他字符个数加1#遍历结束,打印输出结果print(f'小写字母{letter}个,数字{digit}个,其他字符{other}个')实例代码:实例5.7分类统计字符串中的字符58range类型range类型表示不可变的数字序列,通常用于在for循环中控制循环次数。range(n)
0,1,2,3,4,…n-1range(5)
0,1,2,3,45.4.2for循环59range()函数range()函数生成一个可迭代的数字序列,可用于控制循环、生成等差数列求解数学问题,语法如下:5.4.2for循环range(stop)#0,1,2,3,4,…stop-1,初值为0,步长为1的等差数列
range(start,stop[,step])#start,start+step,start+2*step…,步长为step的等差数列range(1,6)1,2,3,4,
560range()函数应用:产生整数等差数列5.4.2for循环range(0,11,2)range(1,11,2)
range(0,26,5)range(0,51,10)#0246810#13579#0510152025,步长为5#01020304050,步长为1061range()函数应用:奇数数列求和5.4.2for循环n=int(input())
print(sum(range(1,2*n,2)))1,3,5,…2nn=101+3+5+7+9+…+19=10062range()函数特性(1)start、stop、step都必须是整数,否则抛出TypeError异常。当start值小于stop值时,返回的序列为空。5.4.2for循环print(range(5.5))print(range(1,10,2.5))print(range(98.5//10))print(list(range(10,1)))print(list(range(10,1,2)))#stop为浮点数5.5#步长step为浮点数#浮点数参与的整除结果为浮点数9.0#产生空列表[]#产生空列表[]63range()函数特性(2)如果start参数缺省,默认值为0;如果step参数缺省,默认值为1;当试图设置step为0时,会抛出ValueError异常。5.4.2for循环print(*range(5))print(*range(1,6))print(*range(1,6,0))64range()函数特性(3)当step是正整数时,产生的序列递增;当step为负整数时,生成的序列递减。5.4.2for循环print(*range(1,11,2))print(*range(10,0,-2))65range()函数特性(4)range()函数产生一个左闭右开的序列,如range(4)生成一个序列:0,1,2,3。5.4.2for循环print(*range(1,6))print(*range(6,1,-1))66range()函数特性(5)range()函数产生的是可迭代对象,不是生成器,也不是列表类型。5.4.2for循环print(range(5))67range()函数特性(6)要全部输出range()生成的序列,可以用print(list(range(n)))或print(tuple(range(n)))的方法,将生成的序列转成列表或元组的形式输出,也可以用print(*(range(n)))将其内容解包输出。5.4.2for循环print(*range(5))print(list(range(5)))print(tuple(range(5)))68range()函数特性(7)range对象是不可变数据类型,可用索引、切片等操作获取其中部分数据,但不可修改其中的数据。5.4.2for循环69range()函数优点range()函数在需要时通过计算生成序列中的每个值仅存储start、stop和step值,占用内存固定比列表和元组占用内存小5.4.2for循环foriinrange(1000000000):
ifi<5:
print(i,end='')#range(1,1000000000)对象#
只产生01234这5个数字70range()函数应用:for循环中控制循环次数语法如下:5.4.2for循环foriinrange(5):
print(i,end='')#i:0,1,2,3,4,重复5次for<variable>inrange([start,]stop[,step]):
<语句块>#输出后不换行循环变量,初始值start,每次循环加步长step实例说明:输入一个正整数n,计算小于n的每个自然数的倒数的和。5.4.2for循环71思路:设置一个初值为0的累加器对象,再依次将后续的每一项加到这个对象上。用range(1,n)产生小于n的自然数,再依次将其倒数加到累加器上。实例5.8分数求和72n=int(input())#输入一个正整数nresult=0#初始化结果为0foriinrange(1,n):#遍历1到n-1,i依次取1,2,3,...,n-1
result=result+1/i#每次循环将当前i的倒数累加到结果中print(f'{result:.3f}')#输出结果,保留三位小数实例代码:实例5.8分数求和可以产生任意整数等差数列初始化值设为1换成*i计算累乘或阶乘实例说明:计算1000以内能被5整除的数的和。5.4.2for循环73实例5.9等差数列求和74result=0#初始化变量为0foriinrange(0,1000,5):#遍历0到999,i依次取5的倍数
result=result+i#每次循环将当前i累加到上次循环处理结果上print(result)#输出计算结果99500#用sum函数上述代码功能可以用一条语句实现print(sum(range(0,1000,5)))#用sum函数求整数数列的和99500实例代码:实例5.9等差数列求和实例说明:一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1,自然数n的阶乘写作n!。5.4.2for循环75实例5.10计算阶乘76n=int(input())#将输入的字符转成整型,例如输入6fact=1#设阶乘初值为1,n为0时不进入循环,0的阶乘为1foriinrange(1,n+1):#遍历1,2,...n的数列,注意要从1开始
fact=fact*i#将当前项乘到上次循环计算结果上print(fact)#输出累乘总和,720实例代码:实例5.10计算阶乘math库函数factorial(n)importmath
print(math.factorial(6))#factorial()为计算阶乘的函数,720实例说明:这是一个关于数学指数增长的著名的数学题。有两种选择:第一种选择是给你年薪100万;第二种选择是第一天给你1分钱,第二天给2分,第三天给4分,第四天给8分,……按此方法给一个月(30天)作为你的年薪。测试的结果是:绝大多数人选择了第一种,选择100万。5.4.2for循环77实例5.11计算薪酬78total=0#收入初值foriinrange(30):#迭代获取整数序列中的值,计算每天的收入
t=2**i#当前天的收入是2的i次幂
total=total+t#累加每天的收入,可省略语句3,t替换为2**iprint(f'需支付{total//100}元工资')#输出支付10737418元工资,整除100的作用是将单位转为元实例代码:实例5.11计算薪酬79n=int(input("请输入计算次数:"))#输入计算次数,例如5000000
pi=0#初值为0foriinrange(n):#循环n次
pi=pi+(-1)**i/(2*i+1)#计算pi/4的值pi=pi*4#乘以4得到圆周率值print(f"圆周率的值为:{pi:.10f}")#输出圆周率的值,保留10位小数#计算500万项时,圆周率的值为:3.1415924536Leibniz公式计算圆周率需要计算多少项?5.4.2for循环输入不同整数,查看精度输入500万次,获得3.1415924536的精度实例说明:拉马努金曾经提出过很多收敛速度极快的求π的公式,下面是其中一个:∑英文译音Sigma,表示数学中的求和号,主要用于求多项数之和公式展开可以表示为k从0到n时各项的累加,可以用循环实现公式收敛速度极快,循环2次时,就可以达到math.pi相同的精度5.4.2for循环80实例5.12拉马努金法计算圆周率81importmathdefpi(n):
"""定义计算圆周率的函数,返回圆周率的值"""
s=0
forkinrange(n):#计算前n项的加和
s=s+math.factorial(4*k)*(1103+26390*k)/(math.factorial(k)**4*396**(4*k))
return1/(c*s)#圆周率的值为级数展开式中的值的倒数#计算圆周率的值c=2*math.sqrt(2)/9801#定义级数展开式中的常数print(pi(1))#循环1次时pi值:3.1415927300133055print(pi(2))#循环2次时pi值:3.1415926535897936print(math.pi)#math库中pi值:3.141592653589793实例代码:实例5.12拉马努金法计算圆周率实例说明:计算曲线与x轴之间包围的有向面积将阴影部分切割为高度相等的梯形循环与累加所有梯形的面积的总和x轴下方部分计算绝对值5.4.2for循环82图5.10积分示意图实例5.13几何法计算积分83deff(x):
returnabs(-x**2-2*x+3)#返回函数值的绝对值作为梯形的高dx=2/100#定义每个小区间的宽度total_area=0#定义总面积初值为0#计算每个小区间内的梯形面积,并将所有梯形面积加起来foriinrange(100):
x=i*dx#当前梯形的一个底边长#计算梯形面积,个别梯形可能会退化为三角形,但不影响结果
trapezoid_area=(f(x)+f(x+dx))*dx/2#计算当前梯形面积
total_area=total_area+trapezoid_area#面积累加print(total_area)#输出定积分的近似4.000000000000001实例代码:实例5.13几何法计算积分84循环体中又出现循环语句,就构成多重循环结构。while和for可混用二重循环和三重循环最常用最内层程序语句执行的次数是各层循环次数的乘积5.4.3多重循环实例说明:日常用的皮箱的经常是三位的密码锁,当忘记密码时,可以采用逐位猜测的方法试出来密码,我们知道,3个数字的全部组合只有1000个,所以我们试1000次一定可以找到密码。5.4.3多重循环8500实例5.14破解密码实例说明:日常用的皮箱的经常是三位的密码锁,当忘记密码时,可以采用逐位猜测的方法试出来密码,我们知道,3个数字的全部组合只有1000个,所以我们试1000次一定可以找到密码。5.4.3多重循环8600实例5.14破解密码实例说明:日常用的皮箱的经常是三位的密码锁,当忘记密码时,可以采用逐位猜测的方法试出来密码,我们知道,3个数字的全部组合只有1000个,所以我们试1000次一定可以找到密码。5.4.3多重循环8701实例5.14破解密码实例说明:日常用的皮箱的经常是三位的密码锁,当忘记密码时,可以采用逐位猜测的方法试出来密码,我们知道,3个数字的全部组合只有1000个,所以我们试1000次一定可以找到密码。5.4.3多重循环8801实例5.14破解密码实例说明:日常用的皮箱的经常是三位的密码锁,当忘记密码时,可以采用逐位猜测的方法试出来密码,我们知道,3个数字的全部组合只有1000个,所以我们试1000次一定可以找到密码。5.4.3多重循环8902实例5.14破解密码实例说明:日常用的皮箱的经常是三位的密码锁,当忘记密码时,可以采用逐位猜测的方法试出来密码,我们知道,3个数字的全部组合只有1000个,所以我们试1000次一定可以找到密码。5.4.3多重循环9002实例5.14破解密码000,001,002,…,009010,011,012,…,019...990,991,992,…,999一个一个试,找到为止。实例5.14破解密码91算法描述:1.第1位数遍历从0到9的数字
2.第2位数遍历从0到9的数字
3.第3位数遍历从0到9的数字
4.比较当前的三位数是否与密码相同,若相同
5.输出当前三位数92keys=651#假设密码是651foriinrange(10):#猜测百位上的数字
forjinrange(10):#猜测十位上的数字
forkinrange(10):#猜测个位上的数字#三个数字拼接为一个三位整数,若此三位数与随机产生的相同,则找到密码
ifi*100+j*10+k==keys:#或str(i)+str(i)+str(i)=keys:
print(f'密码是{i}{j}{k}')#密码是651实例代码:实例5.14破解密码93枚举算法也叫穷举算法。所有可能的答案一一列举根据条件判断此答案是否合适使用条件语句保留合适的,舍弃不合适的思维量较小,实现的难度低,问题规模比较大时,效率不高,容易出现超时5.4.3多重循环94枚举算法(穷举算法)基本思路(1)确定枚举对象、范围和判定条件。(2)逐一枚举可能的值并验证每个值是否是问题的解。算法步骤(1)确定解题的可能范围,不能遗漏任何一个真正解,同时避免重复。(2)判定是否是真正解的方法。(3)为了提高解决问题的效率,使可能解的范围将至最小。5.4.3多重循环实例说明:我国古代数学家张丘建在《算经》一书中提出的“百钱买百鸡”的数学问题,题目意思是1只公鸡5文钱、1只母鸡3文钱、3只小鸡1文钱。计算并输出有几组可能的解?5.4.3多重循环95思路:0<鸡的数量<100,鸡的总数和钱的总数都为100,小鸡数量是3的倍数。列举所有公鸡、母鸡、小鸡数量的可能组合,计算总钱数,总数量、总钱数都是100的满足条件。实例5.15百钱买百鸡96forcockinrange(1,100):#公鸡数量不为0且小于100
forheninrange(1,100):#母鸡数量不为0且小于100
forchickeninrange(3,100,3):#小鸡数量大于0小于100且是3的倍数#鸡的总数为100,钱的总数为100,小鸡数量是3的整数倍
ifcock+hen+chicken==100and5*cock+3*hen+chicken//3==100:
print(cock,hen,chicken)#遇到满足条件的数字组合就输出实例代码:实例5.15百钱买百鸡内层循环要执行多少次?100*100*33=33万次97剪枝:剪掉不可能出现的情况,避免计算机多余的运算当公鸡和母鸡数量x,y确定的情况下,小鸡的数量z可由100–x-y计算公鸡5文一只,最大数量不会超过19只,同理,母鸡不能超过32只实例5.15百钱买百鸡forcockinrange(1,20):#公鸡数量不超过20
forheninrange(1,33):#母鸡数量不超过33
chicken=100-cock-hen#小鸡数量可由公鸡和母鸡数量计算得到
ifchicken%3==0and5*cock+3*hen+chicken//3==100:
print(cock,hen,chicken)内层循环要执行多少次?19*32=60898cock,hen,chicken实例5.15百钱买百鸡解不定方程:x+y+z=1005x+3y+z/3=100公鸡是4的倍数母鸡是7的递减率小鸡是3的递增率y=25-(7/4)xz=75+(3/4)x消去z可得:7x+4y=100
0<y<100,且是自然数x必为4的整数倍x最大值必小于16x值只能取4、8、1299forcockinrange(4,16,4):#cock初值为4,小于16,步长为4
hen=25-cock//4*7#整除“//”符号保证运算结果仍为整数
chicken=75+cock//4*3
print(cock,hen,chicken)优化代码:实例5.15百钱买百鸡尽可能减少循环嵌套的层数需多重循环求解时,可以将内层循环的功能定义成函数,将二重循环转换为两个一重循环,使代码逻辑更清晰5.5流程跳转语句101Python提供了continue和break关键字。控制循环结构置于循环结构中的分支语句块中,根据条件改变循环5.5流程跳转语句102作用是在循环次数未达到设定次数或未达到循环终止条件时跳出循环,提前结束语句所在层次的循环。用于while或for循环语句一般置于条件判定语句块,当满足某条件时触发该语句的执行5.5.1break语句103跳出无限循环5.5.1break语句whileTrue:
if判断条件:
break
语句块(使判断条件表达式的值趋向于False)无限循环满足条件时,break终止循环避免程序陷入无限循环104while循环实现:实例5.5Leibniz公式计算圆周率5.5.1break语句累加,直到最后一项的绝对值小于10-6为止。思路:While
True,构造无限循环循环体中,判断循环控制条件1/i<1e-6为False时,break结束循环循环体中,i的值逐渐变大,1/i逐渐变小,循环可以在有限次数内结束105while循环实现:实例5.5Leibniz公式计算圆周率5.5.1break语句pi,i=0,1#设定pi初值0,i为分母变量名sign=1#sign用于改变符号whileTrue:#构建无限循
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年湖南省沅江市高一化学上册期末考试模拟卷及参考答案【巩固】
- 2026年山西省原平市高一化学上册期末考试测试卷【综合卷】附答案
- 2026年江苏省新沂市高三物理下册期末考试模拟测试卷含答案
- 2025年湖北省石首市高三历史上册期末考试模拟卷附答案【研优卷】
- 2026年湖北省利川市高三生物下册期末考试模拟卷及参考答案
- 2026年辽宁省北票市高三物理下册期末考试模拟卷带答案
- 2026年福建省漳平市高三生物上册期末考试测试卷含答案
- 2026年河北省泊头市高一历史上册期末考试自测卷及参考答案1套
- 2027年教师资格证考试学前教育学真题卷
- 2026年成都益民投资集团有限公司人员招聘笔试参考题库及详细答案解析
- 2026新教材语文 六年级上册语文园地三 课件
- 2026年湖南省高考真题历史试题试卷答案解析
- 2026年精神卫生日宣传课件
- 室外消防给水管道敷设施工方案
- 2026秋新教材人教版四年级上册数学|第三单元 多位数乘两位数 教案(共13课时)
- 2026年法律硕士(法学)考研真题及完整答案解析(统考回忆版)
- 组织培养与植物离体种质资源保存
- 2026年银行团队主管竞聘面试题库
- 自来水水厂检验工作制度
- 边坡注浆施工方案
- 揭秘助剂在氨纶混纺织物防沾色中的关键作用及与染料的协同机制
评论
0/150
提交评论