资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,语言选择结构,(优选)语言第章选择结构,if,语句实现选择结构,switch,语句,实现,选择结构,程序综合举例,第,3,章,(续),选择结构,if,语句实现选择结构,if,语句实现选择结构,的,举例,if,语句的一般形式,嵌套的,if,语句,用,if,语句实现选择结构举例,#include,int main(),int a,b,max;,printf(please enter a and b:);,scanf(%d,%d,if(a=b)max=a;,if(ba)max=b;,printf(max=%dn,max);,return 0;,max=a,真,假,a,b,max=b,真,假,b,a,please enter a and b:,67,,,95,max=95,if(a=b)max=a;,else max=b;,【,例,】,输入,两个整数a和,b,,输出其中,较大值,。,简单,if,语句,(,不含,else),if(,表达式,),语句,段,如:,if(xy)printf(”xy”);,if,语句,实现的选择结构,语句段,非,0,(真),表达式,0,(假),单分支结构,【例】,出门带伞问题,如果下雨,带伞后出门,否则,直接出门。编程模拟。,是否下雨,是,否,带上雨伞,出门,#include,int main(),int flag;,/,标志位,取,1,或,0,scanf(“%d”,if(flag=1),printf(“,下雨带伞,”);,printf(“,出门,”);,return 0;,【例】,检查一辆车的行驶速度,如果速度超过,120km/h,或低于,40km/h,,则发出警告。,输入车牌号和速度,速度,120,提示太快,速度,120,速度,HIGHLIMIT),printf(“car%d is too fast.”,idnum);,if(speedLOWLIMIT),printf(“car%d is too slow.”,idnum);,return 0;,运行结果,:,请输入车牌号和速度,:100 250.7,car 100 is too fast.,运行结果,:,请输入车牌号和速度,:110 30,car 110 is too slow.,if,语句,实例,【例】,输入,a,b,c,,求三个数中的最大数。,算法设计:,输入,a,b,c,将,a,b,c,中任一数作为,max,,如,max=a;,max,依次与,b,c,比较,若有比,max,大的,对,max,重新赋值,#include,int main(),int a,b,c,max;,scanf(“%d%d%d”,max=a;/,此处赋值可以用任意整数吗?,if(maxb)max=b;,if(maxb,,,a,和,b,对换,(,a,是,a,、,b,中的,小,者),若,ac,,,a,和,c,对换,(,a,是三者中最,小,者),若,bc,,,b,和,c,对换,(,b,是三者中次,小,者,),输出,a,,,b,,,c,的值,输入,a,b,c,ab?,交换,a,和,b,真,假,ac?,交换,a,和,c,真,假,bc?,真,假,交换,b,和,c,输出,a,b,c,实例流程图,#include,int main(),int a,b,c,t;,printf(please enter a,b,c:);,scanf(%d,%d,%d,if(ab),t=a;a=b;b=t;/*,实现,ab,互换*,/,if(ac),t=a;a=c;c=t;/*,实现,ac,互换*,/,if(bc),t=b;b=c;c=t;/*,实现,bc,互换*,/,printf(%d,%d,%dn,a,b,c);,return 0;,please enter a,b,c:,25,9,16,9,16,25,不借助中间变量的交换,:,a=a+b;,b=a-b;,a=a-b;,if-else,语句,if(,表达式,),语句,段,1,else,语句,段,2,if(xy)printf(”xy”);,else printf(”xb)max=a;else max=b;,if(ab)max=a;,else max=b;,if(ab),max=a;,else,max=b;,推荐写法,这样层次结构更清晰,【例】,上完体育课,如果是上午最后一节课,下课后去食堂吃饭,否则进教室上课。,上完体育课,最后一节课,是,否,到食堂吃饭,进教室上课,#include,int main(),int flag;,/,非,0,为真;,0,为假,scanf(“%d”,if(flag!=0),printf(“,食堂吃饭,”);,else,printf(“,进教室上课,”);,return 0;,if,语句的,使用说明,if(a=b&x=y)/*,逻辑表达式*,/,printf(”a=b,x=y”);,if,后面的表达式,一般为逻辑表达式或关系表达,式,也可以是一个变量、常量或函数调用。,if(1)printf(”O.K.”);/*,表达式为常量*,/,if(a)printf(”%d”,a);/*,表达式为变量*,/,if(isprime(a)/*,表达式为函数调用*,/,if,语句的,使用说明,if(x0)printf(”%f”,x);,else printf(”%f”,-x);,if,语句各子句若仅有一条语句,则每个内嵌语句,遇分号结束。,若内嵌语句包含多个语句时,必须用花括号“,”,括起来形成一个复合语句。,if(ab),t=a;a=b;b=t;,建议:内嵌语句无论一条或多条,都用“,”,括起来。,if,语句的,使用说明,if(x0)printf(”%f”,x);,else printf(”%f”,-x);,else,子句不能单独使用,必须与,if,配对使用,常见错误:,if(x0);printf(“%f”,x);,if(x0)printf(“x0”);,else(x0)printf(“x0?,输出,x,真,假,if,语句的,使用说明,判断某数是偶数还是奇数。,方法一:,if(x%2=0),printf(,“,%d,是偶数,”,x);,else,printf(,“,%d,是奇数,”,x);,方法二:,if(x%2=0),printf(,“,%d,是偶数,”,x);,if(x%2=1),printf(,“,%d,是奇数,”,x);,比较两种结构,一样吗?哪种更好?,if,语句,实例,【例】,输入,三角形的边长,,求三角形的面积。,算法及流程图:,输入三角形的边长;,判断能够组成三角形,如是则继续,否则,输出提示“不构成三角形”;,利用海伦公式求面积;,输出三角形的面积;,输入边长,构成三角形,?,真,海伦公式计算,三角形面积,输出面积,输出提示,结束,假,#include,#include,int main(),double a,b,c,s,area;,printf(please enter a,b,c:);,scanf(%lf,%lf,%lf,if(a+bc&b+ca&c+ab),/*,能构成三角形*,/,s=0.5*(a+b+c);,area=sqrt(s*(s-a)*(s-b)*(s-c);,printf(area=%6.2fn,area);,else printf(“It is not a triangle.n”);,/*,不能构成三角形*,/,return 0;,please enter a,b,c:2,3,4,area=2.90,please enter a,b,c:2,3,6,It is not a triangle.,【,例,】,输入实数,x,,求分段函数的值,:,#include,int main(),float x,y;,/,此处不能定义,float f(x),printf(,请输入,x:,);,scanf(%f,if(x0)printf(%f,n),else printf(%f,-n);,判一判:哪个表述正确?,2.if(n0)n=n+m;printf(%f,n);,else printf(%f,-n);,3.if(n0)n=n+m;printf(%f,n);,else printf(%f,-n);,4.if(n0)n=n+m;printf(%f,n);,else printf(%f,-n);,正确,嵌套的,if,语句,if,语句中可以又包括另一个,if,语句,,称为,if,语句的嵌套,一般形式:,if(),if(),语句,1 ,else,if(),语句,3 ,内嵌,if,if,或,else,子句中嵌套不具有,else,的,if,语句,嵌套的,if,语句,if(),if(),语句,1,else,语句,2,else,if(),语句,3,else,语句,4,内嵌,if,if,或,else,子句中嵌套具有,else,的,if,语句,嵌套的,if,语句,多层嵌套,if(,表达式,1),语句,1,else if(,表达式,2),语句,2,else if(,表达式,3),语句,3,else if(,表达式,4),语句,4,else,语句,n,if(expr1),if(expr2)statement1,else statement2,else,if(expr3)statement3,else statement4,内嵌,if,内嵌,if,if(expr1),if(expr2),statement1,else,statement2,内嵌,if,if(expr1),if(expr2),statement1,else,statement2,内嵌,if,if(expr1),statement1,else,if(expr2),statement2,else,statement3,内嵌,if,嵌套的,if,语句,嵌套的,if,语句,【例】,y=-1+2*x,x0,真,假,y=-1+3*x,y=-1,输出,y,x0)y=-1+3*x;,else if(x=0),if(x0),y=-1+3*x;,else y=-1;,else,y=-1+2*x;,printf(“y=%dn“,y);,return 0;,方法二,if-else,的匹配规则:缺省,时,,else,总是和它上面离它最近的未配对的,if,配对。,if(),if(),if(),else.,else.,else.,if(n6),if(n12),printf(“6n12”);,else,printf(“n6),if(n12),printf(“6n12”);,else,printf(“n0),printf(“X is positive.”);,x=x+1;,else,printf(“X is negative.”);,缩进,缩进,缩进,【例】促销,时,对购买货物多的顾客有优惠:凡买,50,件以上的优惠,5%,,买,100,件以上的优惠,7.5%,,买,300,件以上的优惠,10%,,买,500,件以上的优惠,15%,。,输入购买的数量和单价,输出应付货款。,嵌套的,if,语句,if(number=50&number=100&number=300&number=500),cost=0.15;,方法一:,注意,存在问题:对于每个,number,,程序都要进行区间的判断,效率不高;,折扣,15%,真,假,件数,500,件数,300,真,假,折扣,10%,件数,100,真,假,折扣,7.5%,件数,50,真,假,折扣,5%,无折扣,嵌套的,if,语句,方法二,:,N,S,图,#include,#include,int main(),int number;,double cost,price,total;,printf(“enter number and price:);,scanf(%d,%lf,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);,return 0;,enter number and price:,512,821.5,Total=357516.80,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;,【例】,判定学生成绩,实现从键盘输入一个百分制,的成绩,输出相应的等级,优(,90,100,)、良,(80,90),、中等,(70,80),、及格,(60,70),、差,(0,60),。,int main(),int score;,printf(“input scores:n”);,scanf(“%d”,if(score100),printf(“errorn”);,else if(score60)printf(“,差,n”);,else if(score70)printf(“,及格,n”);,else if(score80)printf(“,中等,n”);,else if(score60n”);,break;,switch,语句实现,的,选择结构,允许:,case 3+4:,但不允许:,x=3;y=4;,case x+y:,【,例,】,执行下列程序段,当分别输入,A,、,C,时,求,k,的值。,char c;,int k=2;,c=getchar();,/,输入单字符,switch(c-A)case 0:k+;,case 1:k+=2;break;,default:k*=k;,case 4:k*=3;,printf(“k=%d”,k);,运行,1,:,A,k=5,运行,2,:,C,k=12,grade,输出,A,90-100,80-89,输出,B,输出,C,输出,D,输出,E,60-69,60,switch,语句实现,的,选择结构,70-79,switch(grade/10),case 10:,case 9:printf(”An”);,case 8:printf(”Bn”);,case 7:printf(”Cn”);,case 6:printf(”Dn”);,default:printf(”En”);,break;,break;,break;,break;,switch,语句实现,的,选择结构,switch,语句实现,的,选择结构,【,例,】,:输入一个数字,如果该数字是,17,,则分别输出星期一,星期日的英文单词,否则,提示输出错误。,#include ,int main(),int day;,printf(“Input integer number:);,scanf(%d,switch(day),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;,运行结果:,Input integer number:6,Saturday,Sunday,error,/,修改后程序,switch(day),case 1:printf(Mondayn);break;,case 2:printf(Tuesdayn);break;,case 6:printf(Saturdayn);break;,case 7:printf(Sundayn);break;,default:printf(errorn);,【,例,】,输入一个字符,如果是,Y,或,y,,,N,或,n,,则分别输出相应提示,如果是其他字母则输出其它提示。,#include,int main(),char ch;,printf(“please input a character:”);,scanf(“%c”,/,也可以用,ch=getchar(),switch(ch),case y:,case Y:printf(“this is Y or y”);break;,case n:,case N:printf(“this is N or n”);break;,default:printf(“this is other char.”);,return 0;,嵌套的,switch,结构,int main(),int i=1,j=2;,switch(i)/,嵌套的,switch,结构,case 1:printf(case 1 in outern);,case 2:printf(case 2 in outern);,switch(j),case 1:printf(case 1 in innern);,case 2:printf(case 2 in innern);,case 3:printf(case 3 in outern);,return 0;,运行结果:,case 1 in outer,case 2 in outer,case 2 in inner,case 3 in outer,if,和,switch,结构的比较,switch,语句只能对等值进行测试,若测试值涉及,某个较大的范围,,if,语句适用。,switch,语句只能对整型数进行测试,如果对浮点,数进行测试,需要,if,语句。,若测试一个整型变量取几个不同值的情况,则用,switch,语句结构比较简明。,2fn,x,y);,y=-1+3*x;,else y=-1;,else if(scorec),int idnum;,scanf(“%d%lf”,printf(please enter a,b,c:);,int main(),else if(score=100&number300),printf(“errorn”);,case Y:printf(“this is Y or y”);break;,#include 0.001)c=a/b;break;,printf(%.1f%c%.1f=%.1f,a,oper,b,c);,return 0;,运行结果:,输入,a,、运算符和,b:,2.0+3.0,2.0+3.0=5.0,【,例,】,运输公司对用户计算运费,,,运输距离越,远,单位运费越低。,标准如下:,s250,没有折扣,250,s500 2,折扣,500,s1000 5,折扣,1000,s2000 8,折扣,2000,s3000 10,折扣,3000,s 15,折扣,程序综合举例,设每吨每千米货物的基本运费为,p,,货物重为,w,,距,离为,s,,折扣为,d,总运费,f,的计算公式为,f=p,w,s,(1-d),0,1,2 3,4 5 6 7,8 9 10 11,#include,int main(),int s;,double p,w,d,f;,printf(,请输入单价、重量和距离,:);,scanf(%lf,%lf,%d,switch(s/250),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;,default:d=15;break;,else y=-1;,#includestdio.,#includestdio.,#include stdio.,return 0;,else printf(”x0),if(x0),switch语句结构比较简明。,int a,b,c,max;,if语句实现选择结构的举例,else if(score1e-5&fabs(y)1e-5),/,取非零值,if(x0),if(y0),printf(“The point is in lst quadrant.n”);,else,printf(“The point is in 4th quadrant.n”);,else,if(y0),printf(“The point is in 2nd quadrant.n”);,else,printf(“The point is in 3rd quadrant.n”);,return 0;,程序运行结果:,Input the coordinate of point:(x,y),5.0,3.0,The point is in lst quadrant.,再次运行结果:,Input the coordinate of point:(x,y),-2.0,7.0,The point is in 2nd quadrant.,【,例,】,编写程序。输入一个整数,屏幕显示菜单:,然后根据所选菜单项,进行计算并输出结果。,#include,#include,int main(),float m;,int choose;,printf(“,输入任意一个整型数,:n”);,scanf(“%f”,printf(“*n”);,printf(“1.,输出相反数,n”);,printf(“2.,输出平方数,n”);,printf(“3.,输出平方根,n”);,printf(“4.,退出,n”);,printf(“*n”);,
展开阅读全文