1、Python语言程序设计3第三周 分支与循环 3.1 程序基本结构1. 程序流程图 用规定的一系列图形、流程线和文字说明算法中的基本操作和控制流程。 流程图的基本元素包括:(1)表示相应操作的框(2)带箭头的流程线(3)框内外必要的文字说明 2. 设计程序框图的步骤: (1)用自然语言表述算法步骤 (2)确定步骤逻辑结构,用相应框图表示 (3)流程线连接框图,加上终端框,得到整个算法的程序框图3. 任何算法都可以由顺序、选择、循环三种基本结构组合实现:(1)顺序结构:按逻辑顺序自上而下依次运行的结构,如:温度转换程序;(2)选择结构(分支结构):在算法中通过对条件的判断,根据条件是否成立而选择
2、不同流向的算法结构;(3)循环结构:指在一定条件下反复执行某部分代码的操作;3.2 简单分支例:PM2.5指数分级程序功能IPO模式描述: 输入:接受外部输入PM2.5值 处理:空气质量分级算法 输出:打印空气质量提醒 PM2.5指数分级伪代码 If PM2.5值 75 打印空气污染警告 If PM2.5值75:8. print(Unhealthy.Becareful!)9. ifPM35:10. print(Good.Gorunning!)11. main()【运行结果】输出:输入:What is todaysPM2.5? 90Unhealthy. Becareful!(1)If语句格式:I
3、f :【注】是条件表达式,是一个或多个语句序列先判断条件,若true,则执行,再转向下一条语句;若false,则直接跳过,转向下一条语句(2)简单条件构造 简单条件基本形式 是关系操作符, =, , != 使用“=”表示赋值语句,使用“=”表示等于 除数字外,字符或字符串也可以按照字典顺序用于条件比较 是布尔表达式,为bool类型布尔值的真假以True和False表示 (3)二分支语法结构If : else: 程序6:pythonview plaincopy1. #quadratic.py2. #计算二次方程的实数根程序3. importmath4. defmain():5. print(Th
4、isprogramfindstherealsolutionstoaquadraticn)6. a,b,c=eval(input(Pleaseenterthecoefficients(a,b,c):)7. delta=b*b-4*a*c8. ifdelta=0:9. discRoot=math.sqrt(delta)10. root1=(-b+discRoot)/(2*a)11. root2=(-b-discRoot)/(2*a)12. print(nThesolutionsare:,root1,root2)13. else:14. print(Theequationhasnorealroots
5、!)15. main()【运行结果】输出:This program finds the real solutions to a quadratic 输入:Please enter the coefficients(a,b,c): 1,2,3The equation has no real roots!3.3 多分支(1)多分支决策要解决双根问题,就需要对delta等于0的情况进行处理。语句的结构上要引入嵌套结构: 当delta 0,处理双根情况一种方案是在程序中使用两个if-else语句。把一个复合语句放到另一个语句的结构之中称为嵌套。1. 多分支决策是解决复杂问题的重要手段之一2. 一个三分
6、之决策可以由两个二分支结构嵌套实现3. 使用if-else描述多分支决策时,实现更多分支需要更多嵌套,影响程序易读性Python使用if-elif-else描述多分支决策,简化分支结构的嵌套问题。格式如下:If : elif: elif: else: 例:程序7:pythonview plaincopy1. #quadratic.py2. importmath3. defmain():4. print(Thisprogramfindstherealsolutionstoaquadraticn)5. a,b,c=eval(input(Pleaseenterthecoefficients(a,b,
7、c):)6. delta=b*b-4*a*c7. ifa=0:8. x=-b/c9. print(nThereisansolution,x)10. elifdelta0:11. print(nTheequationhasnorealroots!)12. elifdalta=0:13. x=-b/(2*a)14. print(nTheereisadoublerootat,x)15. else:16. discRoot=math.sqrt(delta)17. root1=(-b+discRoot)/(2*a)18. root2=(-b-discRoot)/(2*a)19. print(nTheso
8、lutionsare:,root1,root2)20. main()3.4 异常处理 异常处理语句python使用tryexcept,可使程序不因运行错误而崩溃Python的异常处理语句还可以使用else和finally关键字(可选项,若使用则else必须在finally之前)格式如下:try: except: except: except: else: finally: tryexcept可以捕捉任何类型的错误对于二次方程,还会有其他可能的错误如:输入非数值类型(NameError)输入无效的表达式(SyntaxError)等 此时可以用一个try语句配多个except来实现程序8:pyth
9、onview plaincopy1. #异常处理测试2. defmain():3. try:4. number1,number2=eval(input(Entertwonumbers,5. separatedbyacomma:)6. result=number1/number27. exceptZeroDivisionError:8. print(Divisionbyzero!)9. exceptSyntaxError:10. print(Acommamaybemissingintheinput)11. else:12. print(Noexceptions,theresultis,resul
10、t)13. finally:14. print(executingthefinalclause)15. main()【运行结果】输出: 输入:Enter two numbers, separated by a comma: 1 2A comma may be missing in the inputexecuting the final clauseEnter two numbers, separated by a comma: 3,2No exceptions, the result is 1.5executing the final clauseEnter two numbers, sep
11、arated by a comma: 3,0Division by zero!executing the final clause 【实例】三者最大值 【IPO】输入:三个数值处理:三者最大算法输出:打印最大值 【算法比较】 通盘比较 将每一个值与其他所有值比较以确定最大值三个值的情况比较简单,如果是五值比较复杂,而且效率低(因为表达式没有被充分利用) 决策树 避免冗余比较结构更加复杂! 顺序处理 逐个扫描每个值,保留最大者【程序】程序9:# program: maxn.py# 寻找一组数中的最大值def main(): n = eval(input(How many numbers are
12、there?) # 将第一个值赋值给max max = eval(input(Enter a number ) # 连续与后面n-1值进行比较 for i in range(n-1): x = eval(input(Enter a number ) if x max: max = x print(The largest value is, max)main() 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12 13【运行结果】How many numbers are there? 5Enter a number 9Enter a
13、number 6Enter a number 3Enter a number 10Enter a number 20The largest value is 20 使用Python内置函数max()3.5 基本循环结构(1)for循环Python可以使用for语句循环遍历整个序列的值,格式如下:for in : 1 2 1 2在for循环中,循环变量var遍历了队列中的每一个值,循环变量var遍历了队列中的每一个值,循环语句体为每个值执行一次例:for循环求平均数 IPO:输入:待输入数字个数,数字处理:平均数算法输出:平均数通用设计方案:o 输入数字的个数no 将sum初始化为0o 循环n次
14、: 输入数字x 将x加入sum中o 将sum/n作为平均数输出出来 程序10:#average1.pyn = eval(input(How many numbers?)sum = 0.0for i in range(n): x = eval(input(Enter a number ) sum = sum + xprint(nThe average is, sum/n) 1 2 3 4 5 6 7 1 2 3 4 5 6 7【运行结果】How many numbers? 3Enter a number 5Enter a number 7Enter a number 6The average i
15、s 6.0for循环的缺点:程序开始时必须提供输入数字总数,以提供固定循环次数大规模数字则需要用户数清楚个数为此,python提供了另一种循环模式即无限循环,不需要提前知道循环次数(2)while循环语句格式:while 1 2 1 2条件总是在循环体执行之前被判断,这种结构又被称为前测循环(当型循环)如果循环体没有对i初始化或循环体没有累加,条件判断一直为真,循环体将一直执行,即为死循环程序,这时通常使用Ctrl+C来终止一个程序(3)break语句 退出循环例:程序11:#TestBreak.pysum = 0number = 0while number 100: breakprint(T
16、he number is, number)print(The sum is, sum) 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10【运行结果】The number is 14The sum is 105(4)continue 结束本次循环即跳出循环体中下面尚未执行的语句,对于while循环,继续求解循环条件;对于for循环,继续遍历循环列表continue语句和break语句的区别:continue语句只结束本次循环,而不终止整个循环的执行,而break语句则是直接结束整个循环流程,不再判断循环条件是否成立(5)循环语句中的else 不满足循环条件时执行
17、3.6 通用循环构造方法(1)交互式循环交互式循环是无限循环的一种,允许用户通过交互的方式重复程序特定部分(2)哨兵循环执行循环直到遇到特定的值,循环语句才终止执行设计方法: 设定一个哨兵值作为循环终止的标志 任何值都可以做哨兵,但要与实际数据有所区别(3)文件循环面向文件的方法是数据处理的典型应用,可以事先将数据录入到文件,便于编辑修改,python中采用readline()方法中的end of file循环模式(4)循环嵌套决策和循环互相嵌套可以实现复杂算法,假设数字以逗号分隔出现在文件的同一行上(3)(4)整合程序如图:3.7 死循环和循环嵌套(1)死循环 无法靠自身的控制中止的循环死循
18、环的使用:通过死循环可以一直检测捕捉特定异常(2)后测循环(直到型循环)先接受输入,再判断循环条件是否满足。在Python中没有后测循环语句,但可以通过while和break语句间接实现,如:(3)半路循环 循环判断条件在循环体的中部例:3.8 布尔表达式条件语句和循环语句都使用布尔表达式作为条件布尔值为真(True)或假(Flase)(1)布尔操作符:and,or,notand和or用于组合两个布尔表达式,并产生一个布尔结果 and or 1 2 1 2not运算符计算一个布尔表达式的反值not 1 1(2)布尔操作符的优先级:not and or例:壁球比赛计分: 假设scoreA和sco
19、reB代表两个壁球选手的分数o 规则1:只要一个选手达到了15分,本场比赛就结束 即: scoreA = 15 or scoreB = 15o 在程序中构造一种循环条件,对游戏结束条件取反,只要比赛还没有结束游戏就一直进行下去 即: while not( scoreA = 15 or scoreB = 15 ) # 比赛继续o 规则2:如果一方打了七分而另一方一分未得时,比赛也结束 即:scoreA = 15 or scoreB = 15 or (a = 7 and b = 0) or (b = 7 and a = 0)o 需要一个团队赢得至少两分才算赢,即其中一个队已经达到了15分,且分数差
20、异至少为2时比赛结束(排球) 即:(a = 15 or b = 15) and abs(a-b)=2(3)布尔代数: 布尔表达式遵循特定的代数定律,这些规律被称为布尔逻辑或布尔代数代数布尔代数a*0 = 0a and false = falsea*1 = aa and true = aa+0 = 0a or false = a 任何数据和true进行or操作都是真 and和or操作符都符合分配率 not操作符可负负抵消 德摩根定律:not放进表达式后,and和or发生变化如:not(a or b) = (not a) and (not b)not(a and b) = (not a) or (not b) 布尔代数的应用 用德摩根定律分析和简化表达式(4)布尔表达式作为决策 判断退出循环条件 对于数字(整数和浮点数)的零值被认为是false,任何非零值都是true bool类型是特殊的整数 布尔表达式具有短路求值的特性
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1