C语言程序设计教程(第2版)课件第5章_第1页
C语言程序设计教程(第2版)课件第5章_第2页
C语言程序设计教程(第2版)课件第5章_第3页
C语言程序设计教程(第2版)课件第5章_第4页
C语言程序设计教程(第2版)课件第5章_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、第第5 5章章 选择结构选择结构本章要点本章要点关系运算符与关系表达式关系运算符与关系表达式逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式条件运算符与条件表达式条件运算符与条件表达式ifif语句语句switchswitch语句语句本章难点本章难点ifif语句的嵌套语句的嵌套switchswitch语句的使用语句的使用 5.1 关系运算符和关系表达式 6 种关系运算符种关系运算符: (小于)(小于) (小于或等于)(小于或等于) (大于)(大于) (大于或等于)(大于或等于) (等于)(等于) ! (不等于)(不等于) 5.1.1 关系运算符关系运算符优先级相同(高)优先级相同(低)结合性结合性:

2、自左向右:自左向右 关系运算符的优先次序关系运算符的优先次序 与其它运算符优先级的比较与其它运算符优先级的比较:算术运算符算术运算符关系运算符关系运算符赋值运算符赋值运算符(高)(高)(低)(低)例如: c=da+b等效于:c=(d(a+b)1. 什么是关系表达式?什么是关系表达式?5.1.2 关系表达式关系表达式如:(ab)(bc) 、ay 、s+fd2. 关系表达式的值关系表达式的值运算结果运算结果 逻辑值逻辑值 1“真真” ,0“假假”如:如: 设设 a=3, b=2, c=1 求下面关系表达式求下面关系表达式 的值:的值: cb (a-b) = = 1 b+ca值为值为值为值为值为值为

3、如果关系运算对象的类型不同,也要先进行类型转换如果关系运算对象的类型不同,也要先进行类型转换。关系表达式的应用。关系表达式的应用。main()char c=k;int i=4,j=2,k=5;float x=3e+5,y=7.56;printf(“%d,%dn”,a+3=k+1);printf(“%d,%dn”,i+j=-3*j,k=j=i+7);printf(“%d,%dn”,xa+b&ab等效于: c=(d(a+b)&(ab)1. 什么是逻辑表达式?什么是逻辑表达式?5.2.2 逻辑表达式逻辑表达式用逻辑运算符将逻辑运算对象连结起来的式子用逻辑运算符将逻辑运算对象连结起来的

4、式子。如:(ab)&(bb 2. 逻辑表达式的值逻辑表达式的值运算结果运算结果 逻辑值逻辑值(只有假为只有假为0、真为、真为1两种取值两种取值)如:如: 53 & 2 | 84 b&d值为值为 1值为值为运算对象运算对象 以以数值非数值非0为真、为真、0为假为假注意事项:注意事项:(1)代数式不等式代数式不等式0 x0)&(x5),而不能直接写成而不能直接写成0 x y ) z = x;2. 双分子语句双分子语句if (表达式表达式) 语句语句1 else 语句语句2 执行过程: 当表达式的值为“真”(非零)时,执行语句1,否则,执行语句2。如如: if (xy

5、) z=x ; else z=y ;3. 多分子语句多分子语句if (表达式表达式1) 语句语句1 else if(表达式表达式2) 语句语句2 else if(表达式表达式3) 语句语句3 : else if(表达式表达式m) 语句语句m else 语句语句n如:if (grade=85) level=A; else if (grade=70) level=B; else if (grade=60) level=C; else level=D; if 语句说明:语句说明: if后面的表达式一般为逻辑表达式或关系表后面的表达式一般为逻辑表达式或关系表 达式,也可以是任意数值类型表达式。达式,也

6、可以是任意数值类型表达式。该语句是合法的:if(3) printf(“ok!”); if 语句中的语句中的“语句语句”为一个简单语句或复合语句。为一个简单语句或复合语句。 如:下面程序段是否有错?if (x=0) printf(“X is positive.”); x+;else printf(“X is negative.”);if (x=0) printf(“X is positive.”); x+;else printf(“X is negative.”);4. if 语句的嵌套语句的嵌套 在 if 语句中又包含一个或多个if 语句称为 if 语句的嵌套语句的嵌套。 一般形式:if (条

7、件1) if (条件2)语句1 else 语句2else if (条件3)语句3 else 语句4内嵌if内嵌if如:if(x0) if(y0) printf(x0,y0); else printf(“x0,y0) printf(“x0); else printf(“x=0, y6) if (n12) printf(“6n12”);else printf(“n6) if (n12) printf(“6n12”);else printf(“n=6”); 缩缩 排排 #inclde main() int x; scanf(“%d”,&x); if (x0) printf(“X is pos

8、itive.”); x=x+1; else printf (“X is negative.”); 缩进缩进缩进用用if 语句实现选择结构举例语句实现选择结构举例 -1 ;x0 main( ) int x,y; scanf(%d,&x); if(x0) y=-1; else if(x= =0) y=0; else y=1; printf(x=%d y=%d,x,y);例例 : 托运行李计费。用托运行李计费。用f代表收费,代表收费,w代表重量,并将它们定义代表重量,并将它们定义成实型数。则有关系成实型数。则有关系: w*0.205 (0=w=50) f = w*0.313 (50w200)

9、main()float f,m;printf(“input weight:”);scanf(“%f”,&w);if(w200)f=(w-120)*0.413+10*0.23;else if(w50)f= w*0.313;else f= w*0.205;printf(“w=%f,f=%fn,w,f);5.3.2 条件运算符条件运算符1.条件运算符与条件表达式条件运算符与条件表达式条件表达式的一般形式条件表达式的一般形式:表达式1 ? 表达式2 表达式3如:如:max= (ab) ? a : b ; 若若 a=3, b=2, 则则 max=?如: (ab) ? a : b 目的目的 简化

10、if 语句。 if (ab) max=a; else max=b;等效于:条件运算符的优先级:条件运算符的优先级: 算数运算符算数运算符=关系运算符关系运算符=逻辑运算符逻辑运算符(除!除!) 赋值运算符赋值运算符c & cd ? a+b : d 等效于等效于: x = (a+b)c) & (cd) ? (a+b) : d) 条件运算符的结合方向条件运算符的结合方向: 自右至左自右至左 如:如:ab ? a : cd ? c : d等效于:等效于:ab ? a : (cd ? c : d)2.条件表达式与条件表达式与if语句的比较语句的比较 当当if语句中嵌套的语句是赋值语句,

