第5章选择分支结构--C语言程序设计(谭浩强第三版)_第1页
第5章选择分支结构--C语言程序设计(谭浩强第三版)_第2页
第5章选择分支结构--C语言程序设计(谭浩强第三版)_第3页
第5章选择分支结构--C语言程序设计(谭浩强第三版)_第4页
第5章选择分支结构--C语言程序设计(谭浩强第三版)_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 选择结构程序设计v 关系运算符和关系表达式关系运算符和关系表达式v 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式v ifif语句语句v switchswitch语句语句v 程序举例程序举例引例:1/x 1/x 当当x0 x0时时 10000 10000 当当x=0 x=0时时y=y= 选择结构是3种基本结构之一,经常牵涉到:根据所指定的条件是否相同,从两组(或多组)操作中选择其一。 要考虑两个方面的问题:1、C语言中如何表示条件? 一般用关系表达式或逻辑表达式2、C语言中实现选择结构用什么语句?用if语句或switch语句。if(x!=0) y=1/x;if(x!=0) y=1/x;e

2、lse y=10000;else y=10000;此处:用if语句来表示选择结构 用一个关系表达式x!=0来表示条件5.1 关系运算符和表达式1 1、关系运算: 实质是两个量“比较运算”。2、关系运算符 : 种类:6种 = !=结合方向:自左向右优先级别:前4种优先级相同,高于后2种 由高到低:算术运算关系运算赋值运算=!=优先级6(高)优先级7(低)例例 ca+b c(a+b)ca+b c(a+b) ab!=c (ab)!=c ab!=c (ab)!=c a=bc a=(bc) a=bc a=(bc a=(bc) a=bc a=(bc)算术运算符算术运算符赋值运算符赋值运算符关系运算符关系运

3、算符高高低低/表达式值1/表达式值1/表达式值0/ab值为1,所以d=1/ab为1, abc为0,所以f=0例 int a=3,b=2,c=1,d,f; ab (ab)=c b+cb f=abc3、关系表达式:用用关系运算符关系运算符将将两个表达式两个表达式连接起来式子。连接起来式子。4 4、关系表达式的值:是逻辑值“真”或“假”,用1和0表示1 结果为真 (关系成立)0 结果为假 (关系不成立)注意:其中“= =”表示相等,而 “=”表示赋值(1)关系运算符左右两边类型不一致,自动进行类型转换,转换成两边的类型相同,然后进行比较。 例如:若a=0,b=0.5,转换成a=0.0,则 a=b的值

4、为1 (2) 应避免对实数作相等或不等的判断,而只能使用“”,原因在于舍入误差可能造成两个逻辑上应该相等的数不相等。 例如:如果x、y均为实数,要避免使用 x=y 应使用 fabs(x-y)b&bc+3 x=( (!a)b)&(b(c+3)x= !ab&bc+3 x=( (!a)b)&(b(c+3) )2、逻辑表达式和逻辑表达式的值(1)逻辑表达式:用逻辑运算符将关系表达式、逻辑量连接起来的式子。 例如: !a&bxy & c(2)逻辑表达式的值:1或0,表示逻辑值“真”或“假”例 a=4;b=5; !a a&b a|b !a|b 4&a

5、mp;0|2 53&83)&(8b)&(n=cd) 判断m,n的值 :结果m=0,n=1,表达式为0例如: a&b&c 当a=0(假)时, b,c不需判断。 当a=1,b=0, c不需判断。例如: a b c 当a=1时, b, c均不必判别。1&0逻辑值为083逻辑值为1(53)&(8y) printf( %d, x) ;形式1: if(表达式) 语句5.3 if语句(三种形式三种形式)表达式语句非0=01.if语句的三种基本形式表达式的值:1 结果为真 (条件成立)0 结果为假 (条件不成立)例2 输入两个实数,按其值由小到大次序输出

6、这两个数。表达式表达式语句语句非0=0 main( ) float a, b, t; scanf (%f, %f, &a, &b); if (ab) t=a; a=b; b=t; printf (%5.2f, %5.2f, a, b); 形式1: if(表达式) 语句1.if语句的三种基本形式例例3 输入三个数,按从小到大的顺序输出。输入三个数,按从小到大的顺序输出。 表达式表达式语句语句非0=0main ( )float a, b, c,t; scanf(“ %f,%f,%f”, &a, &b,&c); if (ab) t=a; a=b; b=t; i

7、f (ac) t=a; a=c; c=t; if (bc) t=b; b=c; c=t; printf(%5.2f, %5.2f, %5.2f, a, b, c);形式形式1: if(表达式表达式) 语句语句1.if语句的三种基本形式例如例如: if(xy) printf(%d, x);else printf( %d, y);表达式表达式语句语句1语句语句2非0=0执行过程执行过程: 当表达式当表达式值值为非为非0, 执行语句执行语句1; 当当表达式表达式值值为为0, 执行语句执行语句2。形式形式2: if(表达式表达式) 语句语句1 else 语句语句21.if语句的三种基本形式表达式表达式

8、语句语句1语句语句2非0=0例4 输入一个数,判断它是否能被3整除。 若能,则打印“YES”, 否则,打印“NO”。形式形式2: if(表达式表达式) 语句语句1 else 语句语句2 main( ) int n; printf(“input n: ”); scanf(“%d”,&n); if (n%3=0) printf(“YESn”); else printf(“NOn”);1.if语句的三种基本形式执行过程执行过程: :从上向下逐一对从上向下逐一对if后面的表达式进行检测。后面的表达式进行检测。当某一个表达式的值为非当某一个表达式的值为非0时,就执行与此有关的子句中的时,就执行与

9、此有关的子句中的语句,其余部分就被越过去。语句,其余部分就被越过去。如果所有表达式的值都是如果所有表达式的值都是0,则执行最后的,则执行最后的else子句;子句;1) 如果没有最后的那个如果没有最后的那个else子句,那么,将不进行任何操作。子句,那么,将不进行任何操作。形式形式3:3:ifif(表达式表达式1) 语句语句1 else if (表达式表达式2) 语句语句2 else if (表达式表达式3) 语句语句3 else if(表达式表达式n) 语句语句n else 语句语句n+11.if语句的三种基本形式0表达式表达式1 表达式表达式2 表达式表达式n语句语句n+100语句语句n 语

