第三周分支与循环3.1 程序基本结构1. 程序流程图—用规定的一系列图形、流程线和文字说明算法中的基本操作和控制流程。
流程图的基本元素包括:(1)表示相应操作的框(2)带箭头的流程线(3)框内外必要的文字说明2. 设计程序框图的步骤:(1)用自然语言表述算法步骤(2)确定步骤逻辑结构,用相应框图表示(3)流程线连接框图,加上终端框,得到整个算法的程序框图3. 任何算法都可以由顺序、选择、循环三种基本结构组合实现:(1)顺序结构:按逻辑顺序自上而下依次运行的结构,如:温度转换程序;(2)选择结构(分支结构):在算法中通过对条件的判断,根据条件是否成立而选择不同流向的算法结构;(3)循环结构:指在一定条件下反复执行某部分代码的操作;3.2 简单分支例:PM2.5指数分级程序功能IPO模式描述:输入:接受外部输入PM2.5值处理:空气质量分级算法输出:打印空气质量提醒PM2.5指数分级伪代码If PM2.5值> 75打印空气污染警告If PM2.5值< 35打印空气质量优,建议户外运动流程图如图所示:程序5:[python]view plain copy1.#pm25.py2.#空气质量提醒3.4.def main():5. PM = eval(input("What is today'sPM2.5? "))6.# 打印相应提醒7.if PM > 75:8.print("Unhealthy. Becareful!")9.if PM < 35:10.print("Good. Go running!")11.main()【运行结果】输出:输入:What is today'sPM2.5? 90Unhealthy. Becareful!(1)If语句格式:If <condition>:<body>【注】<condition>是条件表达式,<body>是一个或多个语句序列先判断<condition>条件,若true,则执行<body>,再转向下一条语句;若false,则直接跳过<body>,转向下一条语句(2)简单条件构造①简单条件基本形式<expr><relop> <expr>②<relop>是关系操作符<, <=, ==, >=, >, !=③使用“=”表示赋值语句,使用“==”表示等于④除数字外,字符或字符串也可以按照字典顺序用于条件比较⑤<condition>是布尔表达式,为bool类型布尔值的真假以True和False表示(3)二分支语法结构If <condition>:<statements>else:<statements>程序6:[python]view plain copy1.# quadratic.py2.# 计算二次方程的实数根程序3.import math4.def main():5.print("Thisprogram finds the real solutions to a quadratic\n")6. a,b,c =eval(input("Please enter the coefficients(a,b,c): "))7. delta = b*b -4*a*c8.if delta >= 0:9. discRoot =math.sqrt(delta)10. root1 = (-b +discRoot) / (2*a)11. root2 = (-b -discRoot) / (2*a)12.print("\nThe solutions are:", root1, root2)13.else:14.print("Theequation has no real roots!")15.main()【运行结果】输出:This program finds the real solutions to a quadratic输入:Please enter the coefficients(a,b,c): 1,2,3 The equation has no real roots!3.3 多分支(1)多分支决策要解决双根问题,就需要对delta等于0的情况进行处理。
语句的结构上要引入嵌套结构:①当delta < 0,处理无实根情况②当delta = 0,处理实根情况③当delta > 0,处理双根情况一种方案是在程序中使用两个if-else语句。
把一个复合语句放到另一个语句的结构之中称为嵌套。
1. 多分支决策是解决复杂问题的重要手段之一2. 一个三分之决策可以由两个二分支结构嵌套实现3. 使用if-else描述多分支决策时,实现更多分支需要更多嵌套,影响程序易读性Python使用if-elif-else描述多分支决策,简化分支结构的嵌套问题。
格式如下:If <condition1>:<case1 statements>elif<condition2>:<case2 statements>elif<condition3>:<case3 statements>…else:<default statements>例:程序7:[python]view plain copy1.# quadratic.py2.import math3.def main():4.print("This program finds the realsolutions to a quadratic\n")5. a,b,c =eval(input("Please enter the coefficients(a,b,c): "))6. delta = b*b - 4*a*c7.if a == 0:8. x = -b/c9.print("\nThere is ansolution", x)10.elif delta < 0:11.print("\nThe equation has no real roots!")12.elif dalta == 0:13. x = -b/(2*a)14.print("\nTheere is a double rootat", x)15.else:16. discRoot = math.sqrt(delta)17. root1 = (-b +discRoot) / (2*a)18. root2 = (-b -discRoot) / (2*a)19.print("\nThesolutions are:", root1, root2)20.main()3.4 异常处理异常处理语句python使用try…except…,可使程序不因运行错误而崩溃Python的异常处理语句还可以使用else和finally关键字(可选项,若使用则else必须在finally之前)格式如下:try:<body>except<ErrorType1>:<handler1>except<ErrorType2>:<handler2>except:<handler0>else:<process_else>finally:<process_finally>try…except可以捕捉任何类型的错误对于二次方程,还会有其他可能的错误如:输入非数值类型(NameError)输入无效的表达式(SyntaxError)等此时可以用一个try语句配多个except来实现程序8:[python]view plain copy1.# 异常处理测试2.def main():3.try:4. number1,number2 = eval(input("Enter two numbers,5.separated by a comma:"))6. result = number1/number27. exceptZeroDivisionError:8.print("Division by zero!")9. exceptSyntaxError:10.print("Acomma may be missing in the input")11.else:12.print("Noexceptions, the result is", result)13.finally:14.print("executing the final clause")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, separated 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 there?")) # 将第一个值赋值给maxmax = eval(input("Enter a number >>"))# 连续与后面n-1值进行比较for i in range(n-1):x = eval(input("Enter a number >>"))if x > max:max = xprint("The largest value is", max)main()1234567891011121312345678910111213【运行结果】How many numbers are there? 5Enter a number >> 9Enter a number >> 6Enter a number >> 3Enter a number >> 10Enter a number >> 20The largest value is 20④使用Python内置函数max()3.5 基本循环结构(1)for循环Python可以使用for语句循环遍历整个序列的值,格式如下:for <var> in <sequence>:<body>1212在for循环中,循环变量var遍历了队列中的每一个值,循环变量var遍历了队列中的每一个值,循环语句体为每个值执行一次例:for循环求平均数IPO:输入:待输入数字个数,数字处理:平均数算法输出:平均数通用设计方案:o①输入数字的个数no②将sum初始化为0o③循环n次:输入数字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)12345671234567【运行结果】How many numbers? 3Enter a number >> 5Enter a number >> 7Enter a number >> 6The average is 6.0for循环的缺点:程序开始时必须提供输入数字总数,以提供固定循环次数大规模数字则需要用户数清楚个数为此,python提供了另一种循环模式即无限循环,不需要提前知道循环次数(2)while循环语句格式:while <condition><body>1212条件总是在循环体执行之前被判断,这种结构又被称为前测循环(当型循环)如果循环体没有对i初始化或循环体没有累加,条件判断一直为真,循环体将一直执行,即为死循环程序,这时通常使用Ctrl+C来终止一个程序(3)break语句——退出循环例:程序11:#TestBreak.pysum = 0number = 0while number < 20:number += 1sum += numberif sum > 100:breakprint("The number is", number)print("The sum is", sum)1234567891012345678910【运行结果】The number is 14The sum is 105(4)continue —结束本次循环即跳出循环体中下面尚未执行的语句,对于while循环,继续求解循环条件;对于for循环,继续遍历循环列表continue语句和break语句的区别:continue语句只结束本次循环,而不终止整个循环的执行,而break语句则是直接结束整个循环流程,不再判断循环条件是否成立(5)循环语句中的else —不满足循环条件时执行3.6 通用循环构造方法(1)交互式循环交互式循环是无限循环的一种,允许用户通过交互的方式重复程序特定部分(2)哨兵循环执行循环直到遇到特定的值,循环语句才终止执行设计方法:①设定一个哨兵值作为循环终止的标志②任何值都可以做哨兵,但要与实际数据有所区别(3)文件循环.面向文件的方法是数据处理的典型应用,可以事先将数据录入到文件,便于编辑修改,python中采用readline()方法中的end of file循环模式(4)循环嵌套决策和循环互相嵌套可以实现复杂算法,假设数字以逗号分隔出现在文件的同一行上(3)(4)整合程序如图:3.7 死循环和循环嵌套(1)死循环—无法靠自身的控制中止的循环死循环的使用:通过死循环可以一直检测捕捉特定异常(2)后测循环(直到型循环)先接受输入,再判断循环条件是否满足。