11、而且语句中嵌套的语句是赋值语句,而且两个分支都给同一个变量赋值时,条件表达式两个分支都给同一个变量赋值时,条件表达式能替代能替代if 语句语句 。 如下面的写法是错误的:如下面的写法是错误的: a0?printf(“abs(a)=%dn”,a):printf(“abs(a)=%dn”,(-1)*a); 此语句的本意是:此语句的本意是:if(a0)printf(“abs(a)=%dn”,a);elseprintf(“abs(a)=%dn”,(-1)*a);可以改写为:可以改写为:printf(“abs(a)=%dn”,a0?a:(-1)*a);例:把输入字符中的小写字符转换成大写并输出例:把输入

12、字符中的小写字符转换成大写并输出 。#include main() char ch; scanf(%c,&ch); ch=(ch=a &chb) ? a : b ; max=(tc) ? t : c ; printf(max=%dn,max); 5.3.3 switch 5.3.3 switch 语句语句一般形式:一般形式:switch(表达式)(表达式) case 常量表达式常量表达式1:语句序列:语句序列1 case 常量表达式常量表达式2:语句序列:语句序列2 break; : case 常量表达式常量表达式n:语句序列:语句序列n break; default :语句序

13、列:语句序列n+1 此处break用于退出switch语句break;执行过程:执行过程:例如:例如: switch(grade) case A : printf(“85100 ”); case B : printf(“7084 ”); case C: printf(“6069 ”); case D :printf(“60 ”); default : printf(“error ”); 若若grade = A,输出结果是什么?,输出结果是什么?85100 7084 6069 60 error 用用break语句处理后的程序段:语句处理后的程序段: switch(grade) case A :

