吉林大学《C语言程序设计基础》课程选择程序结构设计_第1页
吉林大学《C语言程序设计基础》课程选择程序结构设计_第2页
吉林大学《C语言程序设计基础》课程选择程序结构设计_第3页
吉林大学《C语言程序设计基础》课程选择程序结构设计_第4页
吉林大学《C语言程序设计基础》课程选择程序结构设计_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、C程序设计第5章 选择结构程序设计本章要点关系运算符和关系表达式逻辑运算符和逻辑表达式if语句switch语句程序举例5.1 关系运算符和关系表达式所谓“关系运算实际上是“比较运算。将两个值进行比较,判断比较的结果是否符合给定的条件。例如,a3是一个关系表达式。如果a的值为5,那么关系表达式的值为“真;如果a的值为2,不满足“a3条件,那么称关系表达式的值为“假。5.1.1 关系运算符及其优先次序 C语言提供6种关系运算符: (1) 小于 (2) 大于 (4) = 大于或等于 (5) = = 等于 (6) != 不等于优先级相同高优先级相同低优先次序:1前4种关系运算符的优先级别高于后两种。2

2、关系运算符的优先级低于算术运算符。3关系运算符的优先级高于赋值运算符。以上关系如图5-1所示。算术运算符关系运算符赋值运算符(高)(低)图5-1例如:ca+b 等效于c(a+b)a=bc等效于a=bc 等效于a=(bc)5.1.2 关系表达式用关系运算符将两个表达式可以是算术、关系、逻辑、赋值、字符表达式连接起来的式子,称关系表达式。关系表达式的值是一个逻辑值,即“真或“假。 例如: ab, a+bb+c, a(b=5), (ab)(by) 可写成ab&xy ( !a)|(ab) 可写成!a|ab5.2.2 逻辑表达式 用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑表达式的

3、值应该是一个逻辑量“真或“假。 逻辑值及其判断 C语言编译系统在给出逻辑运算结果时,以数值1代表“真,以0代表“假,但在判断一个量是否为“真时,以0代表“假,以非0代表“真。 例如:假设a=4,b=5。 !a 的值为0。 a&b 的值为1。 a|b 的值为1。 !a|b 的值为1。 4&0|2 的值为1。 说明:由系统给出的逻辑运算结果不是0就是1,不可能是其它数值。而在逻辑表达式中作为参加逻辑运算的运算对象操作数可以是0假或任何非0的数值真。 分析:53&2|84-!0注意: 在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运

4、算符。 1a&b&c 只有a为真时,才需要判别b的值,只有a和b都为真的情况下才需要判别c的值,见图5.3。图5-3(2)a|b|c 只要a为真,就不必判断b和c;只有a假,才判别b;a和b都为假才判别c,见图 如果有下面的逻辑表达式:(m=ab)&(n=cd) 当a=1,b=2,c=3,d=4,m和n的原值为1时,执行之后m=0,n=1。 图5-4 例:要判别某一年year是否闰年。闰年的条件是符合下面二者之一: 能被4整除,但不能被100整除。能被4整除,又能被400整除。 可以用一个逻辑表达式来表示:(year%4=0 & year%100!=0) | year%400=0 可以加一个“

5、!用来判别非闰年:!(year%4=0 & year%100!=0) | year%400=05.3 if语句 5.3.1 if语句的三种形式1.单分支形式 if(表达式) 语句 例如: if(xy) printf(“%d,x); 这种if语句的执行 过程见图5-5(a)。 0 表达式 语句1图5-5a 2双分支形式 if表达式) 语句1else 语句2 例如: if(xy) printf“d,x; else printf“d,y; 见图5-5b。语句1语句2真假图5-5b表达式3多分支形式 if(表达式1)语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 : :

6、 else if表达式m语句m else 语句n 流程图如图5-6。表达式1FT表达式3FT表达式2FT表达式4FT语句4语句5语句3语句2语句1图5-6例如: ifnumber500 cost=0.15; else ifnumber300 cost=0.10: else ifnumber100 cost=0.075; else ifnumber50 cost=0.05; else cost=0;说明: (1)假设表达式的值为0,按“假处理,假设表达式的值为非0,按“真处理。(2)在if和else后面可以有多个操作语句,此时用花括号“将几个语句括起来成为一个复合语句。例5.1 输入两个实数,按

7、代数值由小到大次序输出这两个数。void 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); abt运行情况如下:3.6,-3.2-3.20,3.60例5.2 输入3个数a,b,c,要求按由小到大的顺序输出。 void main() float a,b,c,t;scanf(“%f,%f,%f,&a,&b,&c); if(ab) t=a;a=b;b=t; if(ac) t=a;a=c;c=t; if(bc) t=b;b=c;c=t; printf(“%5.2f,%5.2f,%5.2f,

8、a,b,c);运行情况如下: 3.7,11.00,3.00,7.00 5.3.2 if 语句的嵌套一般形式如下: if( )if( )语句1else 语句2elseif( )语句3else 语句4应当注意if与else的配对关系。else总是与它上面的最近的if配对。 例 5.3 有一函数 -1 (x0) 编一程序,输入一个x值,输出y值。 有以下几种写法,请判断哪些是正确的? 程序1: main() int x,y;scanf(“%d,&x);if(x0) y=-1;else if(x=0) y=0;else y=1;printf(“x=%d,y=%dn, x,y);可以用流程图5-7来表示