10、句语句2 语句语句1 非非0 非非0 非非0 形式形式3:3:ifif(表达式表达式1) 语句语句1 else if (表达式表达式2) 语句语句2 else if (表达式表达式3) 语句语句3 else if(表达式表达式n) 语句语句n else 语句语句n+1例如:例如:if (number500) cost=0.15;else if (number300) cost=0.10;else if (number100) cost=0.075;else if (number50) cost=0.05;else costcost=0;0表达式表达式1 表达式表达式2 表达式表达式n语句语句n

11、+100语句语句n 语句语句2 语句语句1 非非0 非非0 非非0 1.if语句的三种基本形式形式形式3:if(表达式表达式1) 语句语句1 else if (表达式表达式2) 语句语句2 else if (表达式表达式3) 语句语句3 else if(表达式表达式n) 语句语句n else 语句语句n+1例例5:输入一个学生成绩,输入一个学生成绩,当成绩当成绩90时,输出时,输出 verygood,当当80成绩成绩90时时, 输出输出 good, 当当60成绩成绩80时时, 输出输出pass, 当成绩当成绩=90) printf(“very good);else if (score=80)

12、printf(“good);else if (score=60) printf(“pass);else printf(“fail);1.if语句的三种基本形式0表达式表达式1 表达式表达式2 表达式表达式n语句语句n+100语句语句n 语句语句2 语句语句1 非非0 非非0 非非0 例例6:输入一个字符,请:输入一个字符,请判断是字母、数字还判断是字母、数字还是特殊字符。是特殊字符。#include main( ) char ch; printf(Please input a character:n); ch=getchar( ); if(ch=a&ch=A&ch=0&

13、chb) if (3) if (a+88) 1. 表达式可以是逻辑表达式、关系表达式、算术表达式。表达式可以是逻辑表达式、关系表达式、算术表达式。 2. 语句必须以分号结束。语句必须以分号结束。 3. 若语句不止一条若语句不止一条,则必须用则必须用 括起来。在括起来。在 外不加分外不加分号。号。注意的问题注意的问题5.3 if语句语句2、if语句的嵌套语句的嵌套: 在在if语句中语句中, 又又包含一个或多个包含一个或多个if语句语句。if (表达式1) if (表达式2) 语句1 else 语句2else if(表达式3) 语句3 else 语句4内嵌if内嵌ifif (表达式1) if (表

14、达式2) 语句1 else 语句2内嵌ifif (表达式1) if (表达式2) 语句1else 语句3 内嵌ifif (表达式1) 语句1else if(表达式3) 语句3 else 语句4内嵌if5.3 5.3 ifif语句(语句(三种形式三种形式)2、if语句的嵌套语句的嵌套if (表达式1) if (表达式2) 语句1else 语句3 内嵌ifif else 配对原则:配对原则:缺省缺省 时,时,else总是和它上面离它总是和它上面离它最近最近的未配对的的未配对的if 配对。配对。if()if()if()else.else.else.if (表达式1) if (表达式2) 语句1els

15、e 语句3 内嵌if如果没有如果没有 时的配对时的配对2、if语句的嵌套语句的嵌套if else 配对原则配对原则修改:修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);实现实现if else 正确配对方法:必要时,加正确配对方法:必要时,加 例例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);例例7 7 有一函数有一函数: :y=1 (x0)编一程序,输入一个编一程序,输入一个x值,输出值,输出 y 值。值。有以下几种写法,请判断哪些是正确有以下几种写法,请判断哪