14、printf(“85100 ”); break; case B : printf(“7084 ”); break; case C : printf(“6069 ”); break; case D : printf(“60 ”); break; default : printf(“error ”); 若若gread= A,输出结果又是什么?,输出结果又是什么?85100完整程序完整程序 :main() char grade; printf(“Input grade(A,B,C,D):”); scanf(“%c”,&grade); switch(grade) caseA : printf(

15、“85100 ”); break; case B : printf(“7084 ”); break; case C : printf(“6069 ”); break; case D : printf(“60 ”); break; default : printf(“error !”); 流程图为: grade输出 “85100”输出 “60”输出 “60-69”输出 “error”输出 “70-84”5.3.4 5.3.4 标号语句和标号语句和gotogoto标号语句一般形式:标号语句一般形式:语句标号:语句语句标号:语句例如:例如:end:,该标志符就成了语句标号,但标号不能用数值表该标志符

16、就成了语句标号,但标号不能用数值表示,例如:示,例如:12:,:,3:,:,5:都是错误的。标号可以与变量同:都是错误的。标号可以与变量同名。名。 goto语句一般形式:语句一般形式:goto 语句标号;语句标号; goto语句的作用是使程序改变原来的执行顺序,语句的作用是使程序改变原来的执行顺序,而跳到指定的语句上执行。而跳到指定的语句上执行。 例如:例如:goto sd; sd:printf(“this is a cat!n”);说明: C语言允许在任何语句前加一个语句标号,作语言允许在任何语句前加一个语句标号,作为为goto语句的目标。给语句加标号的形式:语句的目标。给语句加标号的形式:

17、 语句标号:语句语句标号:语句 goto语句是一种非结构化语句,结构化程语句是一种非结构化语句,结构化程序设计方法不提倡使用序设计方法不提倡使用goto语句,因为滥用语句,因为滥用goto语句将使程序流程无规律,可读性差。但语句将使程序流程无规律,可读性差。但也不是绝对禁止使用,只有在能够大大提高程也不是绝对禁止使用,只有在能够大大提高程序效率时才使用。序效率时才使用。且记:不要从循环体外跳到循环体内且记:不要从循环体外跳到循环体内!main() int i,sum=0;i=1; loop: if(i100)sum=sum+1;i+;goto loop;printf(“%d”,sum);一、例

18、一、例 用用if 语句和语句和goto语句构成循环求语句构成循环求 1+2+3+100。二、用二、用goto语句和语句和 if 语句语句构成循环构成循环计算计算10!并输出结果。!并输出结果。 main() int i=1, sum=1;loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%dn”,sum); 运行结果:10!=24320本应是:10!=3628800 main() int i=1; long sum=1;loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%ldn”

