《第5章选择结构ppt课件.ppt》由会员分享,可在线阅读,更多相关《第5章选择结构ppt课件.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第5章 选择结构第五章 选择结构5.1 if语句5.2 switch语句5.3应用程序举例5.4本章常见错误及解决方法5.5本章小结5.1 if语句5.1.1 if语句中的表达式5.1.2 if语句的三种形式5.1.3 复合语句在分支语句中的应用5.1.4 if语句的嵌套5.1.5 条件运算符与条件表达式5.1.1 if语句中的表达式 if语句根据给定的条件即表达式进行判断,表达式的值为真(非0)或假(0),决定了if后紧跟的语句是否被执行。 if语句的基本形式: if(表达式)语句(表达式)语句 if关键字之后的表达式就是用来描述条件的 有以下类型:逻辑表达式或关系表达式 赋值表达式 变量
2、5.1.1 if语句中的表达式1关系表达式表示条件 关系表达式通常用来比较两个操作数的大小,其结果是一个逻辑值,操作数关系成立则结果为真,否则为假。如下程序段(1): if(m=n) printf(“%d equal to %d”,m,n); 程序段(2) : if(n%2!=0) sum=sum+n; 若表达式值为真则执行求和语句。否则不执行该语句。5.1.1 if语句中的表达式 2.逻辑表达式表示条件 逻辑表达式就是用逻辑运算符将关系表达式或逻辑量连接起来的有意义的式子,逻辑表达式的值是一个逻辑值,即“真”或“假”。它可以表示较为复杂的条件,如下例判别年份year是否闰年。 闰年的条件:能
3、被4整除,但不能被100整除,或者能被4整除,又能被400整除。表达式为:(year%4=0)&(year%100!=0)|(year%400=0) 满足条件则为闰年。5.1.1 if语句中的表达式3任意的数值类型表示条件uif(5)printf(“ok”);表达式的值为5,是一个非0的数即为真,输出ok;uif(0)printf(“ok”);则不执行输出语句。u常见的还有实型、字符型、指针型数据作表达式。5.1.2 if语句的三种形式1.单分支单分支if语句的形式为语句的形式为:if (表达式表达式) 语句语句执行过程如图所示 首先判断表达式的值是否为真,若表达式的值非0,则执行其后的语句;
4、否则不执行该语句。 在if语句中,if关键字后的表达式必须用括号括起来,且之后不加分号。表达式语句真(非0) 假(0)5.1.2 if语句的三种形式-单分支【例5-1】从键盘输入一个整数,求该整数的绝对值。#include #include int main() int num,result; printf(Enter an integer: ); scanf(%d,&num); /*输入整数num*/ result=num; if(numy) printf(“%d”,x); else printf(“%d”,y); 表达式表达式 语句语句1 语句语句2非非005.1.2 if语句的三种形式-
5、双分支【例5-4】从键盘输入一个整数,判断该数能否被2和3整除.#include #include int main() int num; printf(从键盘输入一个整数:n); scanf(%d,&num); if(num%2=0 & num%3=0) printf(%d能够被2和3同时整除!n,num); else printf(%d不能够被2和3同时整除!n,num); system(pause); return 0;使用if-else语句的注意事项:虽然if和else之间加了分号,但ifelse仍是一条语句,都同属于一个if语句。每一个else语句之前必须加分号,整个语句结束处也必须
6、有分号。else子句是if语句的一部分,必须和if语句配对使用,不能单独使用。 5.1.2 if语句的三种形式-多分支 3.多分支多分支if语句语句 if(表达式1)语句1 else if(表达式2)语句2 else if(表达式n)语句n else 语句n+1 【例5-7】输入一个百分制成绩,输出其对应的等级。90100分为A, 8089分为B, 7079分为C, 6069分为D, 059分为E。#include #include int main() int x; char grade; printf(please input score:); scanf(%d,&x); if(x=90)
7、 grade=A; else if(x=80) grade=B; else if(x=70) grade=C; else if(x=60) grade=D; else grade=E; printf(grade=%cn,grade); system(pause); return 0; 5.1.3 复合语句在分支语句中的应用 复合语句就是逻辑上相关的一组用 括起来的语句,它被当成一条语句来执行,当条件表达式值为真时, 内的语句全部被执行,否则全部不被执行,可以用在单个语句可以使用的任意地方。如if语句也可以写成下述形式:if(表达式) /*分支语句为复合语句*/ 语句序列; 5.1.4 if语句
8、的嵌套当if语句的分支语句又是if语句时,就构成了if 语句的嵌套。其一般形式如下:if (表达式表达式)if (表达式表达式) 语句语句1;else 语句语句2;elseif (表达式表达式) 语句语句3;else 语句语句4;5.1.4 if语句的嵌套多个if和多个else重叠的这时要特别注意if和else的配对问题。例如以下程序段,共五行:1)if (表达式)2) if (表达式)语句1;3)else4) if (表达式)语句2;else 语句3;C语言规定:else总是与它同一个总是与它同一个内前面最近的未配对的内前面最近的未配对的if配对配对。因此这个例子中的第3行的else应该和第
9、2行的if配对。需要注意的是:else和if是成对出现的,有else出现,必定有if语句。有if语句,不一定有else语句。#include #include #include int main() float a,b,c,deta,x1,x2,p,q; printf(Enter a,b,c:); scanf(%f,%f,%f, &a, &b, &c); deta=b*b-4*a*c; if(fabs(deta)1e-6) /*求出两个不相等的实根*/ x1=(-b+sqrt(deta)/(2*a); x2=(-b-sqrt(deta)/(2*a); printf(x1=%7.2f,x2=%7
10、.2fn, x1, x2); else /*求出两个共轭复根*/ p=-b/(2*a); q=sqrt(fabs(deta)/(2*a); printf(x1=%7.2f + %7.2f in, p, q);/*输出两个共轭复根*/ printf(x2=%7.2f - %7.2f in, p, q); system(pause); return 0; 【例例5-9】求一元二次方程ax2+bx+c=0的解(a0)注意: if语句允许嵌套,但嵌套的层数不宜太多。在实际编程时,应适当控制嵌套层数(23层)。“语句组1”和“语句组2”,可以只包含一个简单语句,也可以是复合语句复合语句。务必牢记务必牢记
11、:不管是简单语句,还是复合语句中的各个语句,每个语句后面的分号必不可少! 例如: if (num1num2) max=num1; else max=num2; 语句if行后面的赋值语句“max=num1;”分号不能省略。但不要误认为if和else是2个独立的语句,它们都属于if语句中的一部分,else是if语句的子句。5.1.5 条件运算符与条件表达式【例】从键盘上输入一个字符,如果它是大写字母,则把它转换成小写字母输出;否则,直接输出。程序段如下: char ch;printf(input a character: );scanf(%c,&ch); ch=(ch=A & ch=Z) ? (c
12、h+32) : ch; printf(ch=%cn,ch);如果分支太多,if语句嵌套的层次数太多,势必会造成程序的冗长,可读性差。 C语言提供了switch语句直接处理多分支选择。switch语句一般与break 语句配合使用。其一般形式为:switch(表达式) case常量表达式1: 语句1; break; case常量表达式2: 语句2; break; case常量表达式n: 语句n; break; default : 语句n+1; 5.2 switch语句switch语句的执行过程即:switch语句计算表达式的值,将其逐个同case关键字后的常量表达式进行比较,当表达式的值与某个常
13、量表达式的值相等时,即执行其后的语句,然后跳出switch语句。如果表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句,然后跳出switch语句。【例例】成绩等级与分数范围有如下对应关系:等级A,对应分数范围80100;等级B,对应分数范围7079;等级C,对应分数范围6069,等级D,对应分数范围059,根据成绩等级输出分数范围。程序段: scanf(“%c”,&grade); switch(grade) case A:printf( score:80100n);break; case B:printf(score:7079n); break; case C:pr
14、intf(score:6069n); break; case D:printf(score:059n); break; default:printf(score:data error!n); 5.2 switch语句5.2 switch语句使用switch语句时需注意:switch关键字后表达式可以是任何结果为整型或字符型(long、int或char)的表达式。case关键字后面只能是整型或字符型的常量或常量表达式。在case后的各常量表达式的值不能相同,否则会出现错误。每个case 语句的结尾绝对不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分支重叠)。最后必须使用defau
15、lt 分支。可以避免让人误以为忘了 default处理。【例例】输入2016年的一个月份,输出这个月的天数。(2016年为闰年) 分析:根据输入的月份数判断,当月份为1、3、5、7、8、10、12时,天数为31,当月份为4、6、9、11时,天数为30,2016年是闰年,所以,当月份为2时,天数为29。#include #include int main() int month,days; printf(请输入月份 : t); scanf(%d,&month); switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case
16、 12:days=31;break; case 4: case 6: case 9: case 11:days=30;break; case 2:days=29;break; default:days=-1; if(days=-1) printf(输入错误!n ); else printf(2016 年 %d 月有 %d 天!n,month,days); system(pause); return 0;注意:switch语句允许多情况执行相同的语句。例如4、6、9和11月均执行 days=30;可以写成:case 4: case 6: case 9: case 11:days=30;但不能写成
17、:case 4,6,9,11:days=30;也不能写成:case 4, case 6, case 9,case 11:days=30;5.3 应用程序举例【例【例5-14】由年份判断某一年是否闰年。分析:闰年的条件:1)年份能被4整除,但不能被100整除,是闰年;2)年份能被100整除,又能被400整除,是闰年。不满足这两个条件的不是闰年。以变量leap代表是否闰年的信息。若闰年,令leap=1;非闰年,leap=0。#includeint main()int year,leap=0;printf(“input year:”);scanf(“%d”,&year);if ( year % 4
18、= 0 & year % 100 != 0 ) | (year % 100 = 0 & year%400 = 0) leap=1;else leap=0;if (leap) printf(%d is a leap year.n ,year);elseprintf(%d is not a leap year.n ,year); return 0;【例5-15】运输公司对用户计算运费。路程(s)越远,每千米运费越低。标准如下:s250 没有折扣250s500 2%折扣500s1000 5%折扣1000s20008%折扣2000s300010%折扣3000s15%折扣设每千米每吨货物的基本运费为p,
19、货物重为w,距离为s,折扣为d,则总运费f的计算公式为f=p*w*s*(1-d)。#include #include int main( ) int c,s; float p,w,d,f; printf(输入基本运费,货物重量,距离); scanf(%f,%f,%d,&p,&w,&s); if(s=3000) c=12; else c=s/250; switch(c) case 0:d=0;break; case1:d=2;break; case2: case3:d=5;break; case4: case5: case6: case7:d=8;break; case8: case 9: ca
20、se10: case11:d=10;break; case12:d=15;break; default: printf(error); break; f=p*w*s*(1-d/100.0); printf(运费为:%15.2fn,f); system(pause); return 0; 5.4本章常见错误及解决方法1 if-else语句与空语句的连用。例如: if(NULL != p) ; fun(); 2复合语句丢失花括号,例如: int a=3,b=5,c=4,t; if(ab) t=a; a=b; b=t; if(ac) t=a; a=c; c=t; if(bc) t=b; b=c; c
21、=t; printf(%d,%d,%dn,a,b,c);3switch语句中缺失break语句,例如: int i=1; switch(i) case 1:printf(one,i); case 2:printf(two,i); case 3:printf(three,i); default:printf(%d,i);程序运行结果:onetwothree15.5 本 章 小 结 根据某种条件的成立与否而采用不同的程序段进行处理的程序结构称为选择结构。选择结构是C语言中一种重要的语句结构,它体现了程序的逻辑判断能力。一般,采用if语句实现简单分支结构程序,用switch和break语句组合实现多
22、分支结构程序。本章中主要介绍了下面内容:(1)选择结构的控制条件。选择结构离不开逻辑判断,关系运算和逻辑运算正体现了这种逻辑判断能力。选择结构的控制条件通常用关系表达式或逻辑表达式构造,也可以用一般表达式表示。因为表达式的值非0即为“真”,0即为“假”。所以,具有值的表达式均可作为if语句的控制条件。5.5 本 章 小 结(2)if语句。C语言利用if语句来实现选择结构。if语句主要有4种句式,分别是:单分支的if语句、双分支的if语句、多分支的if语句和嵌套的if语句。在嵌套if语句中,一定要匹配好else与if结合的问题。在if语句的三种形式中,所有的语句应为单个语句,如果想在满足条件时执行一组(多句)操作,则必须把这一组语句用花括号“”括起来组成一个复合语句。(3)switch语句。switch语句专门用于解决多分支选择问题。switch语句只有与break语句相结合,才能设计出正确的多分支结构的程序。break语句通常出现在switch语句或循环语句中,它能终止执行它所在的switch语句。