收藏 分享(赏)

C语言选择结构程序设计.ppt

上传人:j35w19 文档编号:8115027 上传时间:2019-06-09 格式:PPT 页数:56 大小:350.50KB
下载 相关 举报
C语言选择结构程序设计.ppt_第1页
第1页 / 共56页
C语言选择结构程序设计.ppt_第2页
第2页 / 共56页
C语言选择结构程序设计.ppt_第3页
第3页 / 共56页
C语言选择结构程序设计.ppt_第4页
第4页 / 共56页
C语言选择结构程序设计.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

1、第4章 选择结构程序设计,4.1 if语句 4.2 switch语句 4.3 选择结构的程序设计举例,4.1 if语句,在C语言中,可以用if语句来实现单、双分支结构。 4.1.1 if语句的3种形式 C语言提供了3种形式的if语句。 1.基本if结构(单分支结构) 基本if结构的一般形式为: if (表达式) 语句1 该语句的执行过程是:若表达式的值为真(非0),则执行语句,否则不作任何操作,从而直接执行if语句后面的语句。其流程图结构如图4-1所示。,下一页,返回,4.1 if语句,例4-1 判断一学生的成绩是否及格,及格则打印出及格信息,否则不作任何处理。 程序如下: #include

2、main( ) int score; /*定义变量score,用它来表示学生的成绩*/ printf(please input the students score:n); scanf(%d,/*输出成绩合格信息*/ ,上一页,下一页,返回,4.1 if语句,输出结果: please input the studnts score: 85 The students score is passing. 注意:if语句中的“语句1”一般称作if子句,它可以为一条语句,也可以是多条语句(复合语句),注意复合语句要用一对花括号“”,“”括起来,以表示其是if 语句的一部分。 另外,条件表达式的值在正常

3、情况下为真或假,由于C语言没有专门的逻辑值,一般用0表示假,非0表示真。故可以利用任何非0值(正或负数)代表条件表达式值。,上一页,下一页,返回,4.1 if语句,2.if-else结构(双分支结构) if-else型分支有时也称双分支结构。这种结构的形式为: if (表达式) 语句1; else 语句2; 该语句的执行过程是:若表达式的值非0,则执行语句,否则执行语句2。其流程图结构如图4-2所示。 说明: if后面的表达式不限于是关系表达式或逻辑表达式,可以是任意表达式。,上一页,下一页,返回,4.1 if语句,if语句中的控制表达式应该用括号括起来,若有else子句,则控制表达式后的语句

4、同样必须用分号结束,例如: if(ij) j+; else i+; 但是分号也不能随意乱用,如果写成: if(ij);j+; else i+; 使if语句后面跟了一个空语句而使语句“else i+;”变得不合法。,上一页,下一页,返回,4.1 if语句,若if子句或else子句由多个语句构成,则应该构成复合语句,如: if(ij) j+;k+; else i+;k+; 也可以简单写成: if(ij) j+,k+; else i+,k+; if子句和else子句都是由逗号表达式构成的简单语句。,上一页,下一页,返回,4.1 if语句,例4-2 判断一学生的成绩是否及格,及格则打印出及格信息,否则

5、打印出不及格信息。 #include main( ) int score; /*定义变量score,用它来表示学生的成绩*/ printf(please input the students score :n); scanf(%d,/*从键盘输出成绩并给变量score*/ if (score=60)/*判断成绩是否超过60*/,上一页,下一页,返回,4.1 if语句,printf(n The students score is passing.); /*超过,输出合格信息*/ else printf(n The students score is NOT passing.); /*否则,输出成

6、绩不合格信息*/ 输出结果: please input the students score: 55 The students score is NOT passing.,上一页,下一页,返回,4.1 if语句,3.if-else-if结构(多分支结构) 多分支结构的一般形式为: if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式3) 语句3 else if (表达式m) 语句m else 语句n 该语句的执行过程是:若表达式1的值非0,则执行语句,否则若表达式2非0,则执行语句2,否则若表达式3非0,则执行语句3,若前面的表达式值都为0值,则最后执行语

7、句n。其流程图结构如图4-3所示。,上一页,下一页,返回,4.1 if语句,例4-3 判断一学生的成绩的成绩等级,若大于90分,则输出该学生成绩优秀A+,介于80与89之间则认为成绩良好A,介于79至70之间认为成绩中等B,介于60和69之间则是及格C,否则认为成绩不及格D。 编写程序如下: #include main( ) int score; /*定义变量score,用它来表示学生的成绩*/,上一页,下一页,返回,4.1 if语句,printf(please input the students score :n); scanf(%d, /*判断80=成绩,上一页,下一页,返回,4.1 i

