第5章选择结构程序设计本章重点:if语句;if…else语句;switch语句。本章难点:选择结构的嵌套。5.1为什么需要选择结构5.2关系运算符和关系表达式5.3逻辑运算符和逻辑表达式5.4用if语句实现选择结构5.5用switch语句实现选择结构5.6选择结构的嵌套5.7选择结构程序设计综合举例5.8本章小结在前面介绍的顺序结构中,程序中的每条语句是按照各个语句的先后顺序依次执行的,执行完一条语句后再无条件地执行下一条语句,这就是顺序结构。但在现实生活中,有许多问题用顺序结构是无法解决的,需要用到选择结构。也就是说执行完一条语句后不是无条件地执行下一条语句,而是需要进行选择,要选择就需要条件的判断。现实生活中很多问题都需要进行条件的判断5.1为什么需要选择结构在C语言中有6种关系运算符:小于:;小于或等于:=;大于:;大于或等于:=;等于:==;不等于:!=。C语言中的关系运算符都是双元运算符号(需要两个操作数),操作数可以是数值型数据和字符型数据。如果关系成立,则关系运算的值为1(表示逻辑真);如果关系不成立,则关系运算的值为0(表示逻辑假)。5.2.1关系运算符5.2关系运算符和关系表达式5.2关系运算符和关系表达式5.2.1关系运算符算术运算符高、=、、===、!=赋值运算符号低图5.1关系运算符的优先级5.2.2关系表达式用关系运算符把两个表达式连接起来的式子称为关系表达式。例如:ab,a+2b+2,a+bc+d,’A’’B’,c=5d=3,(ab)(cd)关系表达式的值也是一个逻辑值,即“真”和“假”。由于在C语言中没有逻辑型数据,所以用“1”代表“真”,用“0”代表“假”。例子:#includestdio.hintmain(){doublescore;scanf(%lf,&score);if(score=60)printf(OK\n);elseprintf(Failed\n);return0;}/*86OK*//*59Failed*/1.逻辑非逻辑非是一元运算,其运算符为“!”。运算规则:若逻辑非运算符后面的操作数的值为0(逻辑假),则逻辑非的运算结果为1(逻辑真);若逻辑非运算符后面的操作数的值为1(逻辑真),则逻辑非的运算结果为0(逻辑假)。在C语言中进行逻辑判断时,数据的值为非0,则认为是逻辑真;数据的值为0,则认为是逻辑假。例如:inta=1,b=5;!b运算结果为0,因为b是非0值表示逻辑真,再进行逻辑非运算后结果为0;!(ab)运算结果为1,因为ab的运算结果是逻辑假,再进行逻辑非运算后结果为真。5.3逻辑运算符和逻辑表达式5.3逻辑运算符和逻辑表达式2.逻辑与逻辑与是二元运算,其运算符为“&&”。运算规则:若参与逻辑与运算的两个操作数的值均为1(逻辑真),则逻辑与的运算结果为1(逻辑真);若参与逻辑与运算的两个操作数的值中有一个为0(逻辑假),则逻辑与的运算结果为0(逻辑假)。例如:inta=1,b=5;a&&b运算结果为1,因为a和b的值均为逻辑真;(ab)&&(a0)运算结果为0,因为ab的运算结果是逻辑假。5.3逻辑运算符和逻辑表达式3.逻辑或逻辑或是二元运算,其运算符为“||”。运算规则:若参与逻辑与运算的两个操作数的值均为0(逻辑假),则逻辑与的运算结果为0(逻辑假);若参与逻辑与运算的两个操作数的值中有一个为1(逻辑真),则逻辑与的运算结果为1(逻辑真)。例如:inta=1,b=5;a||b运算结果为1,因为a的值为逻辑真;(ab)||(a0)运算结果为1,因为a0的运算结果是逻辑真。5.3逻辑运算符和逻辑表达式ab!a!ba&&ba||b真真假假真真真假假真假真假假真真假假假真真假假真表5.1逻辑运算的真值表5.3.2逻辑表达式用逻辑运算符把两个表达式连接起来的式子称为逻辑表达式。例如:!(ab)&&c,(ab)||(ac),(ab)&&(ac)||(bc),!(ab)&&b逻辑表达式的值也是一个逻辑值,即“真”和“假”。C语言中逻辑运算符的优先级为:逻辑非(!)→逻辑与(&&)→逻辑或(||)。5.3.2逻辑表达式“!”高算术运算关系运算“&&”和“||”赋值运算低图5.2运算符的优先级5.4.1单分支if语句单分支if语句的形式为:if(表达式)语句单分支if语句首先判断表达式的值,如果表达式的值为真,则执行后面的语句;如果表达式的值为假,则不执行后面的语句。这里的语句可以是一条简单的语句,也可以是一条复合语句。表达式语句0(假)非0(真)5.4用if语句实现选择结构5.4.1单分支if语句例题5.1输入一个整数,判断这个数是否是偶数。解题思路:首先定义一个内存变量x存储整数,然后使用表达式(x%2==0)判断是否是偶数。程序:#includestdio.hintmain(){intx;scanf(%d,&x);if(x%2==0)printf(%d是一个偶数。\n,x);}程序运行结果:1818是一个偶数。5.4.1单分支if语句5.4.2双分支if语句双分支if语句的形式为:if(表达式)语句1else语句2双分支if语句首先判断表达式的值,如果表达式的值为真,则执行语句1;如果表达式的值为假,则执行语句2。5.4.2双分支if语句0(假)表达式语句2非0(真)语句1例题5.2输入一个整数,判断这个数是奇数还是偶数。解题思路:首先定义一个内存变量x存储整数,然后使用表达式(x%2==0)判断是奇数还是偶数。如果表达式的值为1,则这个数是偶数,否则这个数就是奇数。5.4.2双分支if语句5.4.2双分支if语句程序:#includestdio.hintmain(){intx;scanf(%d,&x);if(x%2==0)printf(%d是一个偶数。\n,x);elseprintf(%d是一个奇数。\n,x);}程序运行结果:55是一个奇数。例子:#includestdio.hintmain(){inti,m,n,res;for(i=1;i=5;i++){scanf(%d%d,&m,&n);res=m%n;printf(res=%d\n\n,res);}return0;}/*45res=454res=195res=411-3res=2-113res=-2*/模运算的例子5.4.3多分支if语句多分支if语句的形式为:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3…elseif(表达式n)语句n5.4.3多分支if语句多分支if语句首先判断表达式1的值,如果表达式的值为真,则执行语句1,后面的语句再不执行;如果表达式的值为假,则再判断表达式2的值。如果表达式2的值为真,则执行语句2,后面的语句再不执行;如果表达式2的值为假,则继续判断表达式3的值。以此类推找到成立的条件然后执行对应的语句。非0(真)非0(真)表达式1表达式2表达式3表达式4语句1语句2语句3语句4语句50(假)0(假)0(假)0(假)非0(真)非0(真)5.4.3多分支if语句例子:95A88B73C66D35E#includestdio.hintmain(){doublescore;scanf(%lf,&score);if(score=90)printf(A\n);elseif(score=80)printf(B\n);elseif(score=70)printf(C\n);elseif(score=60)printf(D\n);elseprintf(E\n);return0;}多分支条件语句例题5.3计算分段函数的值。1021002010/210*2xxxxxxxxy解题思路:首先定义一个内存变量x,输入x的值后判断x的范围,然后根据分段函数计算函数值。5.4.3多分支if语句程序:#includestdio.hintmain(){floatx,y;printf(请输入x的值:);scanf(%f,&x);if(x=-10)y=2*x;elseif(x-10&&x=0)y=2/x;elseif(x0&&x=10)y=2+x;elseif(x10)y=2-x;printf(y=%f\n,y);}5.4.3多分支if语句程序运行结果:请输入x的值:8y=10.000000switch语句的一般形式为:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2case常量表达式3:语句3…case常量表达式n:语句ndefault:语句n+1}5.5用switch语句实现选择结构5.5用switch语句实现选择结构说明:1.switch语句是多分支选择语句,其特点是可以根据一个表达式的多种值,选择多个分支。虽然也可以用多分支的if语句或嵌套的if语句实现,但如果分支较多,则会导致多分支if语句和嵌套的if语句层次多,程序冗长且可读性降低。2.switch后面的表达式的值可以是整型、字符型、枚举型等。常量表达式的值必须互不相同,当表达式的值与某一个case后面的常量表达式的值相同时,就执行该case后面的语句。如果没有任何一个case后面的常量表达式的值与其相匹配时,则执行default后面的语句。3.在执行switch语句时,根据表达式的值找到入口,也即对应的case,执行完成对应的语句后,程序继续执行下一个case,而不再继续判断。4.执行完一个case以后,如果要终止switch语句的执行,可以用break语句来实现。5.5用switch语句实现选择结构例题5.4输入考试成绩(百分制)打印出其对应的等级。小于60:不及格大于等于60,且小于70:及格大于等于70,且小于80:中等大于等于80,且小于90:良好大于等于90,且小于等于100:优秀解题思路:首先要设计好switch后面的表达式,因为考试成绩为0-100的实数,如果把每一个值都用一个case列出来,那是不可能实现的。所以可以把0-100的实数划分成0~60、60~70、70~80、80~90、90~100、100进行处理。5.5用switch语句实现选择结构程序:#includestdio.hintmain(){floatscore;printf(请输入学生成绩:);scanf(%f,&score);switch((int)(score/10)){case10:case9:printf(优秀\n);break;case8:printf(良好\n);break;case7:printf(中等\n);break;case6:printf(及格\n);break;case5:case4:case3:case2:case1:case0:printf(不及格\n);break;default:printf(输入有误!\n);}}程序运行结果:请输入学生成绩:78中等例子:#includestdio.hintmain(){doublescore;intk;scanf(%lf,&score);k=score/10;switch(k){case10:case9:printf(A\n);break;case8:printf(B\n);break;case7:printf(C\n);break;case6:printf(D\n);break;default:printf(E\n);break;}return0;}多分支语句选择结构中又包含一个或多个选择结构,称为选择结构的嵌套。一般形式为:if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4有些时候可能不是if(表达式1)和else后同时又有if语句结构,可能只在if(表达式1)或else后才有if语句结构,这种情况仍然是选择结构的嵌套。甚至有些时候if(表达式1)后面的if(表达式2)中又还有选择结构。5.6选择结构的嵌套5.6选择结构的嵌套例题5.