第5章 选择结构程序设计_第1页
第5章 选择结构程序设计_第2页
第5章 选择结构程序设计_第3页
第5章 选择结构程序设计_第4页
第5章 选择结构程序设计_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章第五章 选择结构程序设计选择结构程序设计本章主要内容本章主要内容n5.1 5.1 关系运算符和关系表达式关系运算符和关系表达式n5.2 5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式n5.3 if5.3 if语句语句n5.4 switch5.4 switch语句语句n5.5 5.5 程序举例程序举例5.1 5.1 关系运算符和关系表达式关系运算符和关系表达式n关系运算关系运算:对两个量进行:对两个量进行“比较运算比较运算”一、关系运算符及其优先次序一、关系运算符及其优先次序关系运算符关系运算符优先级优先级运算对象个数运算对象个数结合性结合性 小于小于6 62( 2(双目运算符双目运

2、算符) )左左结合性结合性( (自左至右自左至右) )= 大于大于= = 大于等于大于等于= 等于等于7 7!= != 不等于不等于n算术运算符、赋值运算符、逗号运算符、关系运算术运算符、赋值运算符、逗号运算符、关系运算符算符的优先级由高到低的次序为的优先级由高到低的次序为: : 算术运算符算术运算符 关系运算符关系运算符 赋值运算符赋值运算符 逗号运算符逗号运算符n例如例如:ca+bca+b ac ac a=bc a=bc a=bc a=bc( (a+ba+b) )( (abacca=a=( (bcbc) )注意区分注意区分“=”=”和和“=”=”!a=a=( (bcbbaba+bb+ca+

3、bb+c(a=3)(b=5)(a=3)(b=5)abab)(bb)(bbab的值为的值为_; ab=cab=c的值为的值为_; b+cab+cbcf=abc的值为的值为_;1 11 10 00 05.2 5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式1. 1. 逻辑运算符及其优先次序逻辑运算符及其优先次序逻辑运算符逻辑运算符优先级优先级运算对象个数运算对象个数结合性结合性& 逻辑与逻辑与11112( 2(双目运算符双目运算符) )左左结合性结合性| | 逻辑或逻辑或1212 ! ! 逻辑非逻辑非2 21( 1(单目运算符单目运算符) )右右结合性结合性优先级次序:优先级次序: !

4、 ! 算术运算符算术运算符 关系运算符关系运算符 & | 赋值运算符赋值运算符 逗号运算符逗号运算符2. 2. 逻辑量:逻辑量: 真,真, 假假3 3. . 逻辑表达式逻辑表达式n用用逻辑运算符逻辑运算符将将逻辑量逻辑量连接起来的式子。连接起来的式子。4. 4. 逻辑运算的逻辑运算的结果结果(真(真/ /假)假) &:参与运算的:参与运算的两个量都为两个量都为真真时,时,结果才为真结果才为真,否则为假。,否则为假。 |:参与运算的:参与运算的两个量只要两个量只要有一个为真有一个为真,结果就为真结果就为真。 两两个量都为假时,结果为假。个量都为假时,结果为假。 非非0000形式:

5、形式:常量、变量、表达式常量、变量、表达式(算(算术术表达式、表达式、关系关系表达式、表达式、逻辑逻辑表表达式、达式、赋值赋值表达式等)表达式等)&真真假假真真假假真真假假假假假假|真真假假真真假假真真真真真真假假 ! !:参与运算量为真时,结果为:参与运算量为真时,结果为假;参与运算量为假时,结果为真。假;参与运算量为假时,结果为真。 n逻辑表达式的逻辑表达式的值值: 真真1 1 或或 假假0 0n例如:若例如:若a a的值为的值为4 4,则,则 !a !a的值为的值为_。 a&-5a&-5的值为的值为_。 a&0|2a&0|2的值为的值为_。0 01

6、 11 1真真假假!真真假假n在求解过程中,并不是所有的逻辑运算符都要被在求解过程中,并不是所有的逻辑运算符都要被执行。执行。当前面的表达式可以得出整个表达式的结当前面的表达式可以得出整个表达式的结果时,编译程序不再求后面的表达式。果时,编译程序不再求后面的表达式。(1)a(1)a&b b&c c:只有:只有a a为真时,才需要判断为真时,才需要判断b b的值,只的值,只有有a a和和b b都为真时,才需要判断都为真时,才需要判断c c的值。的值。(2)a(2)a|b b|c c:只要:只要a a为真,就不必判断为真,就不必判断b b和和c c的值,只的值,只有有a a为假,才

7、判断为假,才判断b b。a a和和b b都为假才判断都为假才判断c c。int x, y, i;int x, y, i;x=4; x=4; y=5;y=5;i= +x=5 | +y=6 ;i= +x=5 | +y=6 ;printf(x=%d,y=%d,i=%dn, x, y, i );printf(x=%d,y=%d,i=%dn, x, y, i );例如:若例如:若a=3,b=2,c=1a=3,b=2,c=1,则,则nac ac 的值为的值为_。na!=b & c=0 a!=b & c=0 的值为的值为_。na | ab a | ab 的值为的值为_。n53 & 8

8、3 & 8y)if(xy) z=y; z=y; y=x; y=x; x=z; x=z; 可以是任意类型的可以是任意类型的表达式,一般为表达式,一般为逻逻辑辑或或关系关系表达式表达式单一语句或单一语句或复合语句复合语句将变量将变量x x和和y y的值互换的值互换(2) (2) if if( (表达式表达式) ) 语句语句1 1 elseelse 语句语句2 2例:例:if (xy) printf(%d,x);if (xy) printf(%d,x); else printf(%d,y); else printf(%d,y);表达式表达式 语句语句1 1 语句语句2 2真真假假(3) (3

9、) if if( (表达式表达式1) 1) 语句语句1 1 else ifelse if( (表达式表达式2) 2) 语句语句2 2 else ifelse if( (表达式表达式3) 3) 语句语句3 3 else ifelse if( (表达式表达式m) m) 语句语句m m elseelse 语句语句n n注意:一般注意:一般elseelse与离其与离其最近的最近的if if配对!配对!例:例: if (number500) cost=0.15;if (number500) cost=0.15; else if(number300) cost=0.10; else if(number30

10、0) cost=0.10; else if(number100) cost=0.075; else if(number100) cost=0.075; else if(number50) cost=0.05; else if(number50) cost=0.05; else cost=0; else cost=0;cost=cost=0.150.15,number500number5000.100.10,300number300number5005000.0750.075,100number100number3003000.050.05,50number50=0) if (x=0) ; ;

11、/ /可以是空语句可以是空语句 else printf(%d,x) else printf(%d,x); ;例例5.1 5.1 输入两个输入两个实数实数,按代数值,按代数值由小到大由小到大的顺序输出的顺序输出这两个数。这两个数。 #include#includevoid main()void main() float a,b,t;float a,b,t;scanf(%f,scanf(%f, %f,%f, &a,&a, &b);&b);if(if( _ _ ) ) t=a;t=a;a=b;a=b;b=t;b=t; printf(%5.2f,printf(%5.2f

12、, %5.2fn,%5.2fn, a, a, b);b); /可见可见a a中小,中小,b b中大中大 将变量将变量a a和和b b的值互换的值互换ab 例例5.2 5.2 输入三个数输入三个数a,b,c,a,b,c,要求按由小到大的顺序输出。要求按由小到大的顺序输出。分析:要求排序后分析:要求排序后a a中最小,中最小,c c中最大,需比较中最大,需比较3 3次。次。 if ab if ab 将将a a和和b b对换对换 (a (a为为a,ba,b中较小者中较小者) ) if ac if ac 将将a a和和c c对换对换 (a (a为为a,ca,c中较小者,中较小者,a a最小最小) )

