第5章分支结构程序设计本章的学习重点◆简单的if语句◆if-else语句执行规则◆嵌套的if-else语句◆switch语句◆break语句◆嵌套的switch语句5.1结构化程序设计思想1976年,NiklausWirth提出:程序=算法+数据结构结构化程序设计的基本思想是:1.自顶向下2.逐步细化3.模块化设计4.结构化程序编码结构化程序设计框架图程序主入口模块1模块2模块n子模块1子模块2子模块1子模块2子模块mcode1code2code4code5code3code7code8code65.2简单的if语句if语句有三种基本形式:if语句if和else语句嵌套if和else语句设计分支结构应注意如下问题:1.正确选择条件或逻辑表达式作为分支的判断条件。2.根据需求绘制分支流程图。3.按流程图编写程序。5.2.1if语句的定义if语句的一般形式:if(表达式)语句段if语句的执行流程:如果表达式的值为真(非0),则执行其后的语句段,否则不执行该语句。If语句流程图:表达式语句段开始真(非0)假(0)5.2.1if语句的定义if语句中的表达式可以是任何能转化为数值的表达式,例如:if(100)if(a==b)if(a&&b||c)if(sizeof(int))if((ab)?(a+b):(a-b))范例5.1GetMaxVariableInTwo.c利用if语句的分支功能,可以区分两个或多个数值的大小。本范例由键盘输入两个变量的值,使用if语句判断两者中的较大值,并将较大值输出在屏幕上。5.2.2合理设计if语句1.逻辑运算符的编写风格逻辑运算表达式编写应尽量避免产生歧义,避免出现逻辑错误,例如,为避免逻辑表达式书写错误,通常将常量放在逻辑运算符左边:if(a==0)a=-a;应写成:if(0==a)a=-a;2.语句段封装不论语句段由一条语句还是多条语句构成,都使用大括号封装。实训5.1——求一元二次方程的实根解键盘输入一元二次方程ax2+bx+c=0的三个参数a,b和c,计算当判别式b2-4ac=0时的根,程序使用if语句判断是否满足判别式条件,结果精确到小数点后3位。判别式可计算为:sqrt_delta=sqrt(b2-4ac)当sqrt_delta大于或等于0时方程有实根。因此,一元二次方程的两个根分别为:x1=(-b+sqrt_delta)/2ax2=(-b-sqrt_delta)/2a1.需求分析:需求1:键盘输入参数a,b,c的值需求2:判断判别式,确定方程是否有实根需求3:调用开根号数学函数sqrt,计算方程的根需求4:输出结果,精度为小数点后3位实训5.1——求一元二次方程的实根解2.技术应用对于需求1,使用scanf函数输入参数a,b,c的值。对于需求2,使用if语句判断方程是否有实根,判断方法为:if(b2-4ac=0)。对于需求3,由于要求精确到小数点后3位,采用数据类型float型。根据上述分析画出程序流程图:源文件:CalculateFormulaRealRoot.c开始YesNoscanf函数输入a,b,cdelta=b*b-4*a*cdelta=0计算sqrt_delta,计算根x1和x2输出x1和x2终止5.3多分支if语句多分支if语句又称为“if-else语句”,是由关键字if和else构成的多分支结构语句。if-else语句的一般形式为:if(表达式)语句段1else语句段2if-else语句的执行规则为:若表达式的值为真(非0),则执行语句段1,否则进入else分支,执行语句段2。5.3.1if-else语句的结构if-else语句的表达形式为:if(表达式){语句段1}else{语句段2}if-else语句的流程图:表达式语句段1开始真(非0)假(0)语句段25.3.1if-else语句的结构范例5.2CalculateAbstract.c数学计算中,绝对值使用||表示,本范例从键盘输入参数a的值,然后利用if-else语句实现绝对值的计算,并打印信息显示数据符号是否发生了变化。5.3.2if-else语句的应用范例5.3JudgeOddorEven.c键盘输入int型参数a的值,判断其是否为偶数,若为偶数,则打印a为偶数信息,若为奇数,则打印为奇数信息。利用模除(%)对a值是否为偶数进行判断,使用if-else分支语句实现不同信息的输出。5.3.2if-else语句的应用5.3.2if-else语句的应用范例5.3JudgeOddorEven.c键盘输入int型参数a的值,判断其是否为偶数,若为偶数,则打印a为偶数信息,若为奇数,则打印为奇数信息。利用模除(%)对a值是否为偶数进行判断,使用if-else分支语句实现不同信息的输出。范例5.4JudgeLeapYearorNotWithIfElse.c键盘输入unsignedint型年份,判断其是否为闰年,若为闰年,则打印为闰年信息,若为平年,则打印为平年信息。闰年的判断方法是:若年数能被400整除,那么该年是闰年,若能被4整除但不能被100整除,该年是闰年,其他年份都是平年。5.3.3if-else-if语句的结构及应用当有多个分支选择时,可采用if-else-if语句,if-else-if类型结构语句的一般形式为:if(表达式1)语句段1;elseif(表达式2)语句段2;elseif(表达式3)语句段3;……elseif(表达式m)语句段m;else语句段n;If-else-if语句流程图:表达式1语句段1开始真(非0)假(0)表达式2表达式3语句段2语句段3语句段4假(0)假(0)真(非0)真(非0)真(非0)5.3.3if-else-if语句的结构及应用范例5.5StudentScoreSet.c学生成绩分为5个等级,分别为:A:90=score=100,B:80=score90,C:70=score80,D:60=score70,E:score60键盘输入某学生成绩,判断其属于哪个等级,并打印到屏幕上。使用多分支if-else-if语句实现。范例5.6JudgeCharacterFromKeyboard.c使用getchar函数接收键盘输入的一个字符,并判断该字符类型,若输入为字母,则打印字母信息,若为数字,则打印数字信息,若为控制字符,则打印控制字符信息。5.4嵌套if-else语句嵌套if语句指在if分支或else分支中再次执行if或else语句。嵌套if分支语句的流程图如下:可否乘坐飞机有无上午航班有无下午航班可否乘坐火车有无上午火车有无下午火车乘坐乘坐乘坐乘坐乘坐汽车开始出发可以不可以有无有无不可以可以无有有无5.4.1嵌套if-else语句的定义嵌套if-else语句一般表达形式为:if(表达式1){if(表达式2){语句段1}else{语句段2}}else{if(表达式3){语句段4}else{语句段5}}如图所示为单层嵌套if-else语句流程图:表达式1表达式2表达式3语句段1语句段2语句段3语句段4开始结束真(非0)假(0)真(非0)假(0)真(非0)假(0)5.4.2嵌套if-else语句的应用范例5.7CompareTwoVariableValue.c键盘输入两个int型变量的值a和b,判断两个变量的大小,若ab,则输出ab,若ab,则输出ab,若a==b,则输出a==b。实训5.2——求一元二次方程的复数根解键盘输入一元二次方程ax2+bx+c=0的三个参数a,b和c,计算:b2-4ac=0时,输出实数根,b2-4ac0时,输出复数根,并检查输入参数的正确性。使用嵌套if语句实现。首先使用scanf函数输入三个参数a,b和c,定义判别式变量delta=b2-4ac,定义变量sqrt_delta=sqrt(b2-4ac)。当delta大于0时一元二次方程的两个根分别为:x1=(-b+sqrt_delta)/2a,x2=(-b-sqrt_delta)/2a当delta等于0时,方程有一个实根:x=-b/2a当delta小于0时,方程有两个共轭复数根,分别为:x1=-b/2a+sqrt_delta/2ai,x2=-b/2a-sqrt_delta/2ai实训5.2——求一元二次方程的复数根解1.需求分析:需求1:键盘输入参数a,b,c的值并判断输入参数需求2:判断判别式,确定方程有实根还是复数根需求3:调用开根号数学函数sqrt,计算方程的根需求4:输出结果2.技术应用对于需求1,使用scanf函数输入参数a,b,c的值。对于需求2,使用if语句判断方程有实根还是复数根,判断方法为:if(b2-4ac=0)。对于需求3,输出结果时根据实根和复数根的不同,输出不同数据格式,如复数根应输出:m+ni和m=ni的形式。实训5.2——求一元二次方程的复数根解一元二次方程求根流程图源代码:CalculateFormulaRoot.c开始scanf函数输入a,b,c终止a==0delta=b*b-4*a*cdelta=0sqrt_delta=sqrt(abs(delta))0==deltax=RealPartRealPart=-b/(2*a)Outputresultx1=RealPart+sqrt_delta/(2*a)x2=RealPart-sqrt_delta/(2*a)x1=RealPart+sqrt_delta/(2*a)x2=RealPart-sqrt_delta/(2*a)真(非0)假(0)真(非0)真(非0)假(0)假(0)5.5switch语句switch语句的一般表达形式为:switch(表达式){case常量表达式1:语句段1;case常量表达式2:语句段2;……case常量表达式n:语句段n;default:语句段n+1;}5.5.1switch语句的定义switch语句的运行规则为:计算表达式的值,顺次与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句段,语句段执行完毕后,不再进行判断,继续执行后面所有case后的语句。switch语句流程图:语句段1开始……语句段2语句段n语句段n+1case1表达式计算case2casendefault……switch5.5.1switch语句的定义范例5.8SwitchSentenceCase.c键盘输入整型的星期数,打印出英文的星期名字字符串,根据键盘输入的星期数,打印出该星期数的英文名使用switch语句实现,输入函数使用scanf函数,星期一记为1,星期天记为7。例如,输入2,应打印Tuesday。5.5.2break语句为避免程序在switch语句中持续执行case语句,可以使用break语句,switch语句中添加break语句的流程图:语句段1开始……语句段2语句段n语句段n+1case1表达式计算case2casendefault……switchbreakbreakbreakbreak……5.5.3switch语句的执行与应用范例5.9SwitchSentenceWithBreak.c键盘输入学生成绩,分段显示不同成绩段的优劣:90=score=100为excellence80=score90为allright70=score80为midding60=score70为passscore60为bad实训5.3——使用switch语句实现四则运算键盘输入四则运算式,通过switch语句分支执行+,-,*,/的四则运算,结果精确到小数点后3位。例如,输入4.5-6,将输出结果:4.5-6=-1.5。程序只能实现简单的四则运算,不能实现复合四则运算,输入参数采用float型,使用switch语句做四则运算的分支程序。1.需求分析:需求1:键盘输入四则运算式需求2:switch语句作分支判断四则运算需求3:输出结