《第四章 选择结构教学课件.pptx》由会员分享,可在线阅读,更多相关《第四章 选择结构教学课件.pptx(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章 选择结构程序设计目录CONTENTS简单选择结构多分支选择结构选择结构程序举例4.14.24.3简 单 选 择 结 构4.1 单分支if语句双分支if语句if语句分类if语句分类01if语句是条件选择语句,它通过给定的条件来进行判断,从而决定要执行的操作03单分支if语句0201双分支if语句多分支if语句单分支if语句02格式: if(表达式)语句;功能:首先计算表达式的值。若表达式的值为“真”(非0),则执行语句;若表达式的值为“假”(为0),则直接转到此if语句的下一条语句去执行。例如:if(xy)printf(”%d”,x);如果xy为真,则打印x的值,否则执行下面的语句。单分
2、支if语句执行流程图例1:输入两个整数,输出其中的较大数运行结果:Input two numbers:-23 45max=45#include stdio.hint main() int a,b,max; printf(n input two numbers: ); scanf(%d%d,&a,&b); max=a; if (maxb) max=b; printf(max=%dn,max); return 0; 例2:小明的姐姐在假日旅行社工作,旅行社为了争取更多的游客,给出优惠措施:团购五人(及以上),团费8折。姐姐请小明帮忙,做一个可以根据输入的人数和团费,计算实际支付团费的程序。小明该怎
3、么写这个程序呢?运行运行结果结果:输入人数p=6团费c=430总费用为:344.00#includeint main()int p;float c;printf(输入人数p=);scanf(%d,&p);printf(输入团费c=);scanf(%f,&c);if(p=5)c=c*0.8;printf(总费用为:%.2fn,c);return 0;双分支if语句03格式: if(表达式) 语句1; else 语句2;功能:首先判断表达式的值,若表达式的值为“真”(非0),则执行语句1;否则,执行语句2。例如:if(xy)printf(“%d”,x);else printf(“%d”,y);如果
4、如果xy为真,则打印x的值,否则xy为假,执行else语句,打印y值。 双分支if语句执行流程图例3:用双分支if语句形式改写例1为:#include stdio.hint main() int a,b,max; printf(n input two numbers: ); scanf(%d%d,&a,&b); max=a; if (maxb) max=a; else max=b; printf(max=%dn,max); return 0;练习:用双分支if语句形式改写例2例4:从键盘输入一个整数,判断它是偶数还是奇数,并输出结果分析:一个数如果能被2整除,则是偶数,否则是奇数。我们用对2取
5、余的方法来验证这个是否为偶数。若n%2余数为0,说明n是一个偶数,或n%2余数不为0,则n是一个奇数。#include “stdio.h”int main() int n; printf(input a number:); /*提示输入一个数 */ scanf(%d,&n); if (n%2=0) /*若n%2余数=0,则说明数n是一个偶数 */ printf(The number is even!n); /*打印数n是一个偶数 */ else printf(The number is odd!n); /*否则,打印数n是一个奇数 */ return 0;多 分 支 选 择 结 构4.2 多分
6、支if语句多分支switch语句if语句的嵌套switch语句和多分支if语句比较多分支if语句01多分支if语句一般形式为:if (表达式1) 语句1;else if (表达式2) 语句2; else if (表达式n) 语句n;else 语句n+1; 多分支if语句执行流程图例1:根据x的值,判断输出y的值。#include int main() int x,y; printf(please input x:); scanf(%d,&x); if(x0) printf(y=1n); else if(x0) printf(y=-1n); else printf(y=0n); return 0
7、;运行结果:please input x:-7y=-1例2:小明在进一步的学习中了解到,根据车辆超速情况的不同,是有不同处罚的,(1)超过10%以内,不罚款,记3分;(2)超过10%以上未达20%的,罚50元,记3分;(3)超过20%以上未达50%的,罚200元,记3分;(4)超过50%以上未达70%的,罚1000元,记6分,可以并处吊销驾驶证;(5)超过70%以上的,罚2000元,记6分,可以并处吊销驾驶证。小明要实现这个功能,又该怎么编写代码呢?运行运行结果结果:输入车速:70 输入限速:80 遵守交规,赞!#include int main()float speed,limtspeed,
8、r;printf(输入车速:);scanf(%f,&speed);printf(输入限速:);scanf(%f,&limtspeed);r=(speed-limtspeed)/limtspeed;if(r0&r=0.1&r=0.2&r=0.5&r=0.7) printf(罚款2000,记6分,并可吊销驾照n); else printf(遵守交规,赞!n);return 0;例3:天猫超市双 11 推出以下优惠促销活动:购物满 50 元,打 9 折;购物满 100 元,打 8 折;购物满 200 元,打 7 折;购物满 300 元,打 6 折;编程计算当购物满 s 元时,实际付费多少?运行运行结
9、果结果:输入消费额:623实际付款额为:373.80元#include int main( ) float s,f; printf(输入消费额:n); scanf(%f,&s); if(s50) f = s; else if (s100) f = s*0.9; else if (s200) f = s*0.8; else if (s=0&c=A&c=a&c=48 & c=65 & c=97 & c0) if(ab)z=a; elsez=b; printf(“z=%d”,z); return 0;#include stdio.hint main() int n=3,z,a=5,b=2; if(n
10、b)z=a; elsez=b; printf(“z=%d”,z); return 0;Z=5Z=2if语句的嵌套02例2:对于任意的整数,判断其能否被3整除同时被5或者7整除,若成立输出”YES”,否则输出“NO”。#include int main()int num;printf(please input num:);scanf(%d,&num);if(num%3=0) if(num%5=0|num%7=0) printf(yesn); else printf(non); else printf(non);return 0;运行运行结果结果:please input num:344no请按任
11、意键继续. . .please input num:63yes请按任意键继续. . .if语句应注意的问题 (1)if表达式可以是逻辑表达式、关系表达式、赋值表达式,也可以为一个变量;(2)if(k=9),if(c)都是合法的,只要是非0即可执行对应语句;(3)表达式用括号括起来,后面不能加分号,后面跟的语句要加分号;(4)如果条件后面的语句不是单语句,需要用括起来,后面不能加分号;(5)嵌套关系中尽量按层次缩进,增加程序可读性。多分支switch语句03应用if条件语句可以很方便地实现条件分支,通常我们使用if语句来进行模糊条件匹配,但是当我们进行多个精确匹配时,如果用if语句来解决问题,程
12、序结构会显得很复杂,甚至凌乱。switch语句尤其擅长处理一些分支较多且很有规律的精确匹配问题,代码描述起来不仅方便而且直观。多分支switch语句03switch语句一般形式为:switch(表达式) case 常量1:语句1;break; case 常量2:语句2;break; case 常量n:语句n;break; default: 语句n+1; switch多分支选择结构流程图main( ) char grade; scanf (“%c”,&grade); switch(grade) case A: printf(“85-100n”); case B: printf(“70-84n”)
13、; case C: printf(“60-69n”); case D: printf(“60”); default: printf(“Errorn”); inputBoutput: 70-84 60-69 60 Errorprintf(“ 7084”); break;实例1:2703多分支switch语句#includeint main( ) char grade; scanf (“%c”,&grade); switch(grade) case A: printf(“85-100n”);break; case B: printf(“70-84n”); break; case C: printf
14、(“60-69n”); break; case D: printf(“60”); break; default: printf(“Errorn”); return 0; inputBoutput: 70-842803多分支switch语句(1)表达式只能是顺序类型(除了实型以外的简单类型),)表达式只能是顺序类型(除了实型以外的简单类型),它的一个取值只能在所有值表中出现一次。它的一个取值只能在所有值表中出现一次。switch(a) case 1:printf(“level 1”);break; case 2:printf(“level 2”);break; case 3:printf(“le
15、vel 3”);break; case 4:printf(“level 4”);break; case 5:printf(“level 5”);break; case 2:printf(“level 0”);break;在值表中,2出现了两次2903多分支switch语句(2)如果某个分支语句结束后,出现了)如果某个分支语句结束后,出现了break语句,则语句,则程序跳出程序跳出分支语句分支语句;如果如果某个分支没有出现某个分支没有出现break语句,则会语句,则会自动执行自动执行后续的语句。后续的语句。switch(a) case 1:printf(“level 1n”);break; ca
16、se 2:printf(“level 2n”); case 3:printf(“level 3n”); case 4:printf(“level 4n”); case 5:printf(“level 5n”);break; case 0:printf(“level 0n”);break;当a=2时:输出:level2 level3 level4 level53003多分支switch语句(3)多个分支可以共用一组语句,即某些分支的语句可以)多个分支可以共用一组语句,即某些分支的语句可以为空为空。switch(a) case 1:printf(“level 1n”);break; case 2:
17、 case 3: case 4:printf(“level 4n”); case 5:printf(“level 5n”);break; case 0:printf(“level 0n”);break;当a=2、a=3、a=4时,执行相同的语句。3103多分支switch语句(4)值表中的排列无大小顺序的差别,值表中的类型必须)值表中的排列无大小顺序的差别,值表中的类型必须和表达式和表达式类型相同。类型相同。switch(a) case 1:printf(“level 1n”);break; case 4:printf(“level 4n”); case 2:printf(“level 2n”
18、); case 3:printf(“level 3n”); case 5:printf(“level 5n”);break;当a=2、a=3、a=4时,执行相同的语句。3203多分支switch语句(4)值表中的排列无大小顺序的差别,值表中的类型必须)值表中的排列无大小顺序的差别,值表中的类型必须和表达式和表达式类型相同。类型相同。switch(a) case 1:printf(“level 1n”);break; case 4:printf(“level 4n”); case 2:printf(“level 2n”); case 3:printf(“level 3n”); case 5:pr
19、intf(“level 5n”);break;当a=2、a=3、a=4时,执行相同的语句。3303多分支switch语句例1:对于对于给定的两个操作数,输入运算符,即可给定的两个操作数,输入运算符,即可计算其计算其值。这里假设运算符有值。这里假设运算符有+、-、*、/,且两个运算数均为且两个运算数均为整数。整数。#include int main()int a,b;char c;scanf(%d %d %c,&a,&b,&c);switch(c)case +:printf(%d%c%d=%dn,a,c,b,a+b);break;case -:printf(%d%c%d=%dn,a,c,b,a-
20、b);break;case *:printf(%d%c%d=%dn,a,c,b,a*b);break;case /:if(b=0)printf(Divided by zero!n); elseif(a%b=0) printf(%d%c%d=%dn,a,c,b,a/b); else printf(%d%c%d=%.4fn,a,c,b,(double)a/b); break; default:printf(Input Error!n);return 0;switch语句与多分支if语句比较04多分支if结构和switch结构都可以用来解决多分支问题,两个语句使用原则如下:(1)多分支if语句的条件
21、表达式比较直接,switch语句表达式需要构造。(2)多分支if语句适用于模糊条件匹配,如要判断一个值是否处在某个区间;而switch适用于精确匹配。(3)分支较少时,if效率比switch高;分支较多且取值有规律时,适合采用switch。(4)switch的效率一般比if要高,switch的表达式只计算一次,if的每个条件都要计算一遍。选择结构程序设计举例4.3 例1:输入三个数,比较后按从大到小顺序输出。运行运行结果结果:请任意输入三个数(空格分隔):55 32 66从大到小排列为:66 55 32#include int main( ) int a,b,c,t; printf(请任意输入
22、三个数(空格分隔):n); scanf(%d %d %d,&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(从大到小排列为:%d %d %dn,a,b,c); return 0;选择结构程序设计举例05例2:输入两个操作数和运算符,计算其值。假设两个操作数均为整数且运算符有+、-、*、/。运行运行结果结果:4 5 +4+5=9请按任意键继续. . .3 0 /Divided by zero!请按任意键继续. . .24 8 /24/8=3请按任意键继续. . .7 3 /
23、7/3=2.33请按任意键继续. . .选择结构程序设计举例05#include int main() int a,b; char c; scanf(%d %d %c,&a,&b,&c); switch(c) case +:printf(%d%c%d=%dn,a,c,b,a+b);break; case -:printf(%d%c%d=%dn,a,c,b,a-b);break; case *:printf(%d%c%d=%dn,a,c,b,a*b);break; case /: if(b=0) printf(Divided by zero!n); else if(a%b=0) printf(%
24、d%c%d=%dn,a,c,b,a/b); else printf(%d%c%d=%.2fn,a,c,b,(double)a/b); break; default:printf(Input Error!n); return 0;选择结构程序设计举例例3:输入某年某月某日,判断这一天是这一年的第几天。运行结果:运行结果:please input year,month,day2020 3 5it is the 65 th day!please input year,month,day2021 3 5it is the 64 th day!#include int main()int day,mon
25、th,year,sum,leap;printf(please input year,month,dayn);scanf(%d %d %d,&year,&month,&day);switch(month) /*先计算某月以前月份总天数* case 1:sum=0;break; case 2:sum=31;break; case 3:sum=31+28;break; case 4:sum=31+28+31;break; case 5:sum=2*31+28+30;break; case 6:sum=3*31+28+30;break; case 7:sum=3*31+28+2*30;break; c
26、ase 8:sum=4*31+28+2*30;break; case 9:sum=5*31+28+2*30;break; case 10:sum=5*31+28+3*30;break; case 11:sum=6*31+28+3*30;break; case 12:sum=6*31+28+4*30;break; default:printf(data error);sum=sum+day; /*再加上某天天数*if(year%400=0|(year%4=0 & year%100!=0) /*判断是不是闫年*/leap=1; elseleap=0;if(leap=1 & month2)sum+;
27、printf(it is the %d th day!,sum);return 0;05选择结构程序设计举例例4:铁路运货的费用与路程s远近有关:不足50公里,每吨每公里1.00元;=50公里,=100公里,=200公里,每吨每公里0.70元。计算运货w吨,路程s公里的运费。运行结果:运行结果:输入里程数:128.4117.72#includeint main()float s,total;printf(输入里程数:);scanf(%f,&s);if(s0&s=50&s=100&s200) total=50*1+50*0.9+(s-100)*0.8;else total=50*1+50*0.9
28、+100*0.8+(s-200)*0.7;printf(%.2f,total); return 0;05练习1:计算市场销售员的工资,工资计算标准见下表:选择结构程序设计举例0542#includeint main()float MonthlySales,income;printf(enter the value of the monthly sales:);scanf(%f,&MonthlySales);if(MonthlySales=50000) income=575+MonthlySales*0.16;else if (MonthlySales=40000) income=550+Mon
29、thlySales*0.14;else if (MonthlySales=30000) income=525+MonthlySales*0.12;else if (MonthlySales=20000) income=500+MonthlySales*0.09;else if(MonthlySales=10000) income=450+MonthlySales*0.05;else income=400+MonthlySales*0.03;printf(the income is $%.2fn,income);return 0;选择结构程序设计举例05练习2:从键盘输入党员的月工资,计算党员党
30、费并输出,党员收费标准如下选择结构程序设计举例05党费计算基数: 在3000元以下(含)者,系数为0.5%;在3000元以上至5000元(含)者,系数为1%;在5000元以上至10000(含)者,系数为1.5%;在10000元以上者,系数为2%。练习3:从键盘输入一个两位数的整数,判断该数中是否含有数字3,若是输出”YES”,否则输出”NO”:选择结构程序设计举例05假设该数为num个位:个位:num%10十位:num/10。练习4:从键盘输入一个三位数的整数,判断该数中是否含有数字5或者7 ,若是输出”YES”,否则输出”NO。选择结构程序设计举例05假设该数为num个位个位:num%10百
31、位: num/100十位:(num-百位*100) /10练习5:输入一个数字,输出对应星期的英文单词,如输入1,则输出Monday。修改以下代码并正确输出。选择结构程序设计举例05 #include int main()int a;printf(please input integer number:);scanf(%d,&a);switch(a) case 1:printf(Mondayn); case 2:printf(Tuesdayn); case 3:printf(Wednesdayn); case 4:printf(Thursdayn); case 5:printf(Fridayn); case 6:printf(Saturdayn); case 7:printf(Sundayn); default: printf(errorn); return 0;