C语言第4章-分支结构.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三部分C语言的结构语句第4章选择结构问题的提出:百分制成绩的等级划分问题§编程实现:给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为‘A’等,89~80分为‘B’等,79~70分为‘C’等,69~60分为‘D’等,60分以下为‘E’等。假定成绩为整型数据。4.1if语句§4.1.1单分支if语句它的一般格式如下:if(表达式)语句;说明:对条件表达式进行判断,若其值为“真(非0)”时执行语句,若其值为“假(0)”时则跳过语句。其执行过程见流程图4.1。一条件:一个条件表达式可以是单值判断如x==1,也可以是范围判断,如x0&&x10。一语句:if后只能管一条语句§例如:设定学生成绩60分为及格分数线,用单分支if语句描述为:if(grade=60)printf(“passed\n”);§又如:x大于y就输出x,用单分支if语句描述为:if(xy)printf(“%d”,x);§写出程序段的运行结果:当整型变量x=55,60,78时,if(x=60)printf(“%d”,x);printf(“passed\n”);【例4-1】百分制成绩的等级划分问题之解法1:仅用if单分支语句实现main(){intscore;scanf(%d,&score);if(score60)printf(“grade=E”);if(score=60&&score70)printf(“grade=D”);if(score=70&&score80)printf(“grade=C”);if(score=80&&score90)printf(“grade=B”);if(score=90)printf(“grade=A”);}//要求掌握:数学范围与if条件范围的转换4.1.2双分支if语句§它的一般格式如下:if(表达式)语句1;else语句2;§说明:与单分支if语句不同的是在条件为“真(非0)”或“假(0)”时执行指定的不同的操作。对条件表达式进行判断,若其值为“真(非0)”时,就执行语句1;若其值为“假(0)”时,就执行语句2。其执行过程见流程图4.2。一条件:一个条件/关系表达式一语句:if后有且仅能有一条语句,else后只能管一条语句一执行:只能执行一条语句§例如:给学生成绩划分:成绩大于或等于60分时输出“passed”,成绩小于60分时输出“failed”。用双分支if语句描述为:if(grade=60)printf(“passed\n”);elseprintf(“failed\n”);§说明:§1.对于单分支和双分支if后面的“表达式”,一般为逻辑表达式或关系表达式,事实上表达式的类型不限于此,可以是任意的数值类型(包括整型、实型、字符型、指针型数据)。只要表达式的值为非0,就认为它为真;只要表达式的值为0,就认为它为假。例如:if(6)printf(“passed\n”);if(‘A’)printf(“%d”,‘A’);这些都是合法的if语句。§2.else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。§3.if语句后面的表达式之后不能增加分号(为何?),同时注意语句后面的分号不能遗漏(为何?)。§4.在if和else后面可以只包括一个内嵌的操作语句,也可以包括多个操作语句,此时务必用“{}”将几个语句括起来成为一个复合语句。例如:if(x100){x--;s=+x;}//如果去掉括号{}呢?else{x++;s=+x;}//如果去掉括号{}呢?§此时又要注意:在“{}”后面不能再添加分号,因为“{}”内是一个完整的复合语句,不需要再添加分号。§在前面的章节还提到过与if/else结构密切相关的条件运算符?:,它是C语言中唯一的三目运算符(即有三个操作数)。对上面的两例用条件运算符改写为:grade=60?printf(“passed\n”):printf(“failed\n”);xy?printf(“%d”,x):printf(“%d”,y);§由此说明适当的语句修改条件运算符可以完成if/else结构相同的功能。4.1.3多分支if语句§对于解决判断多个条件的问题,可以使用if语句的嵌套,即在if语句中又包括一个或多个if语句。它的一般格式如下:§if(表达式1)§语句1;§elseif(表达式2)§语句2;§elseif(表达式3)§语句3;§┆§elseif(表达式m)§语句m;§else§语句n;§//一般来说表达式之间具备一定的顺序关系§说明:§1.执行顺序:开始执行该结构后,便依次去对多个条件进行判断测试,符合某一条件,则转去执行该条件下的操作,其它部分将被跳过;如果无一条件为“真(非0)”,就执行最后一个else所指定的操作,这个else可以看作“其它情形”。§2.应当特别注意if与else的匹配关系(难点):规则是从最内层开始,else总是与它上面最近的(未曾配对的)if配对(而不是if与他最下面的else匹配)。例根据程序写出运行结果§main()§{intx=2,y=-1,z=2;§if(xy)§if(y0)z=0;§elsez+=1;§printf(“%d\n“,z);§}{}答案:23.其执行过程见流程图4.3。注意表达式之间的顺序关系课堂作业:将表达式位置倒过来后,即低等级先判断,高等级后判断,完成框图与程序【例4-2】百分制成绩的等级划分问题之解法2:if…else§【源程序】§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);§}例:关于if与else的匹配问题§编程实现以下功能:§1)当a=0并且b=0时输出“error”§2)当a=0并且b!=0时什么也不做§3)当a!=0时,进行自加a==0b==0输出”error”开始结束a++TFFTIf(a==0)if(b==0)printf(“error”);//请问他们是如何匹配的?elsea++;{}4.2switch语句4.2.1switch语句§对于解决实际生活中例如人口统计分类、工资统计分类、银行存款分类等等的多分支选择问题,采用多分支if语句(即if语句的嵌套)来处理固然可以,但是如果分支较多,则嵌套的if语句层数多,程序冗长而且会导致可读性降低。C语言提供了直接处理多分支选择的switch语句,它的一般格式如下:§switch(表达式)§{§case常量表达式1:语句1;§case常量表达式2:语句2;§┆§case常量表达式n:语句n;§default:语句m;§}§说明:其执行过程可描述为:按整型、配标号、添break、可跳出。§1.按整型、配标号:根据整型/字符型表达式的值,从上到下去找与其相匹配的case标号(整型常量,单值,故不会进行范围判断,如x0),以此作为入口,执行其后面的各语句。§2.添break、可跳出。见下节§//百分制成绩的等级划分问题之解法3(不完善):§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);§}§}【例4-3】对【例4-2】用switch语句改写.如何改写呢?关键:不象多分支if语句有范围判断,而switch语句按单值匹配,故要将范围映射为单值.§【运行结果】§inputthegrade:98§A§B§C§D§E§说明:此时的结果并不是我们所希望得到的,也就是说根据switch后面表达式的值找到了相匹配的case分支后,就以此为入口执行后面的所有语句,而不再进行判断了。其流程图如图4.5。问题:如果分别输入82,77,65,52时,运行结果会怎样呢?4.2.2break语句在switch结构中的运用§添break、可跳出。§为了正确使用switch结构从多种结果中选择一种结果的功能,我们可以运用前面学过的break语句直接跳出switch结构来达到此目的。对流程图4.5修改如下如图4.6:【例4-4】百分制成绩的等级划分问题之解法3(较完善):§【源程序】§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”);是合法的。§3.在执行switch语句时,根据其后表达式的值找相匹配的case子句,要注意“case常量表达式”只是起语句标号的作用,并不是在该处进行条件判断。当找到相匹配的case子句即入口标号时,就从此标号开始执行后面的语句。因此,应该在执行一个case子句后必须增加一条间断语句break来使流程跳出switch结构。如果未找到相匹配的case子句就执行default子句,若default子句放在最后其后可以不加break语句。§4.各个case子句出现的次序对执行结果没任何影响,即顺序可以任意布局。§5.每一个case能够拥有一条或多条语句,其最大的不同之处在于使用多条语句时不需要用“{}”括起来。§6.多个case可以共用一组执行语句。例如:§┆§case‘A’:§case‘a’:++count;break;§┆§成绩为大写字母A或小写字母a都进行累加求和。§7.switch结构中的case子句中的常量表达式的值不允许相同。§8.switch结构允许嵌套。4.3实例解析§【例4-5】从键盘输入三个整数a、b、c,输出最大的一个。§【编程思路】§分析:可以先找出a与b之间的较大者,然后再将这个较大者与c比较找出较大者,则此数即为三个数中的最大数。§程序代码:§main()§{inta,b,c,max;printf(inputa,b,c:);§scanf(%d,%d,%d,&a,&b,&c);§if(ab)§if(ac)§max=a;§else§max=c;§else§if(bc)§max=b;§else§max=c;§printf(themaxis:%d\n,max);§}#includestdio.hmain(){intc;printf(Entermornorhorother:);c=getchar();switch(c){case'm':printf(\nGoodmorning!\n);break;case'n':printf(\nGoodnight!\n);break;case'h':printf(\nHello!\n);break;default:printf(\n????????\n);break;}}【例4-6】根据输入字母输出字符串【例4-7】根据程

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功