13、if bc if bc 将将b b和和c c对换对换 (b (b为为b,cb,c中较小者,中较小者,c c最大最大) )#include #include void main ( ) void main ( ) float a,b,c,t; float a,b,c,t; scanf(%f,%f,%f, scanf(%f,%f,%f,& &a, a,& &b, b,& &c); c); if(ab)if(ab) t=a; a=b; b=t; t=a; a=b; b=t; if(ac)if(ac) t=a; a=c; c=t; t=a; a=c; c

14、=t; if(bc) if(bc) t=b; b=c; c=t; t=b; b=c; c=t; printf(%5.2f,%5.2f,%5.2fn,a,b,c); printf(%5.2f,%5.2f,%5.2fn,a,b,c); 二、二、if if语句的嵌套语句的嵌套nif if语句的嵌套语句的嵌套:在:在if if语句中又包含语句中又包含1 1个或多个个或多个if if语句语句。n形式:形式:if(if(表达式表达式1) 1)if(if(表达式表达式2) 2) 语句语句1 1else else 语句语句2 2elseelseif(if(表达式表达式3) 3) 语句语句3 3else els

15、e 语句语句4 4内嵌内嵌if if内嵌内嵌if if注意:注意:elseelse总是与它总是与它上面上面的,的,最近最近的,的,未配对未配对的的if if配对!配对!例:例:if(if(表达式表达式1) 1) if( if(表达式表达式2) 2) 语句语句1 1elseelse if( if(表达式表达式3) 3) 语句语句2 2else else 语句语句3 3例:例:if(if(表达式表达式1) 1) if(if(表达式表达式2) 2) 语句语句1 1 elseelse if( if(表达式表达式3) 3) 语句语句2 2else else 语句语句3 3注意:注意:可以加可以加花括号花