16、些是正确的?的?2、if语句的嵌套语句的嵌套程序程序2:将程序:将程序1的的if语句改为:语句改为: main ( ) int x, y; scanf(d, &x); if (x=0) if (x0) y=1; else y=0; else y=-1; printf (x=%d, y=%dn, x, y);程序程序1: main ( ) int x, y; scanf(d, &x); if (x=0) if(x0) y=1; else y=-1; printf(x=%d,y=%dn,x,y); 程序程序3:将程序将程序1的的if语句改为语句改为main( ) int x,y;

17、scanf(%d,&x); y=-1; if(x!=0) if(x0) y=1; else y=0; printf(x=%d,y=%dn,x,y);2、if语句的嵌套语句的嵌套y= 0 (x0)1. 程序程序1 和程序和程序2 是正确的。是正确的。 它们代表的函数为它们代表的函数为:2. 程序程序3 和程序和程序4 是错误的。是错误的。 它们代表的函数为它们代表的函数为:y= 0 (x0)y=1 (x0)结论:结论:5.3 if语句语句 C语言提供了一个简单的条件赋值语句或条件表达式。语言提供了一个简单的条件赋值语句或条件表达式。问题问题: 当判断条件不论是当判断条件不论是“真真”是是

18、“ 假假”, 均给同一变量赋值均给同一变量赋值时时简化条件语句简化条件语句 运算符书写方式:运算符书写方式: ? : 属三目运算符。属三目运算符。3、条件运算符、条件运算符5.3 if语句语句执行过程执行过程: 先求解表达式先求解表达式1, 若非若非0(真真),则值为表达式则值为表达式2的值的值, 否则,为表达式否则,为表达式3的值。的值。一般形式:一般形式:表达式表达式1 ? 表达式表达式2 : 表达式表达式3例如:例如:max=ab? a:b;当当ab, max a; 否则否则, maxb3、条件运算符、条件运算符表达式表达式1取取表达式表达式2值值取取表达式表达式3值值非0=05.3 i

19、f语句语句注意注意:条件运算符条件运算符优先于优先于赋值运算符。赋值运算符。 例如例如: max=(ab? a:b) 可去掉可去掉( )条件运算符条件运算符低于低于关系运算符和算术运算符。关系运算符和算术运算符。 例如例如: max=ab? a:b+1max= ab? a:(b+1) 而不是而不是 max=(ab? a:b)+1条件运算符结合性为条件运算符结合性为从右至左从右至左。 例如例如: ab? a:cd ? c:d 相当于相当于 ab? a:(cd? c:d)条件表达式不能取代一般的条件表达式不能取代一般的if语句语句,只有当只有当if 的两的两 个分支为个分支为给给同一变量同一变量赋

