您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 程序设计思想与方法――第三章
数据处理的流程控制分支控制结构LuChaojun,SJTU2LuChaojun,SJTU22流程控制•数据是被加工处理的原材料,而处理过程要用流程控制结构来描述–类比:烹调=食材+烹制过程烹制过程:先炒再煮;如果淡了则加盐;反复翻炒5分钟;...•常见的流程控制结构–顺序,跳转,分支,循环,子程序等•好的流程:结构清晰,易理解,易验证,易维护LuChaojun,SJTU3LuChaojun,SJTU33顺序控制结构•按语句的自然先后顺序执行LuChaojun,SJTU4LuChaojun,SJTU44编程实例•温度转换程序eg3_1.py:华氏转换成摄氏•流程图:用标准化的图形符号来表示程序步骤–流程图中的步骤可以是不同抽象级的LuChaojun,SJTU5LuChaojun,SJTU55分支控制结构(1)•可以选择不同的执行路径•单分支结构if条件:语句体–条件:布尔表达式–语句体:语句序列.左边需要缩进一些空格.•语义:计算条件的真假.若为真,则执行语句体,并把控制转向下一条语句;若为假,则直接把控制转向下一条语句.条件语句体入口出口条件表达式TrueFalseLuChaojun,SJTU6LuChaojun,SJTU6布尔表达式(1)•条件是一个布尔表达式.–结果为布尔值True或False•简单布尔表达式:表达式1关系运算符表达式2–关系运算:,=,==,=,,!=数值比较字符串比较:按字典序.字符序由编码(ASCII等)决定.如:大写字母在小写字母前.列表,元组的比较LuChaojun,SJTU布尔表达式(2)•复杂布尔表达式:布尔表达式1布尔运算布尔表达式2–布尔运算:and,or,not布尔表达式1and布尔表达式2布尔表达式1or布尔表达式2not布尔表达式LuChaojun,SJTU7LuChaojun,SJTU88and的定义•and表示“并且”:PandQ为真iffP和Q都为真–真值表见右•例(32)and(21)True(32)and(23)FalsePQPandQFFFFTFTFFTTTLuChaojun,SJTU99or的定义•or表示“或者”:PorQ为假iffP和Q都为假–真值表见右–与日常用语中互斥的“或”不同!•例(32)or(3=2)True(23)or(24)FalsePQPorQFFFFTTTFTTTTLuChaojun,SJTU1010not的定义•not表示“否定”:notP为真iffP为假.–真值表见右•例not32Falsenotnot32TruePnotPTFFT布尔运算符的优先级•not最高,and次之,or最低–Q:aornotbandc何意?–A:aor((notb)andc)–最好使用括号!LuChaojun,SJTU11例:一局乒乓球比赛的结束•双方任何人先得11分a==11orb==11•更准确的:一方至少要多2分才胜(a=11anda-b=2)or(b=11andb-a=2)或者写成(a=11orb=11)andabs(a-b)=2LuChaojun,SJTU12LuChaojun,SJTU13LuChaojun,SJTU1313编程实例•温度转换程序:eg3_2.py–增加热浪告警功能f=input(TemperatureindegreesFarenheit:)c=(f–32)*5.0/9printTemperatureindegreesCelsius:,cifc35:printWarning:HeatWave!LuChaojun,SJTU14LuChaojun,SJTU1414编程实例•温度转换程序:eg3_3.py–增加热浪和寒潮告警功能f=input(TemperatureindegreesFarenheit:)c=(f–32)*5.0/9printTemperatureindegreesCelsius:,cifc=35:printWarning:HeatWave!ifc=-6:printWarning:ColdWave!两路分支结构•语法if条件:if-语句体else:else-语句体•if和else是非此即彼的关系.–下列语句对吗?ifc=35:printWarning:HeatWave!else:printWarning:ColdWave!LuChaojun,SJTU15多路分支:嵌套if-else•if语句可以嵌套–多重嵌套不好难读代码松散ifc=35:printWarning:HeatWave!else:ifc=-6:printWarning:ColdWave!else:printHavefun!LuChaojun,SJTU16多路分支:if-elif-else结构•语法if条件1:情形1语句体elif条件2:情形2语句体...elif条件n情形n语句体else其他情形语句体•语义:找到第一个为真的条件并执行对应语句序列,控制转向下一条语句;若无,则执行else下的语句序列,控制转向下一条语句.LuChaojun,SJTU17编程实例•温度转换程序eg3_4.pyf=input(TemperatureindegreesFarenheit:)c=(f-32)*5.0/9printTemperatureindegreesCelsius:,cifc=35:printWarning:HeatWave!elifc=-6:printWarning:ColdWave!else:printHavefun!LuChaojun,SJTU18程序运行错误的处理•程序编译正确,但在运行时发生错误.–例如:a/b语法没错,但运行时万一b=0,就会出错–又如:输入数据的类型和个数不对,列表索引越界,等等•编程时如果没有考虑运行错误,程序就很容易运行崩溃,非正常结束.•好的程序应该是健壮的.LuChaojun,SJTU19编程实例•求一元二次方程根:eg3_5.pyimportmatha,b,c=input(Enter(a,b,c):)discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)printThesolutionsare:,root1,root2–运行程序,输入1,2,3–程序崩溃!LuChaojun,SJTU20提高健壮性:使用错误检测代码•错误检测代码:利用if判断是否发生了某种运行错误.do_sth()ifsome-error:do_sth_else()LuChaojun,SJTU21编程实例•解方程程序的改进:eg3_6.pyimportmatha,b,c=input(Enter(a,b,c):)discrim=b*b-4*a*cifdiscrim=0:discRoot=math.sqrt(discrim)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)printThesolutionsare:,root1,root2else:printTheequationhasnorealroots!LuChaojun,SJTU22提高健壮性:利用函数返回码•函数中有检测代码,执行正常与否可利用返回值作为标志码.•调用者无条件调用函数,并检测返回值.–例如,为了解决sqrt函数的问题,设计robustSqrt():defrobustSqrt(x):ifx0:return-1else:returnmath.sqrt(x)–则程序中可以这样检测ifrobustSqrt(b*b4*a*c)0:...LuChaojun,SJTU23异常处理•错误检测代码的缺点:当程序中大量充斥着错误检测代码时,解决问题的算法反而不明显了.x=doOneThing()ifx==ERROR:异常处理代码......或写成:ifdoOneThing()==ERROR:异常处理代码......LuChaojun,SJTU24算法清晰但不健壮:doStep1()doStep2()doStep3()健壮但算法不清晰:ifdoStep1()==ERROR:错误处理代码1elifdoStep2()==ERROR:错误处理代码2elifdoStep3()==ERROR:错误处理代码3异常处理•能否既健壮,又不破坏原来算法的清晰?•异常处理机制–程序运行时如果出错则抛出一个异常;–程序员能编写代码捕获并处理异常;–可使程序不因运行错误而崩溃,尽量使用户不受意外结果的困扰.LuChaojun,SJTU25Python的缺省异常处理•程序运行出错时,抛出的异常被Python系统自动处理-基本上就是中止程序的执行并显示一些错误信息.a=Helloprinta[5]Traceback(mostrecentcalllast):Filestdin,line1,inmoduleIndexError:stringindexoutofrangeLuChaojun,SJTU26程序员自定义异常处理•Python提供try-except语句,可用来自定义异常处理代码.a=Hellotry:printa[5]exceptIndexError:printIndexwrong!Indexwrong!LuChaojun,SJTU27异常处理机制的优点•既保持核心算法的清晰,又能提高程序的健壮性.LuChaojun,SJTU28算法清晰但不健壮:doStep1()doStep2()doStep3()健壮但算法不清晰:ifdoStep1()==ERROR:错误处理代码1elifdoStep2()==ERROR:错误处理代码2elifdoStep3()==ERROR:错误处理代码3算法清晰且健壮:try:doStep1()doStep2()doStep3()exceptERROR:错误处理代码异常处理语句•可以对不同类型的错误分别指定处理代码try:正常程序体except错误类型1:异常处理程序1...except错误类型n:异常处理程序nexcept:其他异常的处理程序LuChaojun,SJTU29编程实例•解方程程序的改进:用异常处理语句来捕获math.sqrt的溢出错误.(eg3_7.py)importmathtry:a,b,c=input(Enter(a,b,c):)discRoot=math.sqrt(b*b-4*a*c)root1=(-b+discRoot)/(2*a)root2=(-b-discRoot)/(2*a)printThesolutionsare:,root1,root2exceptValueError:printTheequationhasnorealroots!–更完善的版本:eg3_8.pyLuChaojun,SJTU30LuChaojun,SJTU31LuChaojun,SJTU31End
本文标题:程序设计思想与方法――第三章
链接地址:https://www.777doc.com/doc-3372371 .html