16、括号来确定来确定if if和和elseelse的配对关系!的配对关系! -1 (x0)-1 (x0) 1 (x0)值,输出值,输出y y值。值。 算法算法1 1: 输入输入x x 若若x0,x0,x0,则则y=1y=1输出输出y y #include#includevoid main()void main() int x,y;int x,y;scanf(%d,&x);scanf(%d,&x);if(x0) y=-1;if(x0) y=1;if(x0) y=1;printf(x=%d,y=%dn,x,y);printf(x=%d,y=%dn,x,y); 算法算法2 2: 输入输入

17、x x 若若x0,x0,则则y=-1y=-1 否则:否则: 若若x=0,x=0,则则y=0y=0 否则:否则:y=1y=1 输出输出y y#include#includevoid main()void main() int x,y;int x,y;scanf(%d,&x);scanf(%d,&x);if(x0) y=-1;if(x=0 x=0表示表示x0 x0请判断上例中的如下程序段是否正确请判断上例中的如下程序段是否正确程序程序1 1:if(x=0)if(x=0) if(x0) y=1; if(x0) y=1; else y=0; else y=0;else y=-1;els

18、e y=-1;程序程序2: 2:y=0;y=0;if(x=0)if(x=0) if(x0) y=1; if(x0) y=1;else y=-1;else y=-1; 三、条件运算符三、条件运算符n条件运算符:条件运算符: ?: ?: n条件表达式的格式:条件表达式的格式: 表达式表达式1 1? ?表达式表达式2 2: :表达式表达式3 3n执行过程:执行过程: n使用场合:使用场合:若在若在if if语句中,当被判别的表达式的值语句中,当被判别的表达式的值为真或假时,都执行向为真或假时,都执行向同一个变量的赋值同一个变量的赋值语句时,语句时,可以用一个条件运算符来处理。可以用一个条件运算符来处

19、理。/ /* *C C中唯一的三目运算符中唯一的三目运算符* */ /, ,求解求解表达式表达式3 3,表达式表达式3 3的值的值作为整个作为整个条件表达式的值条件表达式的值。求解求解表达式表达式1 1非非( (真真) ) , ,求解求解表达式表达式2 2,表达式表达式2 2的值的值作为整个作为整个条件表达式的值条件表达式的值。(假假)例:例: if(ab) max=a;if(ab) max=a; else max=b; else max=b;maxmax = = (ab)(ab)? ?a a: :b; b;等价于等价于说明:说明:(1)(1)条件运算符优先级为条件运算符优先级为1313,高于

20、赋值运算符和逗号运,高于赋值运算符和逗号运算符,低于关系运算符、逻辑运算符和算术运算符。算符,低于关系运算符、逻辑运算符和算术运算符。 (2)(2)条件运算符的结合性为条件运算符的结合性为右结合性右结合性(自右至左自右至左)。)。 例如例如:abab? ?a a: :cdcd? ?c c: :d dabab? ?a a:( :(cdcd? ?c c: :d d) )等价于等价于例例5.4 5.4 输入一个字符,判别它是否大写字母,如果输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。然后输出最后得到