20、值时才可替代赋值时才可替代if. 例如例如:求求 y=a+|b| printf(“y=%dn”,b0?a+b:a-b);表达式表达式1、表达式、表达式2、表达式、表达式3的类型可以不同。的类型可以不同。 例如例如: xy? 1 : 1.53、条件运算符、条件运算符5.3 if语句语句3、条件运算符、条件运算符例例8 输入一个字符,判别它是否大写字母输入一个字符,判别它是否大写字母。 如果是,将它转换成小写字母;如果是,将它转换成小写字母; 如果不是,不转换。如果不是,不转换。 然后输出最后得到的字符。然后输出最后得到的字符。main ( ) char ch; scanf (%c, &c

21、h); ch=(ch=A & ch=Z ? (ch+32):ch; printf(%c, ch) 5.3 if语句语句switchswitch语句是语句是多分支选择语句多分支选择语句,也叫,也叫开关语句开关语句一般形式:一般形式: switch (表达式表达式) case常量表达式常量表达式1:语句语句 1 break; case常量表达式常量表达式2: 语句语句 2 break; case常量表达式常量表达式n:语句语句 n break; default: 语句语句 n+1 5.4 switch语句语句switch表达式语句1语句2语句n语句n+1式 1式2式ndefaultcase

22、 执行过程:执行过程:当表达式的值与某一个当表达式的值与某一个 case 后面的常量表达式后面的常量表达式的值相等时,就执行的值相等时,就执行此此 case 后面的语句。后面的语句。若所有的若所有的 case 中中的常量表达式的值都没有与表达式的值匹配,则执行的常量表达式的值都没有与表达式的值匹配,则执行 default 后面的语句。后面的语句。 例例9 9 根据成绩等级,打印出成绩范围。根据成绩等级,打印出成绩范围。5.4 switch语句语句main( ) char grade; printf(Enter your graden); scanf(%c,&grade); switch

23、(grade) case A: printf(“90100n); break; case B: printf(“8089n); break; case C: printf(“7079n); break; case D: printf(6069 n); break; case E: printf(60n); break; default: printf(errorn); 没有没有breakbreak将是将是错误的。错误的。例如输入例如输入B B,打,打印出:印出:80897079606960error注意注意:case:case常量表达式只起语句标号作用常量表达式只起语句标号作用; ; 必须用必

24、须用breakbreak语句终止多个语句终止多个casecase连续执行,否则只要有一连续执行,否则只要有一个个casecase满足后满足后, ,以下的语句全部无条件执行。除非以下的语句全部无条件执行。除非遇到遇到“ ”或或breakbreak语句来终止语句来终止switchswitch语句的执行。语句的执行。 例例10 10 根据成绩范围,打印出成绩等级。根据成绩范围,打印出成绩等级。5.4 switch语句语句main( ) int score,num; char grade; scanf(%d,&score); num=score/10; switch(num) case 10:

25、 case 9 : grade=A; break; case 8 : grade=B; break; case 7 : grade=C; break; case 6 : grade=D; break; default : grade=E; printf(%d %c,score,grade);鉴于上述原因,鉴于上述原因,2个或多个个或多个case可可以共用一组执行以共用一组执行语句语句1. 表达式的类型和常量表达式的类型必须一致;表达式的类型和常量表达式的类型必须一致;switchswitch后面后面的表达式一般情况下是的表达式一般情况下是整型整型或或字符型字符型。2. 每一个每一个 case

26、的常量表达式的值必须互不相同。的常量表达式的值必须互不相同。3. 多个多个case和和default的出现次序不影响执行结果。的出现次序不影响执行结果。4. case常量表达式只起语句标号作用常量表达式只起语句标号作用; 必须用必须用break语句终止多个语句终止多个case连续执行,连续执行, 否则只要有一个否则只要有一个case满足后满足后,以下的语句全部无条件执行。以下的语句全部无条件执行。 说明:说明:5.4 switch语句语句 main( ) int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+; break; ca

27、se 1: b+; break; case 2: a+;b+; break; case 3: a+;b+; printf(na=%d,b=%d,a,b); switch的嵌套的嵌套5.4 switch语句语句 5.5 5.5 程序举例程序举例例 写程序,判断某一年是否闰年。闰年的算法。用一个标志用一个标志leap代表闰年与否。代表闰年与否。leap=1,代表闰年,代表闰年,leap=0,代表,代表非闰年。非闰年。#include #include void main()void main() int year, leap; int year, leap; scanf(%d,&year)

28、; scanf(%d,&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(%d is a leap year.n ,year); printf(%d is a leap year.n ,year); else e

29、lse printf(%d is not a leap year.n ,year); printf(%d is not a leap year.n ,year); (!)(!) ; (!)(!) ; (!)!); ; 运行情况: . . if (year%4=0&year%100!=0)|year%400=0)if (year%4=0&year%100!=0)|year%400=0) 1 1; 0 0;例例 求求x x2 2方程的解。方程的解。基本的算法:基本的算法: ,不是二次方程。,不是二次方程。 b b2 2,有两个相等实根。,有两个相等实根。 b b2 2 ,有两个不等

30、实根。,有两个不等实根。 b b2 2 ,有两个共轭复根。,有两个共轭复根。#include #include void main ( ) float a,b,c,disc,x1,x2,realpart,imagpart; scanf(“%f,%f,%f”,&a,&b,&c); printf(“the equation ”); if(fabs(a)=1e-6) printf(“is not a quadraticn”); else disc=b*b-4*a*c; if(fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqr

31、t(disc)/(2*a); printf(has distinct real roots:%8.4f and %8.4fn,x1,x2); else realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf(has complex rootsn); printf(%8.4f+%8.4fin,realpart,imagpart); printf(%8.4f-%8.4fin,realpart,imagpart); 例 运输公司对用户计算运费。 路程()越远,每公里运费越低。标准如下: 没有折扣 折扣 折扣 折扣 折扣 1折扣 设每公里每吨货物的基本运费为,货物重为, 距离为,折扣为,则总运费的计算公式为: *() 分析:用if else分支方法,可以完成,但区间太多。 用switch,寻找合适的表达式以及对应的常量 分析折扣变化的规律性: 折扣的“变化点”都是的倍数,在横轴上加一种坐标,c的值为s/250。c代表250的倍数。 , 无折扣;

温馨提示

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

评论

0/150

提交评论