8、f语句,else if (score=70 ) printf(n The students score is B.); /*判断70=60) printf(n The students score is C.); /*判断60=成绩 else printf(n The students score is D.); /*判断成绩 ,上一页,下一页,返回,4.1 if语句,4.1.2 if语句的嵌套 if和else子句中可以是任意合法的C语句,因此也可以是if语句(即在一个if 语句中可以又出现另一个if语句),这种语句被称为if语句的嵌套或多重if语句。内嵌的if语句既可以嵌套在if子句中,又可

9、嵌套在else子句中。其一般形式有如下5种: (1)语句形式1 if子句中嵌套if-else 子句。 if (表达式1) if (表达式2) 语句1 else 语句 else 语句3,上一页,下一页,返回,4.1 if语句,(2)语句形式2 if子句中嵌套if-else 子句,else 子句中嵌套if-else语句。 if (表达式1) if (表达式2)语句1 else语句2 else if (表达式3)语句3 else语句4,上一页,下一页,返回,4.1 if语句,(3)语句形式3 if (表达式1) if (表达式2) 语句1 else 语句2 情形A if (表达式1) if (表达式

10、2) 语句1 else 语句2 情形B 说明:这两种if语句在程序执行时的作用是不一样的,因为C语言规定:else总是与离它最近的上一个if 配对。如果想在if子句中执行嵌套,就必须利用花括号“ ”将整个嵌套if语句括起来,如情形A;否则形成情形B的状况。,上一页,下一页,返回,4.1 if语句,(4)语句形式4 嵌套if语句带有else。这种情形属于前面介绍的if-else-if结构。 if (表达式1)语句1 else if (表达式2)语句2 else语句3 (5)语句形式5 嵌套if语句不带有else子句。 if (表达式1)语句1 else if (表达式2)语句2,上一页,下一页,

11、返回,4.1 if语句,通常在if-else匹配的情况下,读者很清楚if语句的嵌套结构。一旦当if-else语句不匹配,有时会产生混淆,建议一般把内嵌的if语句放在外层的else子语句中,这样由于有外层的else相隔,内嵌的else 不会和外层的if配对,而只能与内嵌的if配对,从而不会混淆。另外建议对于内嵌的if语句一律用“ ”将其括起来,使其成为外层嵌套if-else语句的子句,从而使其清晰明了。一般来说,建议if语句的嵌套最多不要超过3层。良好的程序书写习惯对于减少程序书写错误是非常重要的。,上一页,下一页,返回,4.1 if语句,例4-4 有一函数: ,编一程序,输入一个x值,输出y值

12、。 可以先写出算法: 输入x 若x0 y=1 输出y 或: 输入x 若x0 y=1,上一页,下一页,返回,4.1 if语句,输出y 显然有以下3种程序可以实现题目的要求。 (1)用简单的if语句实现 main( ) int x,y; printf(Enter the x:); scanf(%d, ,上一页,下一页,返回,4.1 if语句,(2)采用内层if嵌在外层的if后面的结构 main( ) int x,y; printf(Enter the x:); scanf(%d, ,上一页,下一页,返回,4.1 if语句,(3)采用内层if嵌在外层的else部分,即else if结构 main(

13、) int x,y; printf(Enter the x:); scanf(%d, ,上一页,下一页,返回,4.1 if语句,例4-5 某商店售货,按购买货物的款数多少分别给予不同的优惠折扣: 购货不足250元的,没有折扣; 购货满250元,不足500元,折扣5%; 购货满500元,不足1 000元,折扣7.5%; 购货满1 000元,不足2 000元,折扣10%; 购货满2 000元,折扣15%。 问题分析:设购货款为m,折扣为d,根据题意则有:,上一页,下一页,返回,4.1 if语句,采用嵌套的if结构实现。 main( ) float m,d,amount; printf(Enter

14、your money for buying:); scanf(%f, ,上一页,下一页,返回,4.1 if语句,运行情况: Enter your money for buying:680 amount=629.00 再运行: Enter your money for buying:1 350 amount=1 215.00,上一页,返回,4.2 switch语句,if语句通常用于实现两种分支选择,而在实际应用中,存在着大量的多路分支问题。尽管使用if语句的嵌套形式可以达到多路分支选择的目的,但随着问题复杂性的增加,分支越多,嵌套的层次数也就越多,这就必然导致程序的可读性降低。因此,在C语言中提

15、供了switch语句用于直接处理多路分支选择问题。 switch语句的一般形式为: switch (表达式) case常量表达式1:语句组1; case常量表达式2:语句组2; case常量表达式n:语句组n; default:语句组n+1; ,下一页,返回,4.2 switch语句,switch语句的执行过程为:根据switch后面表达式的值,当找到与某一个case后面的常量表达式的值相等时,就以此作为一个入口,执行此case后面的语句,执行后,流程控制转移到后面继续执行连续多个case及default语句(不再进行判断),直至switch语句的结束;若所有的case中的常量表达式的值不与s

16、witch后面表达式的值匹配,则执行default后面的语句。 在使用switch语句时,应注意以下几点: switch后面的表达式和case后面的常量表达式可以为任意整型或字符型数据。,上一页,下一页,返回,4.2 switch语句,每一个case后的常量表达式的值应当互不相同。 switch语句组中可以不包含default分支,若没有default,则所有的常量表达式都不与表达式的值匹配时,switch语句就不执行任何操作。 另外,default写成最后一项也不是语法上必须的,它也可写在某个case前面(习惯上总是把default写在最后)。若把default写在某些case前面,当所有的

17、常量表达式都不与表达式的值匹配时,switch语句就以default作为一个入口,执行default后面的语句及连续多个case语句,直至switch语句的结束。 由于case及default后都允许是语句组,所以当安排多个语句时,也不必用花括号括起。,上一页,下一页,返回,4.2 switch语句,例4-6 下述程序段中,正确的是:_。,上一页,下一页,返回,4.2 switch语句,switch语句执行时,先计算表达式的值,然后顺次计算表达式常量1的值并与表达式的值比较。若有某个表达式常量的值与其相等,则其他表达式和default判定失败,程序执行该常量表达式后面的语句组。若没有匹配的,则

18、程序执行default之后语句组。 因为没有具体运算内容,本例只能考核switch语句的语法现象。前3个选项中各出现了一个错误。在选项A.中,case后的表达式含有变量,但C语言要求必须是常量或常量表达式;在选项B.中,case之后的表达式,一方面其中含有变量,更主要的是对switch结构的执行机理不理解:执行该语句时,C语言只是将switch后面的表达式与case后的常量的值做比较,因此,case之后一般不能使用关系、逻辑等表达式;选项C.中的错误是在两个case后的常量都是12(12和y-8),而C语言要求case后的常量不能重复。,上一页,下一页,返回,4.2 switch语句,尽管选项

19、D.中的switch语句有点怪,但从语法角度看是正确的。如果x的值为3或-1,程序都将执行y=2并结束,子句case 2没有实际用处,可以删去。所以这是正确答案。 为了在执行某个case分支后,使流程跳出switch结构,即终止switch语句的执行,总是把break语句与switch语句一起合用,即把break语句作为每个case分支的最后一条语句,当执行到break语句时,使流程跳出本条switch语句。break语句又叫强制中止语句,它的功能是使程序的执行无条件转向本层复合结构的下一条语句。这种使用switch语句的形式为:,上一页,下一页,返回,4.2 switch语句,switch(

20、表达式) case 常量表达式1: 语句组1 break; case 常量表达式2: 语句组2 break; case 常量表达式n: 语句组n break; default: 语句组n+ 它的流程图如图4-4所示。,上一页,下一页,返回,4.2 switch语句,例4-7 以下程序的输出结果是( )。 #include void main() int x=1,y=0,a=0,b=0; switch(x) case 1; switch(y) case 0:a+ +;break; case 1:b+ +;break; ,上一页,下一页,返回,4.2 switch语句,case 2: a+ +;b

21、+ +;break; case 3: a+ +;b+ +; printf(na=%d,b=%d,a,b) A.a=1,b=0 B.a=2,b=1 C.a=1,b=1 D.a=2,b=2,上一页,下一页,返回,4.2 switch语句,分析:这是嵌套形式的switch语句,因为break结构影响较大,而此程序中的第1个case后没有break语句。程序执行时,x=1,执行内嵌的switch语句,因y=0,计算a+ +,使变量a的值为1并终止内层switch结构,回到外层。程序继续执行case 2:后面的语句a+ +;b+ +;,这使变量a,b的值分别为2和1,外层switch语句结束,故B正确。

22、 例4-8 根据考试成绩的等级打印出百分制分数段。 main( ) char grade; printf(Input the grade:); scanf(%c,上一页,下一页,返回,4.2 switch语句,switch(grade) case A:printf(85100n);break; case B:printf(7084n);break; case C:printf(6069n);break; case D:printf(60n);break; default:printf(errorn); ,上一页,下一页,返回,4.2 switch语句,运行输入: Input the grade

23、:A 运行结果: 85100 再次运行输入: Input the grade:B 再次运行结果: error 读者也许已注意到,在每个case语句执行完后,增加一个break语句(中断switch-case语句,使流程跳出switch结构)来退出switch-case结构。,上一页,下一页,返回,4.2 switch语句,例4-9 判别某考试成绩等级是否大于60分。 main( ) char grade; printf(Input the grade:); scanf(%c, ,上一页,下一页,返回,4.2 switch语句,运行输入: Input the grade:B 运行结果: =60

24、再次运行输入: Input the grade:D 再次运行结果: 60 各个case和default的出现次序可以任意,但必须作适当处理,否则将会影响执行结果。例如,在上面的switch语句中,若把default放在最前面,则应该在最后加break语句:,上一页,下一页,返回,4.2 switch语句,switch(grade) default: printf(errorn);break; case A: case B: case C: printf(60n);break; case D: printf(60n);break; ,上一页,下一页,返回,4.2 switch语句,如果在某个ca

25、se后面又嵌套了一个switch语句,一定要注意,在执行了内层嵌套的switch语句后,还需要执行一条break语句才能跳出外层的switch语句。 例4-10 在case后面嵌套switch语句的程序。 main( ) int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0:a+;break; case 1:b+;break; ,上一页,下一页,返回,4.2 switch语句,case 2: a+;b+;break; case 3: a+;b+; printf(a=%d,b=%dn,a,b); 运行结果: a=2,b=1,上一页,返回,

26、4.3 选择结构的程序设计举例,例4-11 编写一程序,判断某一年是否闰年。 假定以变量leap代表是否闰年的信息。若某年为闰年,则令leap=1;若为非闰年,令leap=0。最后判断leap是否为1(真),若是,则输出“闰年”信息。 编写程序如下: main( ) int year,leap; scanf(%d, if(year%4=0) if(year%100=0) if(year%400=0),下一页,返回,4.3 选择结构的程序设计举例,leap=1; else leap=0; else leap=1; else leap=0; if(leap) printf(%d is,year);

27、 else printf(%d is not,year); printf(a leap year.n); ,上一页,下一页,返回,4.3 选择结构的程序设计举例,运行情况如下: 1989 1989 is not a leap year. 2000 2000 is a leap year. 例4-12 从键盘输入一个字符,判断此字符是小写字母、大写字母或数字字符还是其他字符。 根据题意编写程序如下: main( ) char ch; scanf(%c, if(ch=A&ch=Z),上一页,下一页,返回,4.3 选择结构的程序设计举例,printf(%c is Uppercase!,ch); el

28、se if(ch=a ,上一页,下一页,返回,4.3 选择结构的程序设计举例,上述程序执行情况为: d d is Lowercase! 9 9 digit! * * is other!,上一页,下一页,返回,4.3 选择结构的程序设计举例,例4-13 求ax2+bx+c=0方程的解。 我们知道,一元二次方程式的根为 它实际上应该有以下几种可能: a=0,不是二次方程。 b2-4ac=0,有两个相等实根。 b2-4ac0,有两个不等实根。 b2-4ac0,有两个共轭复根。,上一页,下一页,返回,4.3 选择结构的程序设计举例,编写程序如下: #include main( ) float,a,b,

29、c,d,disc,x1,x2,realpart,imagpart; scanf(%f,%f,%f,上一页,下一页,返回,4.3 选择结构的程序设计举例,if(fabs(disc)le-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(has distinct real roots:%8.4f and %8.4fn,x1,x2); else realpart=-b/(2*a);,上一页,下一页,返回,4.3 选择结构的程序设计举例,imagpart=sqrt(-disc)/(2*a); printf(has complex r

30、oots:n); printf(%8.4f+%8.4fin,realpart,imagpart); printf(%8.4f-%8.4fin,realpart,imagpart); 程序中用disc代表b2-4ac,先计算disc的值,以减少以后的重复计算。对于判断b2-4ac是否等于0时,要注意一个问题:由于disc(即b2-4ac)是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:if(disc=0)因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于零而导致结果错误。所以采取的办法是判别disc的绝对值(fabs(disc))是否小于一个很小的数(例如10

31、-6),如果小于此数,就认为disc=0。程序中以realpart代表实部p,以imagpart代表虚部q,以增加可读性。,上一页,下一页,返回,4.3 选择结构的程序设计举例,运行结果如下: 1,2,1 The equation has two equalroots:-1.0000 1,2,2 The equation has complex roots: -1.0000+1.0000i -1.0000-1.0000i 2,6,1 The equation has distinct real roots:-0.1771 and=2.8229,上一页,返回,图 4-1 单分支结构流程图,返回,图 4-2 双分支结构流程图,返回,图 4-3 多分支结构流程图,返回,图 4-4 switch和break语句结构图,返回,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报