21、的字符。 #include #include void main ( ) void main ( ) char ch;char ch;scanf(%c,&ch);scanf(%c,&ch); / /* * ch=getchar(); ch=getchar(); * */ /if(ch=A&ch=A&ch=A&ch=A&ch=Z)? ?(ch+32)(ch+32): :chch; ;运行结果:运行结果:F Ff fPress any key to continuePress any key to continue运行结果:运行结果:? ? ?Pre

22、ss any key to continuePress any key to continue5.4 switch5.4 switch语句语句nswitchswitch语句亦称语句亦称开关语句开关语句或或多分支选择语句多分支选择语句。nswitchswitch语句的格式:语句的格式: switchswitch( (表达式表达式) ) case case 常量表达式常量表达式1 1:语句:语句1 1 case case 常量表达式常量表达式2 2:语句:语句2 2 case case 常量表达式常量表达式n n:语句:语句n n default default:语句:语句n+1n+1 值可以是值

23、可以是整型整型、字字符型符型或或枚举型枚举型常量表达式常量表达式i i必须与必须与表达式表达式的的类类型一致型一致( (整型和字符型通用整型和字符型通用) )执行过程:执行过程:计算表达式的值计算表达式的值若与若与常量表达式常量表达式i i的值一的值一致,则从致,则从语句语句i i开始执行,开始执行,直到遇到直到遇到breakbreak语句或遇到语句或遇到SwitchSwitch语句的语句的“ ”若与所有常量表达式的若与所有常量表达式的值都不一致,则执行值都不一致,则执行defaultdefault后的语句。后的语句。switch(x)switch(x) case 1: printf(stat

24、ement 1n); case 1: printf(statement 1n); case 2: printf(statement 2n); case 2: printf(statement 2n); case 3: printf(statement 3n); case 3: printf(statement 3n); case 4: printf(statement 4n); case 4: printf(statement 4n); default: printf(defaultn); default: printf(defaultn); 例如:例如:若若x x值为值为3 3,则结果为:,

25、则结果为:statement 3statement 3statement 4statement 4defaultdefaultbreak;break;break;break;break;break;break;break;break;break;若若x x值为值为3 3,则结果为:,则结果为:statement 3statement 3defaultdefault后的后的breakbreak可省略可省略可不用花括号可不用花括号说明:说明:n每一个每一个casecase的的常量表达式的值必须互不相同。常量表达式的值必须互不相同。n常量表达式常量表达式仅起仅起语句标号语句标号作用,作用,不作求值判

26、断。不作求值判断。n在执行一个在执行一个casecase分支后分支后, ,可以用一个可以用一个breakbreak语句语句来终来终止止本层本层switchswitch语句语句的执行。的执行。nd default efault 语句可以省略。语句可以省略。n多个多个casecase可以共用一组执行语句。可以共用一组执行语句。 switch(a)switch(a) case 1: case 1: case 2: printf(a=1 or 2n); case 2: printf(a=1 or 2n); break;break; default: printf(defaultn); default:

27、 printf(defaultn); 例题:输入一百分制成绩,要求输出成绩等级例题:输入一百分制成绩,要求输出成绩等级AA、BB、CC、DD、EE。9090分以上为分以上为AA,80898089.5 .5分分为为BB,70797079.5 .5分为分为CC,60696069.5 .5分为分为DD,6060分分以下为以下为EE。n分析:分析:设成绩变量为设成绩变量为floatfloat型型scorescore,等级变量为,等级变量为charchar型型gradegrade。 grade=grade=AA ,score90score90BB ,8080score90score90C C ,7070

28、score80score80D D ,6060score70score70E E ,score60score60用用if if语句实现语句实现#include #include void main() void main() float float score; score; charchar grade; grade; scanf(%f, scanf(%f,& &score); score); /输入学生成绩输入学生成绩 if( score=90 ) grade=A;if( score=90 ) grade=A; else if( score=80 ) grade=B; el

29、se if( score=80 ) grade=B; else if( score=70 ) grade=C; else if( score=70 ) grade=C; else if( score=60 ) grade=D; else if( score=60 ) grade=D; else grade=E; else grade=E; printf(score is printf(score is %5.1f%5.1f, grade is , grade is %c%c.n,score,grade); .n,score,grade); 用用switchswitch语句实现语句实现9 90

