c语言程序设计(包云)第4章选择结构程序设计

上传人:san****019 文档编号:22741802 上传时间:2021-05-31 格式:PPT 页数:93 大小:1.31MB
收藏 版权申诉 举报 下载
c语言程序设计(包云)第4章选择结构程序设计_第1页
第1页 / 共93页
c语言程序设计(包云)第4章选择结构程序设计_第2页
第2页 / 共93页
c语言程序设计(包云)第4章选择结构程序设计_第3页
第3页 / 共93页
资源描述:

《c语言程序设计(包云)第4章选择结构程序设计》由会员分享,可在线阅读,更多相关《c语言程序设计(包云)第4章选择结构程序设计(93页珍藏版)》请在装配图网上搜索。

1、4.1 选择结构和条件判断4.2 用if语句实现选择结构4.3关系运算符和关系表达式4.4 逻辑运算符和逻辑表达式4.5 条件运算符和条件表达式4.6 选择结构的嵌套4.7 用switch语句实现多分支选择结构4.8选择结构程序综合举例 在现实生活中,需要进行判断和选择的情况是很多的u如果你在家,我去拜访你u如果考试不及格,要补考u如果遇到红灯,要停车等待u周末我们去郊游u70岁以上的老年人,入公园免票 在现实生活中,需要进行判断和选择的情况是很多的处理这些问题,关键在于进行条件判断由于程序处理问题的需要,在大多数程序中都会包含选择结构,需要在进行下一个操作之前先进行条件判断 C语言有两种选择

2、语句:(1)if语句,实现两个分支的选择结构(2)switch语句,实现多分支的选择结构 例4.1 在例3.5的基础上对程序进行改进。题目要求是求 方程的根。 由键盘输入a,b,c。假设a,b,c的值任意,并不保证 。需要在程序中进行判别,如果 ,就计算并输出方程的两个实根,否则就输出“方程无实根”的信息。 02 cbxax 042 acb 042 acb 解题思路:输入a,b,c计算discdisc0计算x1,x2输出无实根输出x 1,x2真假 #include #include int main ( ) double a,b,c,disc,x1,x2,p,q; scanf(%lf%lf%l

3、f, disc=b*b-4*a*c;计算b2-4ac,disc的值变为-15 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0; -150为真 #include #include int main ( ) double a,b,c,disc,x1,x2,p,q; scanf(%lf%lf%lf, disc=b*b-4*a*c;计算b2

4、-4ac,disc的值变为8 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0; 80为假p的值变为-1q的值变为0.71x1的值变为-0.29x2的值变为-1.71 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x

5、1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;选择结构,用if语句实现的 if (disc0) printf(“has not real rootsn”); else p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(“real roots:nx1=%7.2fn x2=%7.2fn”,x1,x2); return 0;复合语句 4.2.1 用if语句处理选择结构举例4.2.2 if语句的一般形式 例4.2 输入两个实数,按代数值

6、由小到大的顺序输出这两个数。 解题思路:u只需要做一次比较,然后进行一次交换即可u用if语句实现条件判断u关键是怎样实现两个变量值的互换A B互换前A B互换后 A BC A BC A BC #include int main() float a,b,t; scanf(%f,%f, if(ab) t=a; a=b; b=t; printf(%5.2f,%5.2fn,a,b); return 0;将a和b的值互换如果ab #include int main() float a,b,t; scanf(%f,%f, if(ab) t=a; a=b; b=t; printf(%5.2f,%5.2fn,

7、a,b); return 0;选择结构,用if语句实现的 例4.3 输入3个数a,b,c,要求按由小到大的顺序输出。解题思路:可以先用伪代码写出算法:uif ab,a和b对换 (a是a、b中的小者)uif ac,a和c对换 (a是三者中最小者)uif bc,b和c对换 (b是三者中次小者)u顺序输出a,b,c #include int main() float a,b,c,t; scanf(%f,%f,%f, 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.2fn,a

8、,b,c); return 0;如果 ab,将a和b对换a是a、b中的小者如果 ac,将a和c对换a是三者中的小者如果 bc,将b和c对换b是三者中的次小者 if (表达式) 语句1 else 语句2 关系表达式逻辑表达式数值表达式方括号内的部分为可选的 if (表达式) 语句1 else 语句2 简单的语句复合语句另一个if语句等 最常用的3种if语句形式:1. if (表达式) 语句1 (没有else子句)2. if (表达式) 语句1 else 语句2 (有else子句)3. if(表达式) 语句 else if(表达式) 语句 else if(表达式) 语句 else if(表达式)

