第五章选择结构程序设计本章主要内容:5.1关系运算符及其表达式5.2逻辑运算符及其表达式5.3if语句5.4switch语句5.5综合应用举例本章重点:熟练掌握关系、逻辑运算;深刻理解if语句的执行过程及在程序设计中的作用;熟练掌握if语句的变化和switch语句的功能和作用。5.1关系运算符及其表达式一.关系运算符:====!=二.关系表达式525=2比较的结果是一个逻辑量,即“真”或“假”,分别用整数1和0表示。三.关系运算符的优先级低于算术运算符,高于赋值运算符。如:a=2*28(b=2)5-1[例5.1]关系运算符的应用选择结构程序设计成立,为“真”(1)不成立,为“假”(0)5.2逻辑运算符及其表达式一.逻辑运算符!(逻辑非)、&&(逻辑与)、||(逻辑或)二.逻辑表达式!(ab)10x&&y100p==q||x!=y逻辑表达式的结果还是逻辑值,即“真”或“假”,分别用1和0表示。[例5.2]逻辑运算典型的运算量是关系表达式选择结构程序设计运算量是算术表达式时,如果算术表达式的值为0则认为“假”,非0认为“真”。在一个逻辑表达式中可以包含多个逻辑运算和其它各种运算符,这时将按它们的优先级进行运算:选择结构程序设计()!、++、--、+、-*、/、%+、-、=、、===、!=&&||=、+=、-=、*=、/=、%=等高低如表达式“53&&2||84-!0”的运算顺序如下:短路运算:由于逻辑运算的特殊性,逻辑表达式求值不一定必须求到底。如:a&&b&&ca||b||c选择结构程序设计只有a为真时才判断b,只有a&&b为真时才判断c。亦即:若a为假,表达式的值已经肯定为假,不必再往下判断了。只要a为真,就不必再继续判断,结果一定为真。用来判定所给定的条件是否满足,根据判定的结果(真或假)决定要执行的语句。一.if语句的格式:格式1:if(表达式)语句如:if(ab)a=b;printf(“a=%d\n”,a);[例5.5-1]将输入的两个数中最大的打印出来。[例5.5-2]将输入的两个数先大后小输出。表达式语句真假5.3if语句选择结构程序设计格式2:if(表达式)语句1else语句2如:if(ab)c=a;elsec=b;printf(“c=%d\n”,c);[例5.5-1]将输入的两个数中最大的打印出来。[例5.5-2]将输入的两个数先大后小输出。选择结构程序设计表达式真假语句1语句2二.嵌套的if语句在if语句中的“语句”处又是if语句,则称为if语句的嵌套。一般格式如下:if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4在嵌套的if语句中,人们习惯将它写成锯齿形,以增加程序的可读性。选择结构程序设计内层的if语句如果是简化的if,如:if(表达式1)if(表达式2)语句1else语句2从最内层开始,else总是与它上面最近的、未曾配对的if配对。选择结构程序设计{}?[例5.6]求分段函数的值main(){intx,y;scanf(“%d”,&x);printf(“y=%d\n”,y);}选择结构程序设计0)(x10)(x00)(x1yif(x0)y=-1;elseif(x==0)y=0;elsey=1;if(x=0)if(x0)y=-1;elsey=0;elsey=1;y=-1;if(x=0)if(x0)y=1;elsey=0;y=0;if(x=0){if(x0)y=1;}elsey=-1;√三.else-if格式if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3……else语句n它实际上是if语句在else中有if嵌套的格式变化。如:选择结构程序设计if(x0)y=-1;elseif(x==0)y=0;elsey=1;[例5.7]输入考试成绩的等级,打印出百分制分数段(A等:85分以上,B等:70~84,C等:60~69,D等:60分以下)。main(){chargrade;scanf(“%d”,&grade);if(grade==’A’)printf(“85~100\n”);elseif(grade==’B’)printf(“70~84\n”);elseif(grade==’C’)printf(“60~69\n”);elseif(grade==’D’)printf(“60\n”);elseprintf(“Error\n”);}选择结构程序设计四.条件运算符语法格式为:表达式1?表达式2:表达式3如:max=(ab)?a:b;与if(ab)max=a;elsemax=b;等价条件运算符的优先级仅仅高于赋值运算符和逗号运算符,低于所有其它运算符。[例5.8]判断键盘输入的一个字符是否为大写字母,如果是则转换为小写字母,否则不转换。输出处理后的字符。选择结构程序设计条件5.4switch语句语法格式:switch(表达式){case常量1:语句组1case常量2:语句组2……case常量n:语句组ndefault:语句组n+1}选择结构程序设计=常量1=常量2=常量n表达式语句组1语句组2语句组n语句组n+1yyynnn如在例5.7中的if部分可以考虑写成下面的switch语句:switch(grade){case’A’:printf(“85~100\n”);case’B’:printf(“70~84\n”);case’C’:printf(“60~69\n”);case’D’:printf(“60\n”);default:printf(“Error\n”);}若grade=‘C’,则输出:60~6960Error选择结构程序设计改进的switch语句语法格式:switch(表达式){case常量1:语句组1;break;case常量2:语句组2;break;……case常量n:语句组n;break;default:语句组n+1}选择结构程序设计=常量1=常量2=常量n表达式语句组1语句组2语句组n语句组n+1yyynnn改进后的switch语句:switch(grade){case’A’:printf(“85~100\n”);break;case’B’:printf(“70~84\n”);break;case’C’:printf(“60~69\n”);break;case’D’:printf(“60\n”);break;default:printf(“Error\n”);}若grade=‘C’,则输出:60~69选择结构程序设计多个case可以共用一组执行语句。如:switch(grade){case’A’:case’B’:case’C’:printf(“60~100\n”);break;case’D’:printf(“60\n”);break;default:printf(“Error\n”);}选择结构程序设计5.5综合应用举例[例5.9]在例2.9的计算机随机出一道两位数的加法题中,当用户回答完毕后,给出适当的评语。分析:重设随机种子:randomize();产生10~99之间的随机数:a=random(90)+10;可能的运行情况:计算:23+72=96↙回答错误,您输入的数是:96要看答案吗(y/n)?y↙正确答案是:95选择结构程序设计[例5.10]输入年、月,输出该月有多少天。分析:每年的1、3、5、7、8、10、12月有31天;4、6、9、11月有30天;2月闰年有29天,平年有28天。年号能被4整除,但不能被100整除,或者年号能被400整除的年均是闰年。设年份为year,判断year是否为闰年:if(year%4==0&&year%100!=0||year%400==0)选择结构程序设计本章小结:本章介绍了关系运算符和逻辑运算符,由它们构成的表达式通常是在if语句和循环语句中作为条件来使用的。if语句和switch语句的使用,使程序的执行变成了“跳跃”式执行了,实际上是对程序中的某些部分实现的选择运行。这种选择是必要的,可以根据不同的情况选择合适的代码进行处理。在理解了问题的要求后,如果需要这样的选择,就应该使用选择结构的语句。第5章作业5.1输入一个整数,如果为正数或零,计算该数的平方;如果为负数,计算该数的立方。5.2输入一个整数,如果:(1)当为正数时,如果它即是3又是7的倍数,输出“是3、7的倍数”;否则输出“不是3、7的倍数”。(2)当为负数或零时,显示“不是正整数”。5.3输入3个数,将其中最大数输出。5.4输入3个字母,按字母表顺序从小到大输出这3个字母。选择结构程序设计5.5输入某学生成绩,若成绩在85分以上,输出verygood,若成绩在60~85分之间,输出good,若成绩低于60分,输出nogood。5.6输入班号,输出该班学生的人数。用switch语句完成。5.7输入一个人的出生日期和今天的日期,计算他的周岁。如今天是2003年10月11日,王明1984年10月5日出生,他19岁;李丽1984年10月20日出生,她18岁。班号919293949596人数303230303225选择结构程序设计