30、0分以上分以上( (含含10100)grade=0)grade=AA8 8008 89 9.5 .5分分grade=grade=BB7 7007 79 9.5 .5分分grade=grade=CC6 6006 69 9.5 .5分分grade=grade=DD6060分以下分以下grade=grade=EE如何提取如何提取scorescore的的十位数十位数? (int)score/10(int)score/10 switch( switch( (int)score/10(int)score/10 ) ) case 10:case 10: case 9: grade=A; case 9: gr

31、ade=A; break;break; case 8: grade=B; case 8: grade=B; break;break; case 7: grade=C; case 7: grade=C; break;break; case 6: grade=D; case 6: grade=D; break;break; default: grade=E; default: grade=E; 用用switchswitch语句实现语句实现#include #include void main() void main() floatfloat score; score; charchar grade

32、; grade; scanf(%f,&score); scanf(%f,&score); /输入学生成绩输入学生成绩 switch( switch( (int)score/10(int)score/10 ) ) case 10:case 10: case 9: grade=A; case 9: grade=A; break;break; case 8: grade=B; case 8: grade=B; break;break; case 7: grade=C; case 7: grade=C; break;break; case 6: grade=D; case 6: gra

33、de=D; break;break; default: grade=E; default: grade=E; printf(score is %5.1f, grade is %c.n,score,grade); printf(score is %5.1f, grade is %c.n,score,grade); 5.5 5.5 程序举例程序举例例例5.5 5.5 写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。闰年的条件:闰年的条件:能被能被4 4整除,但不能被整除,但不能被100100整除整除 或者或者 能被能被400400整除整除。#include #include void ma

34、in()void main() intint year, leap; year, leap; scanf( scanf(%d%d,&year);,&year); if (year%4=0)if (year%4=0) if (year%100=0)if (year%100=0) if (year%400=0) leap=1; if (year%400=0) leap=1; else leap=0; else leap=0; else leap=1; else leap=1; else leap=0; else leap=0; if (leap) if (leap)printf(%

35、d is a leap year.n,year);printf(%d is a leap year.n,year); else printf(%d is not a leap year.n,year); else printf(%d is not a leap year.n,year); if (if (year%4=0year%4=0&year%100!=0year%100!=0|year%400=0year%400=0) )leap=1;leap=1;else else leap=0;leap=0;运行结果:运行结果:198719871987 is not a leap year.

36、1987 is not a leap year.Press any key to continuePress any key to continue运行结果:运行结果:198819881988 is a leap year.1988 is a leap year.Press any key to continuePress any key to continue例例5.7 5.7 运输公司对用户计算运费。运输公司对用户计算运费。路程路程(s)(s)越远,每吨每公里运费越低。标准如下:越远,每吨每公里运费越低。标准如下: s250km s250km,没有折扣,没有折扣250250s500kms5

37、00km,2%2%折扣折扣500500s1000kms1000km,5%5%折扣折扣10001000s2000kms2000km,8%8%折扣折扣20002000s3000kms3000km,10%10%折扣折扣3000kms3000kms,15%15%折扣折扣设每公里每吨货物的基本运费为设每公里每吨货物的基本运费为p p,货物重为,货物重为w w,距离为距离为s s,折扣为,折扣为d d,则总运费,则总运费f f的计算公式为:的计算公式为: f fp p* *w w* *s s* *(1 (1d) d) #include #include void main ( )void main ( )

38、 int s;int s;float p,w,d,f;float p,w,d,f;printf(printf(请输入单价、重量和路程:请输入单价、重量和路程:););scanf(%f,%f,%d,&p,&w,&s);scanf(%f,%f,%d,&p,&w,&s);if( s250 ) d=0;if( s250 ) d=0;else if( s500 ) d=0.02;else if( s500 ) d=0.02; else if( s1000 ) d=0.05; else if( s1000 ) d=0.05; else if( s2000 ) d=0.08; else if( s2000 ) d=0.08; else if( s3000 ) d=0.1; else if( s3000 ) d=0.1; else d=0.15; else d=0.15;f=pf=p* *w w* *s s* *(1-d);(1-d);printf(freight=%15.4fn,f);printf(freight=%15.4fn,f); 用用if if语语句句实实现现运行结果:运行结果:请输入单价、重量和路程:请输入单价、重量和路程:20,20,40020,20,400freight=freight=156800.0001156

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论