19、,sum); 5.4 5.4 选择结构程序设计举例选择结构程序设计举例例例 写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。设:设:leap代表闰年信息,代表闰年信息,leap=1闰年,闰年,leap=0 非闰年非闰年不能被4整除非闰年被4整除,但不能被100整除闰年被100整除,又能被400整除闰年其他,非闰年非闰年main( ) int year, leap=0; scanf(“%d”, &year); /* 输入年份值 */ if (year%4= =0&year%100!=0)|(year%400= =0) leap=1; else leap=0; if(lea

20、p= =1) printf(“%d is leap ”, year); else printf(“%d is not leap ”, year); main( ) int year, leap=0; scanf(“%d”, &year); /* 输入年份值 */ if(year%4 != 0) leap=0; else if(year%100 != 0) leap=1; else if(year%400 != 0) leap=0; else leap=1; if(leap= =1) printf(“%d is leap ”, year); else printf(“%d is not

21、leap ”, year); 例例 已知基本运费、货重,以及路程已知基本运费、货重,以及路程(s)和折扣的关和折扣的关系标准如下:系标准如下: s250km 没有折扣 250s500 %2折扣 500s1000 5%折扣 1000s2000 8%折扣 2000s=3000) c=12; else c= s / 250; /* 按按250分类分类 */ switch( c ) case 0: d=0 ; break ; /* s250 */ case 1: d=2 ; break ; /*250s500*/ case 2: /*500s750*/ case 3: d=5; break; /*75

22、0s1000*/ case 4: /*1000s1250*/ case 5: /*1250s1500*/ case 6: /*1500s1750*/ case7: d=8 ; break ; /*1750s2000*/ case8: /*2000s2250*/ case9: /*2250s2500*/ case10: /*2500s2750*/ case11: d=10 ; break; /*2750s=3000) d=15; else if (s=2000&s=1000&s=500&s=250&s0, 有两个不相等的实根有两个不相等的实根 4、b2-4ac0,

23、 有两个共轭复根有两个共轭复根 5、如何判断实数为零(或大于零,或小于零)、如何判断实数为零(或大于零,或小于零) 特殊条件的处理特殊条件的处理#includemain() else if( disc1e-6) float a,b,c,d,disc,x1,x2,realpart,imapart; x1=(-b+sqrt(disc)/(2*a); scanf(“%f,%f,%f”,&a,&b,&c); x2=(-b-sqrt(disc)/(2*a); printf(“The equation ”); if(fabs(a)=1e-6) else printf(“is not

24、 a quadratic”) ; realpart=-b/(2*a); else imagpart=sqrt(-disc)/(2*a); disc=b*b-4*a*c; printf(“has complex roots:n”) ; if(fabs(disc)=1e-6) 打印虚根; printf(“has two equal roots: %7.4fn”,-b/(2*a); 有问题吗?有问题吗?习题习题 给一个不多于给一个不多于5位的正整数位的正整数,要求要求:求出它是几位数求出它是几位数;分分别打印出每一位数字别打印出每一位数字;按逆序打印出各位数字按逆序打印出各位数字,例如原数为例如原数

25、为321,应输出应输出123。 #include main() long int num; int n1,n2,n3,n4,n5,bits; scanf(“%ld”,&num); if (num9999) bits=5 else if (num999) bits=4; else if(num99) bits=3; else if(num9) bits=2; else bits=1; printf(“bits=%dn”,bits); n5=num/10000; n4= (int)(num-n5*10000)/1000; n3=(int)(num- n5*10000- n4*1000)/1

26、00; n2=(int)(num- n5*10000- n4*1000- n3*100)/10; n1=(int)(num-n5*10000-n4*1000-n3*100- n2*10); switch(bits) case 5:printf(“Every bit is:%d,%d,%d,%d,%dn”, n5,n4,n3,n2,n1); printf(“Reverse is: %d,%d,%d,%d,%dn”, n1,n2,n3,n4, n5); break; case 4: printf(“Every bit is: %d,%d,%d,%dn”, n4,n3,n2,n1); printf(

27、“Reverse is: %d,%d,%d,%dn”, n1,n2,n3,n4); break; case 3: printf(“Every bit is: %d,%d,%dn”, n3,n2,n1); printf(“Reverse is: %d,%d,%dn”, n1,n2,n3); break; case 2: printf(“Every bit is: %d,%dn”, n2,n1); printf(“Reverse is:%d,%dn”, n1,n2); break; case1: printf(“Bit is: %dn”, n1); printf(“Reverse is: %dn”, n1); 运行情况:运行情况:12345 Inputbits=5Every bit is: 1,2,3,4,5Reverse is: 5,4,3,2,1Outpu

温馨提示

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

评论

0/150

提交评论