版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
判断结构第六章课程目标课程目标1利用Python的if语句来理解简单的判断编程模式及其实现3524利用Python的if-else语句来理解两路判断编程模式及其实现利用Python的if-elif-else语句来理解多路判断编程模式及其实现理解异常处理的思想,并能够编写简单异常处理代码,捕捉标准的Python运行时错误能够阅读、编写和实现使用判断结构的算法,包括使用系列判断和嵌套判断结构的算法PART1简单判断1简单判断指令序列计算机程序序列是编程的一个基本概念,但只用它不足以解决所有问题。常常有必要改变程序的顺序流程,以适应特定情况的需要,这是通过特殊语句完成的,称为“控制结构”。1简单判断判断结构这种结构主要是通过一些语句使得程序针对不同情况执行不同指令序列,实际上允许程序“选择”适当的动作过程。PART2示例:健康警报器2示例:健康警报器健康是我们大家都十分关注的问题,而体重的高低从某些方面反映了我们身体的健康状况。当体重超过个人标准体重时会发出超重警告;当体重低于个人标准体重时也会发出警告。程序2示例:健康警报器标准体重=(身高-100)*0.9标准体重=(身高-105)*0.92实际体重大于标准体重的10%为过重,大于标准体重得20%为肥胖。实际体重小于标准体重得10%为偏瘦,小于标准体重得20%为严偏消瘦。Brcoa改良公式2示例:健康警报器输入你的性别、身高和体重通过性别分别计算各自得标准体重通过对比输入得体重和对应得标准体重得到对比结果2示例:健康警报器defhealth():gender=input("输入你的性别(male,female):")height=float(input("输入你的身高(cm):"))weight=float(input("输入你的体重(kg):"))if(gender=="male"):w=(height-100)*0.92示例:健康警报器if(weight>=w*1.1andweight<=w*1.2):print("注意,你超重了!")if(weight>w*1.2):print("你需要减肥了!")if(weight<=w*0.9andweight>=w*0.8):print("注意,你偏瘦了!")if(weight<w*0.8):print("你已经严重消瘦!")else:print("你的体重很健康")2示例:健康警报器if(gender=="female"):w=(height-105)*0.92if(weight>=w*1.1andweight<=w*1.2):print("注意,你超重了!")if(weight>w*1.2):print("你需要减肥了!")if(weight<=w*0.9andweight>=w*0.8):print("注意,你偏瘦了!")if(weight<w*0.8):print("你已经严重消瘦!")else:print("你的体重很健康")health()2示例:健康警报器输入你的性别(male,female):male输入你的身高(cm):175输入你的体重(kg):60注意,你偏瘦了!2示例:健康警报器if<condition>:<body>2示例:健康警报器图6.1简单if语句控制流body是否执行取决于条件PART3形成简单条件3形成简单条件暂时,我们的程序将使用简单条件,它比较两个表达式的值:是“关系运算符”的缩写条件是如何得到的呢?<expr><relop><expr>3形成简单条件表6-1Python中的关系运算符PythonMathematicsMeaning<<小于<=≤小于等于===等于>=≥大于等于>>大于!=≠不等于Python中用“=”符号表示赋值语句,使用“==”符号表示相等。3形成简单条件条件可以比较数字或字符串。比较字符串时,排序是按“字典序”。根据底层的Unicode值以字母顺序放置字符串。所有大写拉丁字母都在小写字母之前。3形成简单条件>>>5<8True>>>5>8False>>>5!=8True>>>"hello"=="world"False>>>"hello"<"world"True条件实际上是一种表达式,即布尔表达式,它只有两种返回值,即true(条件成立)和false(条件不成立)。PART4两路判断4两路判断importmathdefmain():print("求解二次方程")print()a=float(input("输入系数a:"))b=float(input("输入系数b:"))c=float(input("输入系数c:"))discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print()print("方程的解为:",root1,root2)main()如果discRoot>=0为真,则discRoot<0肯定为假,反之亦然。4两路判断图6.2二次方程求解程序的两路判断4两路判断if<condition>:<statements>else:<statements>Python解释器遇到if-else这种结构时,它首先对条件求值。如果条件为真,则执行if下的语句;如果条件为假,则执行else下的语句。在任何情况下,控制随后都转到if-else之后的语句。4两路判断importmathdefmain():print("求解二次方程\n")a=float(input("输入系数a:"))b=float(input("输入系数b:"))c=float(input("输入系数c:"))discRoot=b*b-4*a*cifdiscRoot<0:print("\n该方程没有实数解!")else:discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print("\n方程解为:",root1,root2)main()4两路判断>>>main()求解二次方程输入系数a:3输入系数b:4输入系数c:5该方程没有实数解!>>>main()求解二次方程输入系数a:4输入系数b:10输入系数c:3方程解为:-0.3486121811340027-2.1513878188659974PART5多路判断5多路判断0周岁-6周岁童年7周岁-17周岁少年18周岁-40周岁青年41周岁-59周岁中年60周岁以上老年5多路判断if判断条件1:执行语句1……elif判断条件2:执行语句2……elif判断条件3:执行语句3……else:执行语句4……用于分隔任意数量的互斥代码块。5多路判断图6.3多路判断5多路判断defmain():year=int(input("输入你的年龄:"))if(0<=year<=6):print("你处在童年")elif(7<=year<=17):print("你处在少年")elif(18<=year<=40):print("你处在青年")elif(41<=year<=59):print("你处在中年")else:print("你处在老年")main()PART6异常处理第二课时6异常处理二次方程求解程序使用判断结构,避免了对负数取平方根和运行时产生错误。在许多程序中,这是一种常见的模式:我们在调用sqrt函数之前检查了数据。有时函数本身会检查可能的错误,并返回一个特殊的值来表示操作失败。例如,另一个平方根运算可能返回负数(如−1)来表示错误。使用判断来防止罕见但可能的错误6异常处理discRt=otherSqrt(b*b-4*a*c)ifdiscRt<0:print("Norealroots.")else:...6异常处理异常处理机制让程序员可以编写一些代码,捕获和处理程序运行时出现的错误。具有异常处理的程序不会显式地检查算法中的每个步骤是否成功,本质上它是说,“做这些步骤,如果任何问题出现,以这种方式处理它。”6异常处理importmathdefmain():print("求解二次方程\n")try:a=float(input("输入系数a:"))b=float(input("输入系数b:"))c=float(input("输入系数c:"))discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print("\n方程的解为:",root1,root2)exceptValueError:print("\n没有实数解")main()6异常处理try:<body>except<ErrorType>:<handler>try语句的一般结构:6异常处理当Python遇到try语句时,它尝试执行其中的语句。如果这些语句执行没有错误,控制随后转到try...except后的下一个语句。如果在其中某处发生错误,Python会查找具有匹配错误类型的except子句。如果找到合适的except,则执行处理程序代码。6异常处理Traceback(mostrecentcalllast):
File"C:\DocumentsandSettings\Terry\MyDocuments\Teaching\W04\CS120\Textbook\code\chapter3\quadratic.py",line21,in-toplevel-
main()
File"C:\DocumentsandSettings\Terry\MyDocuments\Teaching\W04\CS120\Textbook\code\chapter3\quadratic.py",line14,inmain
discRoot=math.sqrt(b*b-4*a*c)
ValueError:mathdomainerror原来没有异常处理的程序产生以下错误:6异常处理Entercoefficienta:1Entercoefficientb:1Entercoefficientc:1Norealroots6异常处理证没有崩溃,异常处理程序捕获错误,并打印一条消息,那么就说明方程没有实数根。新程序还捕获到用户输入无效值导致的错误。一个try语句可以有多个except子句。6异常处理#quadratic6.pyimportmathdefmain():print("Thisprogramfindstherealsolutionstoaquadratic\n")try:a=float(input("Entercoefficienta:"))b=float(input("Entercoefficientb:"))c=float(input("Entercoefficientc:"))discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)print("\nThesolutionsare:",root1,root2)6异常处理exceptValueErrorasexcObj:ifstr(excObj)=="mathdomainerror":print("NoRealRoots")else:print("Invalidcoefficientgiven.")except:print("\nSomethingwentwrong,sorry!")行为就像一个else6异常处理异常实际上是一种对象。如果在except子句中,在错误类型后跟上as<variable>,Python会将该变量赋值为实际的异常对象。PART7设计研究:三者最大7设计研究:三者最大假设我们需要一个算法,找出三个数中最大的一个。我该如何确定用户的三个输入中哪一个最大呢?7设计研究:三者最大defmain():x1,x2,x3=eval(input("Pleaseenterthreevalues:"))#中间代码省略print("Thelargestvalueis",maxval)PART8策略1:比较每个值和所有其他值8策略1:比较每个值和所有其他值一眼看上去,这像是一个三路判断,我们需要执行以下任务之一:maxval=x1maxval=x2maxval=x38策略1:比较每个值和所有其他值if(x1>=x2>=x3):maxval=x1当x1最大时,此时判断条件应该为x1比x2和x3都大。8策略1:比较每个值和所有其他值问题一:当条件为真时,是否绝对确定判断后执行语句是正确的操作?问题二:是否确定当x1最大时,在所有情况下这个条件都是真的?我们的结论不符合这个测试。假设值是5、2和4。显然,x1是最大的,但条件返回false,因为关系5≥2≥4不成立。在这种情况下,条件清楚地表明x1至少与x2和x3一样大,因此将其值赋给maxval应该是正确的。8策略1:比较每个值和所有其他值if(x1>=x2andx1>=x3):maxval=x1我们要确保x1是最大的,但我们不关心x2和x3的相对顺序。我们真正需要的是两个单独的测试,以确定x1>=x2且x1>=x3。8策略1:比较每个值和所有其他值if(x1>=x2andx1>=x3):maxval=x1elif(x2>=x1andx2>=x3):maxval=x2else:maxval=x38策略1:比较每个值和所有其他值试图找到五个值中最大的,就需要四个布尔表达式,每个由四个条件组成。复杂的表达式是由于每个判断都是独立的,在后续测试中忽略了来自前面测试的信息。假设第一个判断发现x1大于x2,但不大于x3。此时,我们知道x3肯定是最大值。不幸的是,我们的代码忽略了这一点,Python会继续对下一个表达式求值,发现它是false,最后执行else。PART9策略2:判断树9策略2:判断树假设我们从一个简单的测试x1>=x2开始。如果条件为真,我们只需要看看x1和x3哪个更大。要避免先前算法的冗余测试使用“判断树”的方法9策略2:判断树ifx1>=x2:ifx1>=x3:maxval=x1else:maxval=x3else:ifx2>=x3:maxval=x2else:maxval=x39策略2:判断树图6.4三者最大问题的判断树方法的流程图9策略2:判断树无论三个值的顺序如何,该算法都将进行两次比较,并将正确的值分配给maxval。这种方法的结构比第一种更复杂,如果我们用三个以上的值来尝试这个设计,会遭受类似的复杂性爆炸。PART10策略3:顺序处理10策略3:顺序处理当要从很多数据中找到最大值时,大多数人会制定一个简单的策略。这个策略让我们按顺序浏览列表,记录到目前为止最大的数字。扫描数字,直到找到一个大的,用手指指向它继续扫描,如果找到一个大于指向的数字,手指移动到新的数字到达列表的末尾时,手指将指向最大值10策略3:顺序处理maxval大,则不动maxval小,则将其替换为maxval值给maxval一个初始值用后面的树与maxval相比10策略3:顺序处理maxval=x1ifx2>maxval:maxval=x2ifx3>maxval:maxval=x3寻找3个数的最大值:10策略3:顺序处理如果将数据量扩展到几百几千呢?循环语句编写程序:允许用户将我们的算法折叠成一个循环,找到n个数字中最大的。不必使用x1、x2、x3等单独的变量,我们可以每次取得一个值,并不断重复使用单个变量x。每次比较最新的x和maxval的当前值,看它是否更大。重复10策略3:顺序处理defmain():n=int(input("输入有多少个数"))maxval=float(input("输入一个数>>"))#比较n-1个连续的值foriinrange(n-1):x=float(input("输入一个数>>"))ifx>maxval:maxval=xprint("最大数为",maxval)main()包含到目前为止看到的最大值PART11策略4:使用Python函数11策略4:使用PythonPython有一个内置的函数max,它返回最大值。defmain():x1,x2,x3=eval(input("输入三个数:"))print("最大值为",max(x1,x2,x3))课程目标小结希望大家能够掌握阅读、编写和实现使用判断结构的算法,包括使用系列判断和嵌套判断结构的算法。课程目标实践任务1.当discrim为0时,发生等根的情况。在这种情况下,discRoot也为0,并且两个根的值为−b。如果希望捕捉这种特殊情况,程序实际上需要一个三路判断。课程目标实践任务2.要找到三个数中最大的,你可能对要采取的步骤没有很好的直觉。只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 赠品小酒活动策划方案(3篇)
- 门市搬迁活动方案策划(3篇)
- 陶粒颗粒施工方案(3篇)
- 2026广东广州市海珠区消防安全委员会办公室招聘街道微型消防站队员26人备考题库(重点)附答案详解
- 2026湖北长江产融资本投资有限公司招聘5人备考题库汇编附答案详解
- 2026安徽蚌埠市卫生健康委委属医院第二批“校园招聘”79人备考题库及完整答案详解【有一套】
- 2026中共江西省委党校(江西行政学院)高层次人才招聘37人备考题库(基础题)附答案详解
- 2026广西钦州市统计局面向社会招聘编外人员2人备考题库【夺冠系列】附答案详解
- 2026深圳能源春季校园招聘备考题库附完整答案详解【夺冠】
- 2026广东广州市天河区东风实验小学招聘小学高年段语文教师备考题库附答案详解(基础题)
- 绍兴2025年浙江绍兴市政务服务办公室招聘政务服务专员6人笔试历年参考题库附带答案详解
- 中华人民共和国药品管理法实施条例培训宣贯
- 2026上海交通大学医学院招聘85人笔试参考题库及答案解析
- 2024新版2026春北师大版八年级数学下册全册教案教学设计
- 【生物】2025-2026学年人教版生物七年级下册核心知识点
- 恒丰银行社会招聘笔试试题
- 基层信访工作培训课件
- 电气火灾培训教学课件
- 齐成控股集团招聘笔试题库2026
- 2026年浙江经贸职业技术学院高职单招职业适应性测试模拟试题有答案解析
- 贵州省建筑与装饰工程计价定额
评论
0/150
提交评论