9、语句 else 语句m+1 (在else部分又嵌套了多层的if语句) if(number 500) cost = 0.15;else if (number 300) cost = 0.10;else if (number 100) cost = 0.075;else if (number 50) cost = 0.05;else cost=0;if (number 500) cost = 0.15;else if (number 300) cost = 0.10; else if (number 100) cost = 0.075; else if (number 50) cost = 0.0

10、5; else cost = 0;等价于分号不能丢 说明:(1)整个if语句可写在多行上,也可写在一行上 但都是一个整体,属于同一个语句(2)“语句1”“语句m”是if中的内嵌语句 内嵌语句也可以是一个if语句(3)“语句1”“语句m”可以是简单的语句,也可以是复合语句 4.3.1关系运算符及其优先次序4.3.2 关系表达式 关系运算符 = = != (6种)优先级赋值 关系( 后2前4 ) c d=ab+c 1 53 ? 关系运算符和关系表达式 思考:abc的值等于多少? p92 ca+b 等效于 c(a+b)ab=c 等效于 (ab)=ca=bc 等效于 a=(bc 等效于 a=(bc)

11、4.4.1 逻辑运算符及其优先次序4.4.2 逻辑表达式4.4.3 逻辑型变量 逻辑运算符 !(逻辑非) else max=b; max = (a b) ? a : b;条件运算符 有一种if语句,当被判别的表达式的值为“真”或“假” 时,都执行一个赋值语句且向同一个变量赋值如:if (ab) max=a; else max=b; max = (a b) ? a : b;条件表达式 条件表达式的一般形式为表达式?表达式: 表达式 条件运算符的执行顺序:u求解表达式1u若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值u若表达式1的值为0(假),则求解表达式3,表达式3的值就

12、是整个条件表达式的值 条件运算符优先于赋值运算符条件运算符的结合方向为“自右至左”以下为合法的使用方法:uab ? (max=a):(max=b);uab ? printf(“%d”,a): printf(“%d”,b); 例4.4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。解题思路:用条件表达式来处理,当字母是大写时,转换成小写字母,否则不转换 #include int main() char ch; scanf(%c, ch=(ch=A printf(%cn,ch); return 0; 在if语句中又包含一个或多个if语句称为

13、if语句的嵌套一般形式:if( ) if( ) 语句1 else 语句2 else if( ) 语句3 else 语句4 内嵌ifelse总是与它上面最近的未配对的if配对 在if语句中又包含一个或多个if语句称为if语句的嵌套if () if () 语句1 else语句2内嵌if 限定了内嵌if范围 例4.5有一函数: 编一程序,输入一个x值,要求输出相应的y值。 )0(1 )0(0 )0(1 xxxy解题思路:u用if语句检查x的值,根据x的值决定赋予y的值u由于y的可能值不是两个而是三个,因此不可能只用一个简单的(无内嵌if)的if语句来实现 解题思路:方法1(1) 先后用3个独立的if

14、语句处理:输入x若 x 0, 则y = 1输出x和yscanf(%d,if(x0) y = 1;printf(x=%d,y=%dn,x,y); 解题思路:方法2(2) 用一个嵌套的if语句处理:输入x若x 0, 则y = -1 否则 若 x = 0, 则y = 0 否则 y = 1输出x和yscanf(%d,if(x0) y=-1;else if(x=0) y=0; else y=1;printf(x=%d,y=%dn,x,y); 解题思路:方法2(2) 用一个嵌套的if语句处理:输入x若x 0, 则y = -1 否则 若 x = 0, 则y = 0 否则 y = 1输出x和yscanf(%d

15、,if(x=0) if (x0) y 1; else y=0;else y=-1;printf(x=%d,y=%dn,x,y);提倡内嵌if放在else中 举例已知a=3 b=4 c=5 d=0, d=?if (ab)d=a;else if (cb) d=c; else d=b;if (ab)if (cb) d=c; else d=b ; /注意,else总是与最近的if 匹配if (ab)if (cb) d=c;else d=b ;if (ab) if (cb) d=c; else d=b;else d=a;d=5 d=3d=0 d=4 switch语句用来实现多分支选择结构u学生成绩分类8

16、5分以上为A等7084分为B等6069分为C等u人口统计分类 按年龄分为老、中、青、少、儿童 例4.6 要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为7084分,C等为6069分 ,D等为 60分以下 。成绩的等级由键盘输入。解题思路:u判断出这是一个多分支选择问题u根据百分制分数将学生成绩分为4个等级u如果用if语句,至少要用3层嵌套的if,进行3次检查判断u用switch语句进行一次检查即可得到结果 #include int main() char grade; scanf(%c, printf(Your score:); switch(grade) case A: pr

17、intf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 值为A #include int main() char grade; scanf(%c, printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C:

18、printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 不能少 #include int main() char grade; scanf(%c, printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default:

19、printf(enter data error!n); return 0; 值为C #include int main() char grade; scanf(%c, printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 值为F #include int ma

20、in() char grade; scanf(%c, printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); return 0; 此行位置有问题,应如何修改? switch语句的作用是根据表达式的值,使流程跳转到不同的语句switch语句的一般形式:switch(表达式) case

21、 常量1 :语句1 case 常量2 :语句2 case 常量n :语句n default : 语句n+1整数类型(包括字符型) switch语句的作用是根据表达式的值,使流程跳转到不同的语句switch语句的一般形式:switch(表达式) case 常量1 :语句1 case 常量2 :语句2 case 常量n :语句n default : 语句n+1不能相同 scanf(%c, printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: prin

22、tf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); scanf(%c, printf(Your score:); switch(grade) case A: printf(85100n);break; case B: printf(7084n);break; case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); scanf(%c, printf(Your

23、score:); switch(grade) case A: case B: case C: printf(6069n);break; case D: printf(60n);break; default: printf(enter data error!n); 思考#include int main() int score; printf(“请输入考试成绩0100:”); scanf(“%c”, if(score100) printf(“请输入0100之间的整数n”); else if(score=80) printf(“An”); else if(score=70) printf(“Bn”

24、); else if(score=60) printf(“Cn”); else printf(“Dn”); return 0; 根据输入的考试成绩(百分制整数)打印出等级水平。(使用ifelse语句实现)A: 80100 B: 7079 C: 6069 D: 60思考:使用switch语句如何实现?程序 思考#include int main() int score; printf(请输入考试成绩0100:); scanf(%c, switch (score) case 80100: printf(An);break; case 7079: printf(Bn);break; case 606

25、9: printf(Cn);break; case 60: printf(Dn);break; default: printf(请输入0100之间的整数n); return 0; 根据输入的考试成绩(百分制整数)打印出等级水平。(使用switch语句实现)A: 80100 B: 7079 C: 6069 D: 60思考:本程序有问题么?程序 #include int main() int score, p; printf(“请输入考试成绩0100:”); scanf(“%c”, p=score/10; switch (p) case 0: printf(“Dn”);break; case 1:

26、 printf(“Dn”);break; case 2: printf(“Dn”);break; case 3: printf(“Dn”);break; case 4: printf(“Dn”);break; case 5: printf(“Dn”);break; case 6: printf(“Cn”);break; case 7:printf(“Bn”);break; case 8:printf(“An”);break; case 9:printf(“An”);break; case 10:printf(“An”);break; default: printf(“请输入0100之间的整数n

27、”); return 0; 改进程序1 11种情况思考:不同case值时执行相同的操作,是否可以合并? #include int main() int score, p; printf(“请输入考试成绩0100:”); scanf(“%c”, p=score/10; switch (p) case 0: case 1: case 2: case 3: case 4: case 5: printf(“Dn”);break; case 6: printf(“Cn”);break; case 7:printf(“Bn”);break; case 8: case 9: case 10:printf(“

28、An”);break; default: printf(“请输入0100之间的整数n”); return 0; 改进程序2注意:多个case共用一组执行语句时,共用的执行语句写在最后一个case的后面。 例4.7 编写程序,用switch语句处理菜单命令。解题思路:在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个A或a字符,就会执行A操作,输入一个B或b字符,就会执行B操作,等等。 #include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); swit

29、ch(ch) case a: case A: action1(a,b);break; case b: case B: action2(a,b);break; default: putchar(a); return 0;输入a或A调用action1函数,执行A操作void action1(int x,int y) printf(x+y=%dn,x+y); #include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); switch(ch) case a: case

30、A: action1(a,b);break; case b: case B: action2(a,b);break; default: putchar(a); return 0;输入b或B调用action2函数,执行B操作void action2(int x,int y) printf(x*y=%dn,x*y); #include int main() void action1(int,int),action2(int,int); char ch; int a=15,b=23; ch=getchar(); switch(ch) case a: case A: action1(a,b);brea

31、k; case b: case B: action2(a,b);break; default: putchar(a); return 0;输入其他字符发出警告 这是一个非常简单的示意程序实际应用中,所指定的操作可能比较复杂: uA:输入全班学生各门课的成绩uB:计算并输出每个学生各门课的平均成绩uC:计算并输出各门课的全班平均成绩uD:对全班学生的平均成绩由高到低排序并输出可以按以上思路编写程序,把各action函数设计成不同的功能以实现各要求 例4.8 写一程序,判断某一年是否闰年。解题思路:在前面已介绍过判别闰年的方法本例用不同的方法编写程序 用变量leap代表是否闰年的信息。若闰年,令l

32、eap=1;非闰年,leap=0。最后判断leap是否为(真),若是,则输出“闰年”信息参见教材图4.13 #include int main()int year,leap; printf(enter year:); scanf(%d, 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 year.n); return

33、 0;标志变量与if (leap!=0)含义相同 #include int main()int year,leap; printf(enter year:); scanf(%d, 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 year.n); return 0;采取锯齿形式 #include int main()

34、int year,leap; printf(enter year:); scanf(%d, 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 year.n); return 0; if(year%4!=0) leap=0;else if (year%100!=0) leap=1;else if(year%400!=0

35、) leap=0;else leap=1; #include int main()int year,leap; printf(enter year:); scanf(%d, 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 year.n); return 0; if(year%4=0 else leap=0; 例4.

36、9 求 方程的解。02 cbxax解题思路:处理以下各情况 ,不是二次方程 ,有两个相等实根 ,有两个不等实根。 ,有两个共轭复根。 应当以p+qi和p-qi的形式输出复根 其中,p=-b/2a,q=( )/2a参见教材图4.14042 acb 042 acb 04 2 acb acb 42 #include #include int main() double a,b,c,disc,x1,x2,realpart, imagpart; scanf(%lf,%lf,%lf, printf(The equation ); if(fabs(a)=1e-6) printf(is not a quadr

37、aticn);实型不能用if (a=0) else disc=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(%

38、8.4f-%8.4fin, realpart,imagpart); return 0; 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); return 0; realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf( has complex roots:n); printf(

39、%8.4f+%8.4fin“ ,realpart,imagpart); printf(%8.4f-%8.4fin, realpart,imagpart); return 0; 例4.10 运输公司对用户计算运输费用。路程(s km)越远,每吨千米运费越低。标准如下: s 250 没有折扣 250s 500 2折扣 500s 1000 5折扣 1000s 2000 8折扣 2000s 3000 10折扣 3000s 15折扣 解题思路:u设每吨每千米货物的基本运费为p,货物重为w,距离为s,折扣为du总运费f的计算公式为f=pws(1-d) 折扣的变化规律(参见教材图4.15):u折扣的“变化点

40、”都是250的倍数u在横轴上加一种坐标c,c的值为s/250uc代表250的倍数u当c1时,表示s250,无折扣u1c2时,表示250s500,折扣d=2u2c4时,d=5;4c8时,d=8; 8c12时,d=10;c12时,d=15 #include int main() int c,s; float p,w,d,f; printf(please enter price,weight,discount:); scanf(%f,%f,%d, if(s=3000) c=12; else c=s/250; 输入单价、重量、距离 switch(c) case 0: d=0; break; case 1: d=2; break; case 2: case 3: d=5; break; case 4: case 5: case 6: case 7: d=8; break; case 8: case 9: case 10: case 11: d=10; break; case 12: d=15; break; f = p * w * s * (1 - d / 100); printf(“freight=%10.2fn”,f); return 0;

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!