第4章选择结构(重点)本章提纲4.1if语句4.2switch语句4.3实例解析4.1if语句4.1.1单分支if语句一般格式如下:if(表达式)语句;说明:对条件表达式进行判断,若其值为“真(非0)”时执行语句,若其值为“假(0)”时则跳过语句。其执行过程见右图。4.1.1单分支if语句例如:设定学生成绩60分为及格分数线,用单分支if语句描述为:if(grade=60)printf(“passed\n”);又如:x大于y就输出x,用单分支if语句描述为:if(xy)printf(“%d”,x);4.1.2双分支if语句一般格式如下:if(表达式)语句1;else语句2;说明:与单分支if语句不同的是在条件为“真(非0)”或“假(0)”时执行指定的不同的操作。对条件表达式进行判断,若其值为“真(非0)”时,就执行语句1;若其值为“假(0)”时,就执行语句2。其执行过程见流程图4.2。例如:给学生成绩划分:成绩大于或等于60分时输出“passed”,成绩小于60分时输出“failed”。用双分支if语句描述为:4.1.2双分支if语句if(grade=60)printf(“passed\n”);elseprintf(“failed\n”);用条件运算符改写上两例:4.1.2双分支if语句(1)grade=60?printf(“passed\n”):printf(“failed\n”);(2)xy?printf(“%d”,x):printf(“%d”,y);由此说明适当的语句修改条件运算符可以完成if…else结构相同的功能。注意:对于单分支和双分支if后面的“表达式”,一般为逻辑表达式或关系表达式,事实上表达式的类型不限于此,可以是任意的数值类型(包括整型、实型、字符型、指针型数据)。只要表达式的值为非0,就认为它为真;只要表达式的值为0,就认为它为假。例如:if(6)printf(“passed\n”);if(‘A’)printf(“%d”,‘A’);这些都是合法的if语句。对于双分支if语句,else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。4.1.2双分支if语句if语句后面的表达式之后不能增加分号,同时注意语句后面的分号不能遗漏。在if和else后面可以只包括一个内嵌的操作语句,也可以包括多个操作语句,此时务必用“{}”将几个语句括起来成为一个复合语句。例如:if(x100){x--;s=+x;}else{x++;s=+x;}此时又要注意:在“{}”后面不能再添加分号,因为“{}”内是一个完整的复合语句,不需要再添加分号。4.1.2双分支if语句4.1.3多分支if语句对于解决判断多个条件的问题,可以使用if语句的嵌套,即在if语句中又包括一个或多个if语句。它的一般格式如下:if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;┆elseif(表达式m)语句m;else语句n;说明:依次去对多个条件进行判断测试,符合某一条件,则转去执行该条件下的操作,其它部分将被跳过;如果无一条件为“真(非0)”,就执行最后一个else所指定的操作。4.1.3多分支if语句【例4-1】编程实现给一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为‘A’等,89~80分为‘B’等,79~70分为‘C’等,69~60分为‘D’等,60分以下为‘E’等。4.1.3多分支if语句4.1.3多分支if语句【源程序】#includestdio.hmain(){intgrade;printf(inputthegrade:);scanf(%d,&grade);if(grade=90)printf(A\n);elseif(grade=80)printf(B\n);elseif(grade=70)printf(C\n);elseif(grade=60)printf(D\n);elseprintf(E\n);}思考:若输入大于100或小于0的数会出现什么结果?改进程序:#includestdio.hmain(){intgrade;printf(inputthegrade:);scanf(%d,&grade);if(grade100||grade0)printf(Error!!!\n);elseif(grade=90)printf(A\n);elseif(grade=80)printf(B\n);elseif(grade=70)printf(C\n);elseif(grade=60)printf(D\n);elseprintf(E\n);}4.2switch语句4.2.1switch语句简介对于解决实际生活中例如人口统计分类、工资统计分类、银行存款分类等等的多分支选择问题,采用多分支if语句(即if语句的嵌套)来处理固然可以但是如果分支较多,则嵌套的if语句层数多,程序冗长而且会导致可读性降低。C语言提供了直接处理多分支选择的switch语句它的一般格式如下:switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;┆case常量表达式n:语句n;default:语句m;}说明:其执行过程为进入switch结构后,根据表达式的值从上到下去找与其相匹配的case,以此作为入口,执行其后面的各语句。4.2.1switch语句简介4.2.1switch语句简介【例4-1】用switch语句改写如下:【源程序】main(){intgrade;printf(inputthegrade:);scanf(%d,&grade);switch(grade/10){case10:case9:printf(A\n);case8:printf(B\n);case7:printf(C\n);case6:printf(D\n);default:printf(E\n);}}对比main(){intgrade;printf(inputthegrade:);scanf(%d,&grade);if(grade=90)printf(A\n);elseif(grade=80)printf(B\n);elseif(grade=70)printf(C\n);elseif(grade=60)printf(D\n);elseprintf(E\n);}说明:根据switch后面表达式的值找到了相匹配的case分支后,就以此为入口执行后面的所有语句,而不再进行判断了。其流程图如下页图。4.2.1switch语句简介【运行结果】inputthegrade:98ABCDE4.2.2break语句在switch结构中的运用为了正确使用switch结构从多种结果中选择一种结果的功能,我们可以运用前面学过的break语句来达到此目的。对上页流程图修改如下页图:【源程序】main(){intgrade;printf(inputthegrade:);scanf(%d,&grade);switch(grade/10){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;}}说明:1.switch结构的执行部分是一个由一些case子句和一个可缺省的default子句组成的复合语句,特别注意要用一对“{}”括起来。2.switch后面的表达式一般是整型表达式或字符型表达式,与之相对应的case后面的常量表达式也应是一个整型表达式或字符型表达式,但要注意case与常量表达式之间要有空格。例如:case6+9:printf(“ok”);是合法的。4.2.2break语句在switch结构中的运用3.在执行switch语句时,根据其后表达式的值找相匹配的case子句,要注意“case常量表达式”只是起语句标号的作用,并不是在该处进行条件判断。当找到相匹配的case子句即入口标号时,就从此标号开始执行后面的语句。因此,应该在执行一个case子句后必须增加一条间断语句break来使流程跳出switch结构。如果未找到相匹配的case子句就执行default子句,若default子句放在最后其后可以不加break语句。4.各个case子句出现的次序对执行结果没任何影响,即顺序可以任意布局。4.2.2break语句在switch结构中的运用5.每一个case能够拥有一条或多条语句,其最大的不同之处在于使用多条语句时不需要用“{}”括起来。6.多个case可以共用一组执行语句。例如:┆case‘A’:case‘a’:++count;break;┆成绩为大写字母A或小写字母a都进行累加求和。7.switch结构中的case子句中的常量表达式的值不允许相同。8.switch结构允许嵌套。4.2.2break语句在switch结构中的运用4.3实例解析【例4-2】从键盘输入三个整数a、b、c,输出最大的一个。【编程思路】分析:可以先找出a与b之间的较大者,然后再将这个较大者与c比较找出较大者,则此数即为三个数中的最大数。【源程序】解法1:main(){inta,b,c;printf(inputa,b,c:);scanf(%d,%d,%d,&a,&b,&c);printf(themaxis:%d\n,c((ab)?a:b)?c:((ab)?a:b));}4.3实例解析解法2:main(){inta,b,c,max;printf(inputa,b,c:);scanf(%d,%d,%d,&a,&b,&c);if(ab)if(ac)max=a;elsemax=c;elseif(bc)max=b;elsemax=c;printf(themaxis:%d\n,max);}4.3实例解析【例4-3】有一个函数x(x1)y=2x-1(1≤x10)3x-11(x≥10)写一程序,输入x的值,输出y的值。4.3实例解析【编程思路】分析:x的取值划分了3个区间,使用多分支if语句(即if的嵌套)对应这3个区间的取值即可完成。4.3实例解析【源程序】main(){intx,y;pringtf(“inputx:”);scanf(“%d”,&x);if(x1)y=x;elseif(x10)y=2*x-1;elsey=3*x-11;printf(“y=%d\n”,y);}