9、。图5-7输入x开始x=0) if(x0)y=1; elsey=0; elsey=-1;见流程图5-8。 x0 x0y=0y=1y=-1YNYN图5-8程序3:将上述if语句改为:y=-1;if(x!=0)if(x0) y=1;else y=0;见流程图5-9可看出是错误的。 x0 x0y=0y=1YNYN图5-9y=-1 程序4:将上述if语句改为: y=0; if(x=0) if(x0) y=1; else y=-1;见流程图5-10可看出是错 误的。 x0 x0y=-1y=1y=0YNYN图5-105.3.3 条件运算符 假设有以下if语句 if(ab) max=a; else max=

10、b;可以用下面的条件运算符来处理: max=(ab)?a:b; 其中 ? 和 : 为条件运算符,有三个操作对象,称三目运算符。条件表达式的一般形式为:表达式1?表达式2:表达式3它的执行过程见图5-11。 图5-11表达式1条件表达式取表达式2的值真(1)条件表达式取表达式3的值假(0) 说明: 1条件运算符优于赋值运算符。低于关系和算术运算符。 例如: int a=5,b=6; max=(ab)?a:b 等价于max=ab?a:b 执行结果是将 a 和 b 两者中大的赋给 max。 ab?a:b+1 相当于 ab?a:(b+1) 2条件运算符的结合方向为“自右自左。 例如: ab?a:cd?

11、c:d 相当于 ab?a:(cd?c:d) 假设: a=1,b=2,c=3,d=4,那么表达式的值等于4。3条件表达式中,表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式。例如: ab?(a=100):(b=100) ab? printf(“%d,a):printf(“%d,b) 4表达式1,表达式2和表达式3的类型不同。 例如: xy?1:1.5 如果xy,值应为1,由于1.5是实型,比整型高,因此,将1转换成实型值1.0。例5.4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换,然后输出最后得到的字符。 main() char ch;

12、scanf(“%c,&ch); ch=(ch=A& ch=Z)?(ch+32):ch; printf(“%c,ch); 运行结果如下: A a5.4 switch语句 一般形式:switch(表达式) case 常量表达式1: 语句1 case 常量表达式2: 语句2 . . . case 常量表达式n: 语句ndefault : 语句n+1 例如: 根据考试成绩的等级打印出百分制分数段。switch(grade) caseA:printf(“85-100n);caseB:printf(“70-84n); caseC:printf(“60-69n); caseD:printf(“60n); d

13、efault:printf(“errorn); 说明:(1) switch后面括弧内的“表达式可以为任何类型。(2根据case后面的常量表达式来寻找入口。(3每一个case的常量表达式的值必须互不相同,否那么就会出现互相矛盾的现象。(4各个case和default的出现次序不影响执行结果。 (5执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式只是起语句标号作用,并不是在该处进行条件判断。 应该在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行。将上面的switch结构改写如下: switch(grade) case A:

14、printf(“85-100n);break; case B:printf(“70-84n); break; case C:printf(“60-69n); break; case D:printf(“60n); break; default:printf(“errorn); 流程图见图5.12所示。 输出7084输出6069输出60n); break;. 5.5 程序举例 例5.5 写程序,判断某一年是否闰年。 闰年的条件是符合下面二者之一: 能被4整除,但不能被100整除。 能被4整除,又能被400整除。 year40&year100 !=0|year400=0 用图5-13来表示判别闰年

15、的算法。图5-13 year被4整除真假year被100整除真假year被400整除真真假假leap=1leap=0leap=0leap=1leap输出“闰年”输出“非闰年” void main() int year,leap;scanf(“%d,&year);if(year%4=0)if(year%100=0)if(year%400=0)leap=1; else leap=0; else leap=1; else leap=0;if(leap) printf(“%d is,year);else printf(“%d is not,year); printf(“a leap yearn);运行

16、情况:19891989 is not a leap year20002000 is a leap year也可以将程序中第411行改写成以下的if语句: if(year%4!=0) leap=0;else if(year%100!=0) leap=1;else if(year%400!=0) leap=0;else leap=1;也可以用一个逻辑表达式包含所有的闰年条件,将上述if语句用下面的if语句代替:if(year%4=0 & year%100!=0)|(year%400=0) leap=1;else leap=0; 例 5.6 求ax2+bx+c=0方程的解。 求解时,应该有以下几种可

17、能: a=0,不是二次方程。 b2-4ac=0,有两个相等实根。 b2-4ac0,有两个不等实根。 b2-4ac0 输出“非二次” 方程输出两个相等实根:-b/2a输出两个实根 x1,x2输出两个复根: p+qi,p-qi计算复根的实部和虚部:实部 p=-b/2a图5-14虚部 #include “math.hmain()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 quadratic);elsedis

18、c=b*b-4*a*c;if(fabs(disc)1e-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); imagpart=sqrt(-disc)/(2*a); printf(“has complex roots:n); printf(“%8.4f+%8.4fin,realpart,imagpart); printf(“%8.4f-%8.4fin,realpart,imagpart); 运行结果如下:1,2,1The equation has two equalroots:-1.00001,2,2The equation has complex roots:-1.0000+1.0000i-1.0000-1.0000i2,6,1The equation has distinct real roots:-0.1771 and -2.8229 例5.7 运输公司对用户计算运费。距离(s)越远,每公里运费越低。标准如下: s250km 没有折扣 250 =s500 %2折扣 500 =s1000 %5折扣 1000=s2000

温馨提示

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

评论

0/150

提交评论