资源描述
,*,第四章,选择结构程序设计,几种选择结构,if,(,7,座以下客车辆)通过,1,号收费通道,;,else if,(,7,座以上客车辆)通过,2,号收费通道,;,else if,(军车牌照车辆)通过,3,号收费通道,;,else if,(本地牌照车辆)通过,4,号收费通道,;,else,通过,5,号收费通道,;,继续前行,;,if,(载客车辆)走左路,;,else,走右路,;,继续前行,;,if,(加油、停车休息等)进行相应服务,继续前行,;,单分支选择结构,双分支选择结构,多分支选择结构,本章要点,if,语句基本形式,条件判断,多分支选择结构,编程举例,(1)if(,表达式,),语句,例,1,:,if(x,y),printf(“%d”,x,);,例,2,:,if(x,!=0),y=6/(2*x);,printf(“y,=%,fn”,y,);,4.1,if,语句的基本形式,(2)if(,表达式,),语句,1,else,语句,2,例,1,:,if(x,=0),printf,(“,分母为,0,,无解!”,);,else,y=6/(2*x);,printf(“y,=%,fn”,y,);,例,2,:,if(x0),printf(“%d”,x,);n+;,else s=,s+x,;,例,4.1,:,输入两个学生,a,和,b,的成绩,输出其中高的成绩。,算法:,法一:比较两成绩,输出高的成绩。,法二:将较高的成绩存入一个变量,max,中,最后输出,max,的值。,举例:,编写程序:,#include,void main(),float,a,b,max,;,scanf(%f,%f,&a,&b,);,if(a,=b),max=a;,else,max=b;,printf(max,=%6.2fn,max);,双分支选择结构,#include,void main(),float,a,b,max,;,scanf(%f,%f,&a,&b,);,if(a,=b),max=a;,if(a,b),max=b;,printf(max,=%6.2fn,max);,或,使用单分支选择结构,条件相互排斥,例,4.2,:,输入,3,个成绩,a,b,c,,要求按由高到低的顺序输出。,算法:,1.if a b,将,a,和,b,对换 ,2.if a c,将,a,和,c,对换 ,3.if b c,将,b,和,c,对换,4.,输出,a,b,c,的值,编写程序:,#include,void main(),float,a,b,c,t,;,scanf(%f,%f,%f,&a,&b,&c,);,if(a,b),t=,a;a,=,b;b,=t;,if(a,c),t=,a;a,=,c;c,=t;,if(b,b,则打印,a,。,(,需要判断,a,是否大于,b),4.2.1,条件判断的含义,重要说明:,条件判断解决“,如果,那么,否则,”,这样的问题。,条件判断的结果是一个逻辑值:“,是,”或“,否,”。,“,是,”用“,1”,表示,“,否,”用“,0”,表示,优先级相同(高),优先级相同(低),说明:,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符,4.2.2,关系运算符和关系表达式,1,、关系运算符及其优先次序,(,小于,),=(,小于或等于,),(,大于,),=(,大于或等于,),=(,等于,),!=(,不等于,),括号,(),!+,,,-,,,sizeof,*,/,%,+,-,=,=,!=,位运算,&,|,?:,赋值运算,逗号运算,2.,关系表达式,运算量:,算术表达式,逻辑表达式,,赋值表达式,字符表达式,例:,a+b,b+c,(ab)(b(b=5),ab”,的值为“真”,表达式的值为,1,。,C,语言中没有专用的逻辑值,,1,代表真,,0,代表假,4.2.3,逻辑运算符和逻辑表达式,1.,逻辑运算符及其优先次序,&(,逻辑与,),相当于其他语言中的,AND,|(,逻辑或,),相当于其他语言中的,OR,!(,逻辑非,),相当于其他语言中的,NOT,例:,a&b,若,a,b,为真,则,a&b,为真。,a|b,若,a,b,之一为真,则,a|b,为真。,!,a,若,a,为真,则,!a,为假。,优先次序:,!,(,非,),&(,与,),|(,或,),“,&”,和“,|”,低于关系运算符,,“,!”,高于算术运算符,2.,逻辑表达式,运算符:逻辑运算符,运算量:关系表达式、逻辑量(任意表达式),值:一个逻辑量“真”或“假”。,例:,设,a=4,,,b=5,:,!a,:,0,a&b,:,1,a|b,:,1 !,a|b,:,1,4&0|2,:,1,非,0,:真,0,:假,例:,53&84-!0,自左向右运算,1&0,逻辑值为,0,83,逻辑值为,1,表达式值为,0,短路计算:,(1)a&b&c,只有,a,为真时,才需要判断,b,的值,只有,a,和,b,都为真时,才需要判断,c,的值。,(2)a|b|c,只要,a,为真,就不必判断,b,和,c,的值,只有,a,为假,才判断,b,。,a,和,b,都为假才判断,c,例,:,若,a=1,b=2,c=3,d=4,m=1,n=1,逻辑表达式:,(m=a,b)&(n,=cd),执行后,变量,m,、,n,的值是多少?,用逻辑表达式来表示闰年的条件描述:,能被,4,整除,但不能被,100,整除。,能被,4,整除,又能被,400,整除,答,year%400=0|(year%4=0&year%100!=0),案,值为真,(1),是闰年,否则为非闰年。,讨论:,!(year%400=0|(year%4=0&year%100!=0),(year%4!=0)|(year%100=0&year%400!=0),请注意不同运算符(,%,!=,&,=,)的运算优先次序!,4.3,多分支选择结构,if,嵌套,if(),if(),语句,1,else,语句,2,else,if(),语句,3,else,语句,4,if,嵌套:选择结构中又包含一个或多个选择结构。格式为:,例:,if(x,0),if(a,b&b,!=0),y=b,else,y=a,else,if(ac)y=0,else y=1,例,4.3,:,为促销,对购买货物多的顾客有优惠:凡买,50,件以上,(,含,50,件,),的优惠,5%,,买,100,件以上,(,含,100,件,),的优惠,7.5%,,买,300,件以上,(,含,300,件,),的优惠,10%,,买,500,件以上,(,含,500,件,),的优惠,15%,。输入购买的数量和单价,输出应付货款。,解题思路:,解此题的关键是写出判断货物折扣的选择结构。,在一个选择结构中又包含另一个选择结构,共有,4,层选择结构。,据题意有以下描述:,应付货款,=,件数*单价*,(1-,优惠折扣,),编写程序,。,#include,#include,void main(),int,number;,double,cost,price,total,;,printf(please,enter number and price:);,scanf(%d,%lf,&number,&price,);,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;,total=number*price*(1-cost);,printf(Total,=%10.2fn,total);,允许用以下形式的,if,语句来代替上述结构:,if,(表达式)语句,else if,(表达式)语句,else if,(表达式)语句,else if,(表达式)语句,else,语句,n,改写程序。,#include,#include,void main(),int,number;,double,cost,price,total,;,scanf(%d,%lf,&number,&price,);,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;,total=number*price*(1-cost);,printf(Total,=%10.2fn,total);,4.3,多分支选择结构,switch,语句,实际问题:,百分制成绩转换成等级制成绩,switch,语句的一般形式:,switch,(表达式),case,常量表达式:语句,case,常量表达式:语句,case,常量表达式:语句,default,:语句,例:,#include stdio.h,void main(),int m;,scanf(%d,switch(m/10),case,10,:,printf(优秀n);,case,9,:,printf(优秀n);,case,8,:,printf(良好n);,case,7,:,printf(中等n);,case,6,:,printf(及格n);,default:,printf(不及格n);,各表达式值应为,整型或字符型,数据,break,语句的功能,:,使流程跳出,switch,结构,switch,(m/10),case,10:,printf,(,“,优秀,n,”,);,break;,case,9:,printf,(,优秀,n);,break;,case,8:,printf,(,良好,n);,break;,case,7:,printf,(,中等,n);,break;,case,6:,printf,(,及格,n);,break;,default,:,printf,(,不及格,n);,例,4.4,:,运输公司对用户计算运费。,路程()越远,每吨每公里运费越低。标准如下:,没有折扣,折扣,折扣,折扣,折扣,折扣,设每公里每吨货物的基本运费为,货物重为,,距离为,折扣为,则总运费的计算公式为:,*(),可以使用下面?,switch (s),case 1,:,case 2,:,case 3,:,S,的可能取值太多,无法逐一书写,分析折扣变化的规律性:,折扣的“变化点”都是的倍数,换用表达式,s/250,(整除),观察它的取值情况:,s,250,250,500,500s,1000,1000s,2000,2000s,3000,3000s,S,取值,1,2,3,4,5,249,250,251,252,499,500,501,502,999,1001,1002,1999,s/250,取值,0,1,2,,,3,4,,,5,,,6,,,7,8,,,9,,,10,,,11,12,,,13,,,14,,,折扣,0,2%,5%,8%,10%,15%,#include void main()int c,s;float p,w,d,f;scanf(%f,%f,%d,4.4,程序综合举例,例,4.5,写程序,判断某一年是否闰年。,解题思路:,设置标志变量,leap,,记录是否是闰年;,判断结束后,根据,leap,的值输出相应信息。,#include void main(),int,year,leap;,scanf(,“,%d,”,&year,);,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);,例,4.6,:求,ax,2,+bx+c=0,方程的解。,基本算法:,a=0,,不是二次方程。,b,2,-4ac=0,,有两个相等实根。,b,2,-4ac0,,
展开阅读全文