资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,2021/2/28,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,2021/2/28,*,第,4,章 选择结构程序设计,4.1,选择结构和条件判断,4.2,用,if,语句实现选择结构,4.3,关系运算符和关系表达式,4.4,逻辑运算符和逻辑表达式,4.5,条件运算符和条件表达式,4.6,选择结构的嵌套,4.7,用,switch,语句实现多分支选择结构,4.8,选择结构程序综合举例,2021/2/28,1,4.1,选择结构和条件判断,在现实生活,中,,需要进行判断和选择的情况是很多的,如果你在家,我去拜访你,如果考试不及格,要补考,如果遇到红灯,要停车等待,周末我们去郊游,70,岁以上的老年人,入公园免票,2021/2/28,2,4.1,选择结构和条件判断,C,语言有两种选择语句,:,(1)if,语句,实现两个分支的选择结构,(2)switch,语句,实现多分支的选择结构,2021/2/28,3,4.1,选择结构和条件判断,例,4.1,在例,3.5,的基础上对程序进行改进。题目要求,是,求,方程的根。,由键盘输入,a,b,c,。假设,a,b,c,的值任意,并不保证,disc,=,。,需要在程序中进行判别,如果,,就计算并输出方程的两个实根,,否则,就输出“方程无实根”的信息。,2021/2/28,4,解题思路:,输入,a,b,c,计算,disc,discb),t=a;,a=b;,b=t;,printf(%5.2f,%5.2fn,a,b);,return 0;,将,a,和,b,的值互换,如果,ab,2021/2/28,12,#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;,选择结构,用,if,语句实现的,2021/2/28,13,例,4.3,输入,3,个数,a,,,b,,,c,,要求按由小到大的顺序输出。,2021/2/28,14,解题思路:可以先用伪代码写出算法:,if ab,,,a,和,b,对换,(,a,是,a,、,b,中的小者),if ac,,,a,和,c,对换,(,a,是三者中最小者),if bc,,,b,和,c,对换,(,b,是三者中次小者,),顺序输出,a,,,b,,,c,2021/2/28,15,#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,b,c);,return 0;,如果,ab,,将,a,和,b,对换,a,是,a,、,b,中的小者,2021/2/28,16,#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,b,c);,return 0;,如果,ac,,将,a,和,c,对换,a,是,三者,中的小者,2021/2/28,17,#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,b,c);,return 0;,如果,bc,,将,b,和,c,对换,b,是,三者,中的,次,小者,2021/2/28,18,4.2.2 if,语句的一般形式,if(,表达式,),语句,1,else,语句,2 ,关系表达式,逻辑表达式,数值表达式,方括号内的部分为可选的,2021/2/28,19,4.2.2 if,语句的一般形式,if(,表达式,),语句,1,else,语句,2 ,简单的语句,复合语句,另一个,if,语句,等,2021/2/28,20,最常用的,3,种,if,语句,形式,:,1.if(,表达式,),语句,1 (,没有,else,子句,),2.if(,表达式,),语句,1,else,语句,2 (,有,else,子句,),3.if,(表达式),语句,else if,(表达式)语句,else if,(表达式)语句,else if,(表达式)语句,else,语句,m+1,(,在,else,部分又嵌套了多层的,if,语句,),2021/2/28,21,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;,等价于,分号不能丢,2021/2/28,22,说明:,(1),整个,if,语句可写在多行上,也可写在一行上,但,都是一个整体,属于同一个语句,(2),“语句,1,”“语句,m,”是,if,中的内嵌语句,内嵌语句也可以是一个,if,语句,(3),“语句,1,”“语句,m,”可以是简单的语句,也可以是复合语句,2021/2/28,23,4.3,关系运算符和关系表达式,4.3.1,关系运算符及其优先次序,4.3.2,关系表达式,2021/2/28,24,4.3.1,关系运算符及其优先次序,关系运算符,:,用来对两个数值进行比较,的,比较运算符,语言提供种关系运算符:,(,小于,),=(,小于或等于,),(,大于,),=(,大于或等于,),=(,等于,),!=(,不等于,),优先级相同,(,高,),优先级相同,(,低,),2021/2/28,25,4.3.1,关系运算符及其优先次序,关系,、,算术,、,赋值运算符,的优先级,算术运算符,(,高,),赋值运算符,(,低,),关系运算符,2021/2/28,26,4.3.1,关系运算符及其优先次序,ca+b,等效于,c(a+b),ab=c,等效于,(ab)=c,a=bc,等效于,a=(bc,等效于,a=(bc),2021/2/28,27,4.3.2,关系表达式,关系表达式,用关系运算符将两个数值或数值表达式连接起来的式子,关系表达式的值是一个逻辑值,即“真”或“假”,在,C,的逻辑运算中,以“”代表“真”,以“”代表“假”,2021/2/28,28,4.4,逻辑运算符和逻辑表达式,4.4.1,逻辑运算符及其优先次序,4.4.2,逻辑表达式,4.4.3,逻辑型变量,2021/2/28,29,4.4.1,逻辑运算符及其优先次序,3,种逻辑运算符:,&,(,逻辑与,),|,(,逻辑或,),!,(,逻辑非,),&,和,|,是双目,(,元,),运算符,!,是一目,(,元,),运算符,逻辑表达式,用逻辑运算符将关系表达式或其他逻辑量连接起来的式子,2021/2/28,30,4.4.1,逻辑运算符及其优先次序,判断,年龄,在,13,至,17,岁,之内?,age=13&ageb),max=a;,else,max=b;,max=(a b)?a:b;,条件运算符,2021/2/28,38,4.5,条件运算符和条件表达式,有一种,if,语句,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值,如:,if(ab),max=a;,else,max=b;,max=(a b)?a:b;,条件,表达式,2021/2/28,39,4.5,条件运算符和条件表达式,条件表达式的一般形式为,表达式?表达式,:,表达式,2021/2/28,40,4.5,条件运算符和条件表达式,条件运算符的执行顺序:,求解表达式,1,若为非,0,(真)则求解表达式,2,,此时表达式,2,的值就作为整个条件表达式的值,若表达式,1,的值为,0,(假),则求解表达式,3,,表达式,3,的值就是整个条件表达式的值,2021/2/28,41,4.5,条件运算符和条件表达式,条件运算符优先于赋值运算符,条件运算符的结合方向为“自右至左”,以下为合法的使用方法:,ab?(max=a):(max=b);,ab?printf(“%d”,a):printf(“%d”,b);,2021/2/28,42,4.5,条件运算符和条件表达式,例,4.4,输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。,2021/2/28,43,4.5,条件运算符和条件表达式,解题思路:用条件表达式来处理,当字母是大写时,转换成小写字母,否则不转换,2021/2/28,44,4.5,条件运算符和条件表达式,#include,int main(),char ch;,scanf(%c,ch=(ch=A,printf(%cn,ch);,return 0;,2021/2/28,45,4.6,选择结构的嵌套,在,if,语句中又包含一个或多个,if,语句称为,if,语句的嵌套,一般形式:,if(),if(),语句,1,else,语句,2,else,if(),语句,3,else,语句,4,内嵌,if,else,总是与它上面最近的未配对的,if,配对,2021/2/28,46,4.6,选择结构的嵌套,在,if,语句中又包含一个或多个,if,语句称为,if,语句的嵌套,if(),if(),语句,1,else,语句,2,内嵌,if,限定了内嵌,if,范围,2021/2/28,47,4.6,选择结构的嵌套,例,4.5,有一函数,:,编一程序,,,输入一个,x,值,,,要求输出相应的,y,值。,2021/2/28,48,4.6,选择结构的嵌套,解题思路:,用,if,语句检查,x,的值,根据,x,的值决定赋予,y,的值,由于,y,的可能值不是两个而是三个,因此不可能只用一个简单的,(,无内嵌,if),的,if,语句来实现,2021/2/28,49,4.6,选择结构的嵌套,解题思路:,方法,1,(1),先后用,3,个独立的,if,语句处理:,输入,x,若,x 0,则,y=1,输出,x,和,y,scanf(%d,if(x0)y=1;,printf(x=%d,y=%dn,x,y);,2021/2/28,50,4.6,选择结构的嵌套,解题思路:,方法,2,(2),用一个嵌套的,if,语句处理:,输入,x,若,x 0,则,y=-1,否则,若,x=0,则,y=0,否则,y=1,输出,x,和,y,scanf(%d,if(x0)y=-1;,else,if(x=0)y=0;,else y=1;,printf(x=%d,y=%dn,x,y);,2021/2/28,51,4.6,选择结构的嵌套,解题思路:,方法,2,(2),用一个嵌套的,if,语句处理:,输入,x,若,x 0,则,y=-1,否则,若,x=0,则,y=0,否则,y=1,输出,x,和,y,scanf(%d,if(x=0),if(x0)y=1;,else y=0;,else y=-1;,printf(x=%d,y=%dn,x,y);,提倡,内嵌,if,放在,else,中,2021/2/28,52,4.7,用,switch,语句实现多分支选择结构,switch,语句用来实现多分支选择结构,学生成绩分类,85,分以上为,A,等,70,84,分为,B,等,60,69,分为,C,等,人口统计分类,按年龄分为老、中、青、少、儿童,2021/2/28,53,4.7,用,switch,语句实现多分支选择结构,例,4.6,要求按照考试成绩的等级输出百分制分数段,,A,等为,85,分以上,,B,等为,70,84,分,,C,等为,60,69,分,,D,等为,60,分以下。成绩的等级由键盘输入。,2021/2/28,54,4.7,用,switch,语句实现多分支选择结构,解题思路:,判断出,这是一个多分支选择问题,根据百分制分数将学生成绩分为,4,个等级,如果用,if,语句,,,至少要用,3,层嵌套的,if,,进行,3,次检查判断,用,switch,语句进行一次检查即可得到结果,2021/2/28,55,#include,int main(),char grade;,scanf(%c,printf(Your score:);,switch(grade),case A:printf(85,100n);break;,case B:printf(70,84n);break;,case C:printf(60,69n);break;,case D:printf(60n);break;,default:printf(enter data error!n);,return 0;,值为,A,2021/2/28,56,switch,语句的作用是根据表达式的值,使流程跳转到不同的语句,switch,语句的一般形式,:,switch,(表达式),case,常量,1,:语句,1,case,常量,2,:语句,2,case,常量,n,:语句,n,default :,语句,n+1,整数类型,(,包括字符型,),2021/2/28,57,switch,语句的作用是根据表达式的值,使流程跳转到不同的语句,switch,语句的一般形式,:,switch,(表达式),case,常量,1,:语句,1,case,常量,2,:语句,2,case,常量,n,:语句,n,default :,语句,n+1,不能相同,2021/2/28,58,scanf(%c,printf(Your score:);,switch(grade),case A:printf(85,100n);break;,case B:printf(70,84n);break;,case C:printf(60,69n);break;,case D:printf(60n);break;,default:printf(enter data error!n);,2021/2/28,59,scanf(%c,printf(Your score:);,switch(grade),case A:printf(85,100n);break;,case B:printf(70,84n);break;,case C:printf(60,69n);break;,case D:printf(60n);break;,default:printf(enter data error!n);,2021/2/28,60,scanf(%c,printf(Your score:);,switch(grade),case A:,case B:,case C:printf(60,69n);break;,case D:printf(60n);break;,default:printf(enter data error!n);,2021/2/28,61,例,4.7,编写程序,用,switch,语句处理菜单命令。,解题思路:在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个,A,或,a,字符,就会执行,A,操作,输入一个,B,或,b,字符,就会执行,B,操作,等等。,2021/2/28,62,#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);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);,2021/2/28,63,#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);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);,2021/2/28,64,#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);break;,case b:,case B:action2(a,b);break;,default:putchar(a);,return 0;,输入其他字符,发出警告,2021/2/28,65,4.8,选择结构程序综合举例,例,4.8,,,4.9,(自学),2021/2/28,66,例,4.10,运输公司对用户计算运输费用。路程,(s km,)越远,每吨千米运费越低。,标准如下:,s 250,没有折扣,250,s 500 2,折扣,500,s 1000 5,折扣,1000,s 2000 8,折扣,2000,s 3000 10,折扣,3000,s 15,折扣,2021/2/28,67,解题思路:,设每吨每千米货物的基本运费为,p,,货物重为,w,,距离为,s,,折扣为,d,总运费,f,的计算公式为,f=p,w,s,(1-d),2021/2/28,68,折扣的变化规律,(参见教材,图,4.15,),:,折扣的“变化点”都是,250,的倍数,在横轴上加一种坐标,c,,,c,的值为,s/250,c,代表,250,的倍数,当,c1,时,表示,s250,,无折扣,1,c2,时,表示,250,s500,,折扣,d=2,2,c4,时,,d=5,;,4,c8,时,,d=8,;,8,c=3000)c=12;,else c=s/250;,输入单价、重量、距离,2021/2/28,70,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;,2021/2/28,71,f=p*w*s*(1-d/100);,printf(“freight=%10.2fn”,f);,return 0;,2021/2/28,72,
展开阅读全文