C语言教案ch5选择结构

上传人:小*** 文档编号:243158323 上传时间:2024-09-17 格式:PPT 页数:33 大小:665KB
返回 下载 相关 举报
C语言教案ch5选择结构_第1页
第1页 / 共33页
C语言教案ch5选择结构_第2页
第2页 / 共33页
C语言教案ch5选择结构_第3页
第3页 / 共33页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C,程序设计(第三版),-,教学,课件,制作人,:,黄 荧,制作人单位,:,河师大数学与信息科学学院,第五章 选择结构程序设计,本章主要内容,:,1,关系表达式和逻辑表达式,用于表达,选择条件,2,选择结构控制语句,(,重点,!),(if switch ),3,条件运算表达式,( ? : ),4,选择结构程序的典型算法,(,重点,!),选择结构的程序设计能解决的问题,在一个实际问题中,有多种情况,可能,发生,.,解决这类问题就需要用,选择结构,的程序设计,.,问题要素,:,1,在实际问题,有几种不同的可能情况,相应的选择结构,就有几个分支,.,2,各种情况发生的条件,就是选择结构中的,选择控制条件,.,3,在执行选择结构时,首先是判断,选择控制条件,,然后根据判断的结果执行不同的分支,.,5.1,关系表达式,常用于描述比较简单的选择控制条件,关系运算符,:,、,、, =,、,=,、,!=,优先级别,:,高 低,算术运算符,(,高,),关系运算符,赋值运算符,(,低,),如, c,a+b,c,(,a+b,),2,关系表达式与关系表达式的值,关系表达式,:,用关系运算符把两个表达式连接的式子。,关系表达式的值,:,真 (,1,)假(,0,),练习,设,a=2,b=5,c=a,,求下列表达式的值,1) c,a+b,2) a,=,bc,3) a,=,bc,1,0,1,5.2,逻辑表达式,常用于描述比较复杂的选择控制条件,逻辑运算符,:,& (,与,),,,| (,或,),,,! (,非,),(运算规则见,P90,真值表),优先级别,:,! (,高,),&,| (,低,),! (,非,),(,最高,),算术运算符,关系运算符,& (,与,),| (,或,),赋值运算符,(,最低,),逻辑表达式与逻辑表达式的值,:,逻辑表达式,:,如, (00),逻辑表达式的值,:,真(,1,),假(,0,),注意,:,1),任一个常量、变量、表达式都可以作为逻辑量,(,判断真假的量,),2),计算机,判断,时,:,非,0,(真),,0,(假),计算机,给值,时,:,真(,1,),假(,0,),3),逻辑运算的短路原则:,( a=b=c=5;),对于,a & b & c,来说,当,a,为,0,时,不再计算,b,c,:如, (a =0) & (b=1) & (c=2),。,对于,a | b | c,来说,当,a,为,1,时,不再计算,b,c,:如, (a =0) | (b=1) | (c=2),。,如,,a=4,时,,!a,a&-5,4|0,0,1,1,选择控制条件,描述练习,:,1 i,能被,8,整除,i%8=0,(思考,:=,写成,=,会出现什么情况?),2,i,是奇数,i%2=1,3,写出判断某年是否为闰年的表达式。,闰年,:,年份,year,能被,4,整除,但不能被,100,整除,;,或能被,400,整除,year%4=0 & year%100!=0 | year%400=0,4 |x|2,-2x & x2,或,fabs(x,)2,(思考,:,能写成,-2x=,A&ch,=0&chb),max=a;, 两分支选择,if,(,表达式,)语句,1,else,语句,2,如,:,if(a,b),max=a;,else,max=b;,关键词: 选择控制条件,A,P,真 假,B,A,P,真 假, 多分支选择,if,(,表达式,1,) 语句,1,else if,(,表达式,2,)语句,2,else if(,表达式,3),语句,3,else if(,表达式,n),语句,n,else,语句,n+1,S,n+1,S,n,P,n,真 假,S,2,P2,真 假,S,1,P,1,真 假,思考:什么情况下,可以执行到语句3?, 多分支的,if,语句,:,0.15 n500,0.1 500,n300,cost=0.075 300,n100,0.05 100,n50,0 n,50,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,(,表达式,1,) 语句,1,else if,(,表达式,2,)语句,2,else if(,表达式,3,),语句,3,else if(,表达式,n,),语句,n,else,语句,n+1,if,语句的相关说明,:,(1),描述,选择控制条件,的表达式可以是任意的数值表达式,如,1)if(,3,)printf(O.K.n);,2)if(,a,),printf(%c,%,dn,a,a,);,3),if(,x,),printf(x,非,0n);,else,printf(x,等于,0n); (,!,),(2) if,和,else,所带语句称为,内嵌语句,都带分号,!,(3),当,if,或,else,所带的是多条语句时,必须用大花括号括起来,.,如,if(a+b,c&b+c,a&c+a,b),s=(a+b+c)/2;,area=,sqrt(s,*(s-a)*(,s-b,)*(,s-c,);,printf,(,三角形面积,=%.2fn,area);,else,printf,(,这不是一个三角形,.n);,if,语句的应用实例,:,1,输入实数,x,求分段函数的值,:,f(x,)= 2x+1 x0,2x-1 x0,#include ,void main(),float,x,y,;,printf,(,请输入,x: );,scanf(%f,&x,);,if(x,0) y=2*x+1;,else y=2*x-1;,printf(f(%.2f)=%.2fn,x,y);,请输入,x:,2,f(2.00)=3.00,#include ,void main(),float,x,f(x,),;,printf,(,请输入,x: );,scanf(%f,&x,);,if(x,0),f(x,),=2*x+1;,else,f(x,),=2*x-1;,printf(f(%.2f)=%.2fn,x,f(x),);,x,if,语句的应用实例,:,2,计算分段函数,:,2x+1 x0,#include ,void main(),float,x,y,;,printf,(,请输入,x: );,scanf(%f,&x,);,if(x,0) y=2*x+1;,else,if(x,=0) y=0;,else y=2*x-1;,printf(f(%.2f)=%.2fn,x,y);,请输入,x:,0,f(0.00)=0.00,例,5.1 P93,输入两个实数,将它们,由小到大,排序,并输出。,#include ,void main(),float a,b,t;,printf,(,请输入,a,b:n,);,scanf(%f%f,&,a,&,b,);,if(a,b),t=a;a=b;b=t;,printf(%.2f,%.2fn,a,b);,请输入,a,b,:,3.6 -3.2,-3.20,3.60,算法分析,:,a b,如果,ab,就应该交换它们,!,怎么交换,?,(,问题的关键,),考虑,两杯饮料,输出结果,交换,a b,ab,真 假,输入,a b,思考:如果用 a=b;b=a;,代替t=a;a=b;b=t;有什么问题?,例,5.2,输入三个数,将它们,从小到大,排序,并输出。,思路分析,:,a b c,#include ,void main(),float a,b,c,t;,printf,(,请输入,a b,c:n,);,scanf(%f%f%f,&,a,&,b,&,c,);,if(a,b) t=a;a=b;b=t;,if(ac) t=a;a=c;c=t;,if(b,c) t=b;b=c;c=t;,printf(%.2f, %.2f,%.2fn,a,b,c);,请输入,a b c:,3 7 1 ,1.00,3.00,7.00,b c,算法尽量要有规律!,思考:四个数该怎么排序?,2 if,语句的嵌套:,P94,回顾,:,if,语句的一般形式为:,if,(,表达式)语句,1, else,语句,2 ,当语句,1,或语句,2,,仍为一个,if,语句,则称其为,if,语句的嵌套,。,如:,if ( x1) x+;,内嵌,if,语句,else,if,(,y,b,?a:b,;,if(a,b) max=a;,else max=b;,方便简捷,一般形式,:,例,输入,三个,实数,求它们的,最大值,并输出。,#include ,void main(),float,a,b,c,max,;,printf,(,请输入,a b,c:n,);,scanf(%f%f%f,&a,&b,&c,);,max=(a,b)?a:b,;,max=(max,c)?max:c,;,printf,(,最大值,=%.2fn,max);,算法分析,:,a b c,max,思考,:,1),对四个数该怎样求出最大值,?,2),对四个数不用条件运算符该怎样求出最大值,?,例,5.4,输入一个字符,,判别它是否为大写字母,如果是,将它转化为小写字母,如果不是,不转化,.,然后输出最后得到的字符。,#include ,void main(),char,ch,;,printf,(,请输入一个字符,: );,scanf(%c, &,ch,);,ch,=,(,ch,=,A&ch,=Z)?ch+32:ch,;,printf,(,转换后的字符是,:%,cn,ch,);,回顾,:,三种,if,语句和,条件运算符(?,:,),1,三种,if,语句,条件执行,if,(,表达式,)语句, 两分支选择,if,(,表达式,)语句,1,else,语句,2,多分支的,if,语句,if,(,表达式,1,) 语句,1,else if,(,表达式,2,)语句,2,else if(,表达式,3,),语句,3,else if(,表达式,n,),语句,n,else,语句,n+1,2,条件运算符(?,:,),#include ,void main(),float,a,b,c,max,;,printf,(,请输入,a b,c:n,);,scanf(%f%f%f,&a,&b,&c,);,max=,(a,b)?a:b,;,max=,(max,c)?max:c,;,printf,(,最大值,=%.2fn,max);,利用选择控制条件选择所执行的分支!,5.4,switch,语句,:,(,通常实现是,多分支,的选择结构,!),一般形式,:,switch (,开关表达式,),case,常量,表达式,1,:,语句,1 break;,case,常量,表达式,2,:,语句,2 break;,case,常量,表达式,3,:,语句,3 break;,case,常量,表达式,n,:,语句,n break;,default:,语句,n+1,它是利用开关表达式的值,来选择执行的分支,而不是条件!,学习要点,: 1),switch,语句的固定格式,2),switch,语句的执行过程,如,switch (,n,),case,2,:,f=,a+b,; break;,case,4,:,f=a-b; break;,case,6,:,f=a*b; break;,case,8,:,f=a/b; break;,default:,printf,(,数据,n,错误,.n);,整型、字符型或枚举型,例,1:,将等级分,(a b c d),转化为百分制的分数段。,#include ,void main(),char grade;,printf,(,请输入你的等级分,(,a,b,c,d,): );,scanf(%c,&grade,);,switch (,grade,),case ,a:,printf,(,你的分数为,:100-85n);,break;,case ,b:,printf,(,你的分数为,:84-70n);,break;,case ,c:,printf,(,你的分数为,:69-60n);,break;,case ,d:,printf,(,你的分数为,:60n);,break;,default:,printf,(,输入数据错误,n);,它是利用开关表达式的值来选择执行的分支,而不是条件!,题意分析,:,1,有几种可能情况,?,a b c d 4,种可能情况,2,程序应该有几个选择分支,?,选择分支,: 4,个或,4+1,个,(,default,),3,选择分支由什么值确定,?,开关表达式怎么设置,?,选择分支由,等级分,确定,!,用,放等级分的变量,作为,开关表达式,!,4,放等级分的变量应该是什么类型,?,char,类型,例,2,:输入,2008,年某个月份,输出这个月的天数。,题意分析:,1,),12,个月,12,个可能情况,2008,年:,1 2 3 4 5 6 7 8 9 10 11 12,31,29,31,30,31,30,31,31,30,31,30, 31,2,)可以分为三类:,1,3,5,7,8,10,12,月份的天数为,31,天,4,6,9,11,月份的天数为,30,天,2,月份的天数为,29,天,3),月份数控制选择分支,放月份数的变量,作为,开关表达式,#include ,void main(),int,month,days;,printf,(,请输入月份数,(1-12):);,scanf(%d,&,month,);,switch (,month,),case 4,:,case 6,:,case 9,:,case 11,:,days=30; break;,case 2,:,days=29; break;,default,:,days=31;,printf(%d,月有,%d,天,n,month,days,);,运行情况:,请输入月份数,(1-12):,9,9,月有,30,天,5.5,选择结构程序举例,例,5.5,编写程序,判别某一年是否闰年。,闰年条件,:,此年份能被,4,整除,但不能被,100,整除,;,或者能被,400,整除,.,分析,:,1,有几种可能情况,?,2,用哪个语句实现,?,#include ,void main(),int,year,isleap,;,printf,(,请输入年份数,: );,scanf(%d,&,year,);,isleap,=(year%4=0,&,year%100!=0)|(year%400=0);,if(isleap,),printf(%d,年是闰年,.n ,year);,else,printf(%d,年不是闰年,.,n,year,);,请输入年份数,:,2008,2008,年是闰年,.,输出不,是,闰年,输出,是,闰年,否,是,是否为闰年,输入年份数,例,5.6,求,ax,2,+bx+c=0,方程的解。,P101,问题分析,:,1,有几种可能情况,?,当,a=0,其不是二次方程。,当,a0,且,=0,,,有两个相同的实根,;,当,a0,且,0,,,有两个不同的实根,;,当,a0,且,0,有两共轭复根,.,即,求上方程的根有,4,种情况,.,2,用哪个语句实现,?,具体算法,:,1,输入方程系数,:,a,b,c,2,求出一些中间值,:,disc=b*b-4*a*c,p=-b/(2*a),q=sqrt(fabs(disc)/(2*a),3,利用,if,语句,求情况号码,n,4,用开关语句,根据情况号码值,转到相应的分支,计算并输出相应的结果,.,例,5.6,求,ax,2,+bx+c=0,方程的解。,#include ,#include ,void main( ),float a,b,c,disc,p,q,x1,x2 ;,int,n;,printf,(,请输入方程系数,a b,c:n,);,scanf(%f%f%f,&a,&b,&c,);,if(,fabs(a,)=1e-6,) n=1;,else,disc=b*b-4*a*,c;p,=-b/(2*a);,q=sqrt(fabs(disc)/(2*a);,if(,fabs(disc,)1e-6) n=3;,else n=4;,switch(,n,),case 1:,printf,(,这个方程不是二次的,.,n);,break,;,case 2:,printf,(,这个方程有两个相同的实根,:,%.2f,n,p);,break;,case 3:,printf,(,这个方程有两个不同的实根,:n);,printf(x1=,%.2f,n,p+q );,printf(x2=,%.2f,n,p-q );,break;,case 4:,printf,(,这个方程有两个复根,:n);,printf(x1=,%.2f,+,%.2f,i,n,p,q );,printf(x2=,%.2f,-,%.2f,i,n,p,q );,例,5.7,运输公司计算运费。(区段归类法!),问题分析,:,1,可能情况:,6,个区段,2,可以用什么语句,?,3,区段有什么规律?,能否,归类,?,区段端点是,250,的倍数,4,设计归类控制表达式,c,:,c=s/250 (,整除!,),if(s,=3000)c=12,0 s250km,2% 250s500,d=5% 500s1000,8% 1000s2000,10% 2000s3000,15% 3000s,其中:,s:,里程, d:,折扣率,总价,=,单价*重量*里程*,(1-,折扣率,),f=p.w.s.(1-d/100.0);,0 c=0,2% 1c2,d= 5% 2c4,8% 4c8,10% 8c=3000)c=12,归类后,,012,,,13,种情况,#include ,void main(),int,c,s;flaot,p,w,d,f,;,printf,(,请输入单价 重量 里程,:n);,scanf(%f%f%d,&p,&w,&s,);,if(s,=3000) c=12;,else c=s/250; /,区段归类,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.0);,printf,(,总运费,=%.4f(,元,),n,f,);,0 c=0,2% 1c2,d= 5% 2c4,8% 4c8,10% 8c100) p+=(I-100)*0.01; I=100; ,if(I60) p+=(I-60)*0.015;I=60; ,if(I40) p+=(I-40)*0.03;I=40; ,if(I20) p+=(I-20)*0.05;I=20; ,if(I10) p+=(I-10)*0.075;I=10; ,p+=I*0.1;,printf(,“,p=%.2,l,f(万元)n,p);,/*,读入,2,个数(,data1,和,data2),及一个表达式,data1 op data2,的值;其中,op,可为“,+”,;“,-”,;“*”;“,/”,用,switch,完成,要求,1,;运算数及运算符从键盘输入,2,;计算结果显示在屏幕上,*,/,#include ,int,main(),int,data1,data2,result;,char op;,printf(Input,data1 op data2 =: );,scanf(%d,%c %d,switch(op,),case +: result= data1+data2; break;,case -: result= data1-data2; break;,case *: result= data1*data2; break;,case /: result= data1/data2; break;,default:,printf(ERROR!n,); return 0;,printf(%dn, result);,return 0;,/*,读入,2,个数(,data1,和,data2),及一个表达式,data1 op data2,的值;其中,op,可为“,+”,;“,-”,;“*”;“,/”,用,switch,完成,要求,1,;运算数及运算符从键盘输入,2,;计算结果显示在屏幕上,*,/,#include ,int,main(),int,data1,data2,result;,char op;,printf(Input,data1 op data2 =: );,scanf(%d,%c %d,switch(op,),case +: result= data1+data2; break;,case -: result= data1-data2; break;,case *: result= data1*data2; break;,case /: if(data2!=0) result= data1/data2; break,; /if(data2!=0),if(data2),default:,printf(ERROR!n,); return 0;,printf(%dn, result);,return 0;,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!