《c语言ppt课件第4章选择结构程序设计.ppt》由会员分享,可在线阅读,更多相关《c语言ppt课件第4章选择结构程序设计.ppt(111页珍藏版)》请在三一办公上搜索。
1、第4章 选择结构程序设计,4.1 选择结构和条件判断4.2 用if语句实现选择结构4.3关系运算符和关系表达式4.4 逻辑运算符和逻辑表达式4.5 条件运算符和条件表达式4.6 选择结构的嵌套4.7 用switch语句实现多分支选择结构4.8选择结构程序综合举例,4.1 选择结构和条件判断,在现实生活中,需要进行判断和选择的情况是很多的如果你在家,我去拜访你如果考试不及格,要补考如果遇到红灯,要停车等待周末我们去郊游70岁以上的老年人,入公园免票,4.1 选择结构和条件判断,在现实生活中,需要进行判断和选择的情况是很多的处理这些问题,关键在于进行条件判断由于程序处理问题的需要,在大多数程序中都
2、会包含选择结构,需要在进行下一个操作之前先进行条件判断,4.1 选择结构和条件判断,C语言有两种选择语句:(1)if语句,实现两个分支的选择结构(2)switch语句,实现多分支的选择结构,4.1 选择结构和条件判断,例4.1 在例3.5的基础上对程序进行改进。题目要求是求 方程的根。由键盘输入a,b,c。假设a,b,c的值任意,并不保证。需要在程序中进行判别,如果,就计算并输出方程的两个实根,否则就输出“方程无实根”的信息。,解题思路:,输入a,b,c,计算disc,disc0,计算x1,x2,输出无实根,输出x1,x2,真,假,#include#include int main()doub
3、le a,b,c,disc,x1,x2,p,q;scanf(%lf%lf%lf,计算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,计算b2-4ac,di
4、sc的值变为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的值变为-1,q的值变为0.71,x1的值变为-0.29,x2的值变为-1.71,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;pri
5、ntf(“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 用if语句实现选择结构,4.2.1 用if语句处理选择结构举例4.2.2 if语句的一般形式,4.2.1 用if语句处理选择结构举例,例4.2
6、输入两个实数,按代数值由小到大的顺序输出这两个数。,解题思路:只需要做一次比较,然后进行一次交换即可用if语句实现条件判断关键是怎样实现两个变量值的互换,A,B,互换前,A,B,互换后,4.2.1 用if语句处理选择结构举例,A,B,C,4.2.1 用if语句处理选择结构举例,A,B,C,4.2.1 用if语句处理选择结构举例,A,B,C,4.2.1 用if语句处理选择结构举例,#include int main()float a,b,t;scanf(%f,%f,将a和b的值互换,如果ab,#include int main()float a,b,t;scanf(%f,%f,选择结构,用if语
7、句实现的,例4.3 输入3个数a,b,c,要求按由小到大的顺序输出。,解题思路:可以先用伪代码写出算法:if ab,a和b对换(a是a、b中的小者)if ac,a和c对换(a是三者中最小者)if bc,b和c对换(b是三者中次小者)顺序输出a,b,c,#include int main()float a,b,c,t;scanf(%f,%f,%f,如果 ab,将a和b对换,a是a、b中的小者,#include int main()float a,b,c,t;scanf(%f,%f,%f,如果 ac,将a和c对换,a是三者中的小者,#include int main()float a,b,c,t;
8、scanf(%f,%f,%f,如果 bc,将b和c对换,b是三者中的次小者,4.2.2 if语句的一般形式,if(表达式)语句1 else 语句2,关系表达式逻辑表达式数值表达式,方括号内的部分为可选的,4.2.2 if语句的一般形式,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(表达式)语句 else 语句m+1(在else部分又嵌套了
9、多层的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.05;else cost=0;,等价于,分号不能丢,说明:(1)整个if语句可写在多行上,也可写在一行上 但都是一个整
10、体,属于同一个语句(2)“语句1”“语句m”是if中的内嵌语句 内嵌语句也可以是一个if语句(3)“语句1”“语句m”可以是简单的语句,也可以是复合语句,4.3关系运算符和关系表达式,关系运算符及其优先次序4.3.2 关系表达式,关系运算符及其优先次序,关系运算符:用来对两个数值进行比较的比较运算符语言提供种关系运算符:(小于)=(小于或等于)(大于)=(大于或等于)=(等于)!=(不等于),优先级相同(高),优先级相同(低),关系运算符及其优先次序,关系、算术、赋值运算符的优先级,关系运算符及其优先次序,ca+b 等效于 c(a+b)ab=c 等效于(ab)=ca=bc 等效于 a=(bc)
11、,4.3.2 关系表达式,关系表达式用关系运算符将两个数值或数值表达式连接起来的式子关系表达式的值是一个逻辑值,即“真”或“假”在C的逻辑运算中,以“”代表“真”,以“”代表“假”,4.4 逻辑运算符和逻辑表达式,4.4.1 逻辑运算符及其优先次序4.4.2 逻辑表达式4.4.3 逻辑型变量,4.4.1 逻辑运算符及其优先次序,3种逻辑运算符:&(逻辑与)|(逻辑或)!(逻辑非)&和|是双目(元)运算符!是一目(元)运算符逻辑表达式用逻辑运算符将关系表达式或其他逻辑量连接起来的式子,4.4.1 逻辑运算符及其优先次序,判断年龄在13至17岁之内?age=13&age65,4.4.1 逻辑运算符
12、及其优先次序,逻辑运算的真值表,4.4.1 逻辑运算符及其优先次序,逻辑运算符的优先次序!&|(!为三者中最高)与其他运算符的优先次序,!(高)算术运算符关系运算符&和|赋值运算符(低),4.4.2 逻辑表达式,逻辑表达式的值应该是逻辑量“真”或“假”编译系统在表示逻辑运算结果时以数值1代表“真”,以0代表“假”但在判断一个量是否为“真”时以0代表“假”,以非0代表“真”注意:将一个非零的数值认作为“真”,4.4.2 逻辑表达式,(1)若a=4,则!a的值为0(2)若a=4,b=5,则a&b的值为1(3)a和b值分别为4和5,则a|b的值为1(4)a和b值分别为4和5,则!a|b的值为1(5)
13、4&0|2的值为1,4.4.2 逻辑表达式,修改后的逻辑运算真值表,4.4.2 逻辑表达式,判别某一年是否闰年,用逻辑表达式表示闰年的条件是符合下面二者之一:能被4整除,但不能被100整除,如2008能被400整除,如2000(year%4=0&year 100!=0)|year%400=0如果表达式值为1,则闰年;否则为非闰年,4.4.3 逻辑型变量,这是C99所增加的一种数据类型可以将关系运算和逻辑运算的结果存到一个逻辑型变量中,以便于分析和运算,4.5 条件运算符和条件表达式,有一种if语句,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值如:if(ab)ma
14、x=a;else max=b;,max=(a b)?a:b;,条件运算符,4.5 条件运算符和条件表达式,有一种if语句,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值如:if(ab)max=a;else max=b;,max=(a b)?a:b;,条件表达式,4.5 条件运算符和条件表达式,条件表达式的一般形式为表达式?表达式:表达式,4.5 条件运算符和条件表达式,条件运算符的执行顺序:求解表达式1若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值,4.5 条件运算
15、符和条件表达式,条件运算符优先于赋值运算符条件运算符的结合方向为“自右至左”以下为合法的使用方法:ab?(max=a):(max=b);ab?printf(“%d”,a):printf(“%d”,b);,4.5 条件运算符和条件表达式,例4.4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。,4.5 条件运算符和条件表达式,解题思路:用条件表达式来处理,当字母是大写时,转换成小写字母,否则不转换,4.5 条件运算符和条件表达式,#include int main()char ch;scanf(%c,4.6 选择结构的嵌套,在if语句中又
16、包含一个或多个if语句称为if语句的嵌套一般形式:if()if()语句1 else 语句2 else if()语句3 else 语句4,内嵌if,else总是与它上面最近的未配对的if配对,4.6 选择结构的嵌套,在if语句中又包含一个或多个if语句称为if语句的嵌套if()if()语句1 else语句2,内嵌if,限定了内嵌if范围,4.6 选择结构的嵌套,例4.5有一函数:编一程序,输入一个x值,要求输出相应的y值。,4.6 选择结构的嵌套,解题思路:用if语句检查x的值,根据x的值决定赋予y的值由于y的可能值不是两个而是三个,因此不可能只用一个简单的(无内嵌if)的if语句来实现,4.6
17、 选择结构的嵌套,解题思路:方法1(1)先后用3个独立的if语句处理:输入x若 x 0,则y=1输出x和y,scanf(%d,4.6 选择结构的嵌套,解题思路:方法2(2)用一个嵌套的if语句处理:输入x若x 0,则y=-1 否则 若 x=0,则y=0 否则 y=1输出x和y,scanf(%d,4.6 选择结构的嵌套,解题思路:方法2(2)用一个嵌套的if语句处理:输入x若x 0,则y=-1 否则 若 x=0,则y=0 否则 y=1输出x和y,scanf(%d,scanf(%d,提倡内嵌if放在else中,4.7 用switch语句实现多分支选择结构,switch语句用来实现多分支选择结构学生
18、成绩分类85分以上为A等7084分为B等6069分为C等人口统计分类 按年龄分为老、中、青、少、儿童,4.7 用switch语句实现多分支选择结构,例4.6 要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为7084分,C等为6069分,D等为 60分以下。成绩的等级由键盘输入。,4.7 用switch语句实现多分支选择结构,解题思路:判断出这是一个多分支选择问题根据百分制分数将学生成绩分为4个等级如果用if语句,至少要用3层嵌套的if,进行3次检查判断用switch语句进行一次检查即可得到结果,#include int main()char grade;scanf(%c,值为A
19、,#include int main()char grade;scanf(%c,不能少,#include int main()char grade;scanf(%c,值为C,#include int main()char grade;scanf(%c,值为F,#include int main()char grade;scanf(%c,此行位置有问题,应如何修改?,switch语句的作用是根据表达式的值,使流程跳转到不同的语句switch语句的一般形式:switch(表达式)case 常量1:语句1 case 常量2:语句2 case 常量n:语句n default:语句n+1,整数类型(包括
20、字符型),switch语句的作用是根据表达式的值,使流程跳转到不同的语句switch语句的一般形式:switch(表达式)case 常量1:语句1 case 常量2:语句2 case 常量n:语句n default:语句n+1,不能相同,scanf(%c,scanf(%c,scanf(%c,例4.7 编写程序,用switch语句处理菜单命令。解题思路:在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个A或a字符,就会执行A操作,输入一个B或b字符,就会执行B操作,等等。,#include int main()void action1(int,int),action2(int,int);
21、char ch;int a=15,b=23;ch=getchar();switch(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
22、();switch(ch)case a:case 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:actio
23、n1(a,b);break;case b:case B:action2(a,b);break;default:putchar(a);return 0;,输入其他字符,发出警告,这是一个非常简单的示意程序实际应用中,所指定的操作可能比较复杂:A:输入全班学生各门课的成绩B:计算并输出每个学生各门课的平均成绩C:计算并输出各门课的全班平均成绩D:对全班学生的平均成绩由高到低排序并输出可以按以上思路编写程序,把各action函数设计成不同的功能以实现各要求,4.8选择结构程序综合举例,例4.8 写一程序,判断某一年是否闰年。解题思路:在前面已介绍过判别闰年的方法本例用不同的方法编写程序,4.8选择结
24、构程序综合举例,用变量leap代表是否闰年的信息。若闰年,令leap=1;非闰年,leap=0。最后判断leap是否为(真),若是,则输出“闰年”信息参见教材图4.13,#include int main()int year,leap;printf(enter year:);scanf(%d,标志变量,与if(leap!=0)含义相同,#include int main()int year,leap;printf(enter year:);scanf(%d,采取锯齿形式,#include int main()int year,leap;printf(enter year:);scanf(%d,
25、if(year%4!=0)leap=0;else if(year%100!=0)leap=1;else if(year%400!=0)leap=0;else leap=1;,#include int main()int year,leap;printf(enter year:);scanf(%d,if(year%4=0,例4.9 求 方程的解。,解题思路:处理以下各情况,不是二次方程,有两个相等实根,有两个不等实根。,有两个共轭复根。应当以p+qi和p-qi的形式输出复根 其中,p=-b/2a,q=()/2a参见教材图4.14,#include#include int main()double
26、 a,b,c,disc,x1,x2,realpart,imagpart;scanf(%lf,%lf,%lf,实型不能用if(a=0),else disc=b*b-4*a*c;if(fabs(disc)=1e-6)printf(has two equal roots:%8.4fn,-b/(2*a);else,先算disc,以减少重复计算,不能用if(disc=0),if(disc1e-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);els
27、e,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(%8.4f+%8.4fin“,realpart,imagpart);printf(%8.4f-%8.4fin
28、,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;,例4.10 运输公司对用户计算运输费用。路程(s km)越远,每吨千米运费越低。标准如下:s 250 没有折扣 250s 500 2折扣 500s 1000 5折扣 1000s 2000 8折扣 2000s 30
29、00 10折扣 3000s 15折扣,解题思路:设每吨每千米货物的基本运费为p,货物重为w,距离为s,折扣为d总运费f的计算公式为f=pws(1-d),折扣的变化规律(参见教材图4.15):折扣的“变化点”都是250的倍数在横轴上加一种坐标c,c的值为s/250c代表250的倍数当c1时,表示s250,无折扣1c2时,表示250s500,折扣d=22c4时,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:);s
30、canf(%f,%f,%d,输入单价、重量、距离,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设有int i;则表达式i=1,+i|+i;i的值为1)12)23)34)42设有int i;则表达
31、式(i=1,i=10)?i+|+i:+i的值为1)12)23)34)10 5)113设有 int i,j,k;则表达式 i=1,j=2,k=3,i后i的值为。,5下列程序的输出是1)0032)0123)1034)112main()int a=-1,b=4,k;k=(a+=0)执行后输出结果是 1)1,1,2 2)2,2,1 3)2,2,2 4)2,2,3,7有以下程序(2003上半年)main()int a=5,b=4,c=3,d=2;if(abc)printf(%dn,d);else if(c-1=d)=1)printf(%dn,d+1);elseprintf(%dn,d+2);执行后输出结
32、果是1)2 2)3 3)4 4)编译时有错,无结果,8有以下程序(2003上半年)main()int i;for(i=0;i3;i+)switch(i)case 1:printf(%d,i);case 2:printf(%d,i);default:printf(%d,i);执行后输出结果是 A)011122 B)012 C)012020 D)120,9以下程序运行后的输出结果是。(2003下半年)main()int i,m=0,n=0,k=0;for(i=9;i=11;i+)switch(i/10)case 0:m+;n+;break;case 10:n+;break;default:k+;n
33、+;printf(%d%d%dn,m,n,k);,10执行下面程序段时输出的结果是。int i=5;switch(i)case 5:case 6:i+=2;case 7:break;case 8:i+=2;printf(i=%d,i);,11下面的程序的功能是将学生成绩90分以上输出字符A,8960分输出字符”Pass”,其余输出“Fail”。main()float grade;int sel;scanf(%f,C)switch(a+b)case 1:printf(*n);case 2:printf(*n);case 1:printf(*n);,12若有以下定义:float x;int a,b
34、;则正确的switch 语句是,A)switch(x)case1.0:printf(*n);case2.0:printf(*n);,B)switch(x)case1,2:printf(*n);case3:printf(*n);,D)switch(a+b)case 1:printf(*n);case 1+2:printf(*n);,i=2;表达式=1表达式=1,i=111i=9,j=0k=1,a=0,b=3i=2,j=2,k=2打印 2)3A)011122m=1,n=3,k=2i=7sel;breakD),练习1.编程设计一个简单的猜字游戏,先由计算机“想”一个数请人猜,如果人猜对了,则计算机给出提示“Right”,否则提示“Wrong”,并告诉人所猜的数是大还是小。2.编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:操作数1 运算符op 操作数2计算表达式的值,指定的运算符为+、-、*、/。,习题P1114、5、6、8、9、10、11、12,