《C语言程序设计课件0905选择结构程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件0905选择结构程序设计.ppt(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、选择结构程序设计课程:程序设计语言课程:程序设计语言教材:谭浩强教材:谭浩强C C程序设计第三版程序设计第三版教师:陈小荷教师:陈小荷本章重点n n掌握关系运算符、逻辑运算符的优先次序,理解条件表达式的意义。n n掌握if语句的四种形式,能针对具体问题正确运用。n n理解switch语句的控制结构,能正确运用。关系运算符 小于 大于 优先级高(6)=大于或等于=等于 优先级低(7)!=不等于关系表达式n n比较两个运算数,表达式成立则值为1(true),否则值为 0(false):x y /未知 x+5 x/1(true)x+5=x /1(true)关系运算符与算术运算符n n算术运算符的优先
2、级是算术运算符的优先级是3 3(乘除余)和(乘除余)和4 4(加减)(加减)n n以下两个表达式的值是多少?以下两个表达式的值是多少?10+(20 10)*10010+(20 10)*100n n以下四个表达式,如果要加括号,并且不能改变以下四个表达式,如果要加括号,并且不能改变原来的优先次序,应该怎么加?原来的优先次序,应该怎么加?10+20 25,10+20 z x*y z z=x y,z!=x y z 的值是多少?如果它们的值分别是 1、3、5 呢?n n数学书上 x y z 的意思是 x大于y,y大于z,这个意思用C语言来表达,应该是:x y&y z关系运算符和赋值运算符n n重温:赋
3、值运算符的优先级低(14)n nx=y z 等价于下面哪个表达式?(x=y)z x=(y z)n n若 x,y,z 的初值分别是 5,3,1,下面表达式的值是多少?x=y z 逻辑值表第一行是标题。以第二行为例,读法是:第一行是标题。以第二行为例,读法是:若若a a真真b b真,则非真,则非a a和非和非b b均假,均假,a&b a&b 为真,为真,a|b a|b 亦为真。亦为真。逻辑表达式求值是自左至右的,一旦发现已经可以根据一个运算数求逻辑表达式求值是自左至右的,一旦发现已经可以根据一个运算数求值,就不会再对第二个运算数求值。例如,在值,就不会再对第二个运算数求值。例如,在 a&b a&b
4、 中,如果已知中,如果已知a a假,则整个逻辑表达式为假,不必再考虑假,则整个逻辑表达式为假,不必再考虑b b的值的值逻辑运算符的优先级和结合方向n n逻辑反的结合方向是自右至左,其他逻辑运算符的结合方向均为自左至右n n逻辑非!,优先级2n n算术运算符,优先级3和4n n关系运算符,优先级6和7n n逻辑与&,优先级11n n逻辑或|,优先级12n n赋值运算符,优先级14表达式求值假定以下变量假定以下变量 a,b,c,d a,b,c,d 的值分别是的值分别是 0,1,2,3 0,1,2,3,变量变量 x x 和和 y y 的值未知,请对下列表达式求值:的值未知,请对下列表达式求值:n n
5、x=y&10 12 x=y&10=y&x!=xx=y&x!=xn na b|3 1 a b|3 1 n na x-1 a x-1 n na&b|c&d a&b|c&d n na&(b|c)&da&(b|c)&d表达式求值假定 a,b,c 的值分别是 3,4,5n n a+b c&b=cn n(a+b)c)&(b=c)n n a|b+c&b cn n!(a b)&!c|1n n!(x=a)&(y=b)&0n n!(a+b)+c 1&b+c/2练习写一些表达式n n判断是否“及格”(60分及格)n n判断是否“英文字母”n n判断是否“小写英文字母或阿拉伯数字”n n判断是否“能被4整除”n n判
6、断是否“能被4整除但不能被100整除”n n判断是否“闰年”形式1:if(e)s;n n是否执行s,取决于e的值 n nsample:输入g,0,两个printf语句的执行情况如何?#include if(isletter(ch)/*判断ch是否字母*/printf(“%c is a letter n”,ch);printf(“thank you.n”);形式2:if(e)s1;else s2;n ne的值非 0,执行 s1,否则执行 s2n nsample:输入g,0,两个printf 语句的执行情况如何?if(isletter(ch)printf(“%c is a letter n”,ch
7、);else printf(“%c is not a letter n”,ch);s 可以是一个复合语句n nsample:三个变量的排序(升序)if(ab)tmp=a;a=b;b=tmp;if(ac)tmp=a;a=c;c=tmp;if(bc)tmp=b;b=c;c=tmp;形式3:多分枝的if语句n n注意下面语句的逻辑关系:注意下面语句的逻辑关系:if(n500)cost=0.15;if(n500)cost=0.15;else if(n300)cost=0.10;else if(n300)cost=0.10;else if(n100)cost=0.075;else if(n100)cos
8、t=0.075;else if(n50)cost=0.05;else if(n50)cost=0.05;else const=0.0;else const=0.0;n n例如,第二行相当于说:例如,第二行相当于说:if(n300)cost=0.10;if(n300)cost=0.10;n n如果按如果按n n值从小到大的顺序来写多分枝的值从小到大的顺序来写多分枝的if if语句,语句,应该怎么写?应该怎么写?形式4:嵌套的if语句n nif(e)s1;else s2 if(e)s1;else s2 中,中,s1s1或或s2s2本身又是一个本身又是一个if if语句语句n n形式形式3 3也是嵌
9、套的也是嵌套的if if语句,但它总是在语句,但它总是在s2s2中嵌套中嵌套if(e)if(e)if(e1)s1;if(e1)s1;else s2;else s2;elseelseif(e2)s3;if(e2)s3;else s4;else s4;写法1if(x0)y=-1;if(x0)y=1;if(x0)y=1;语法、逻辑都没有错,语法、逻辑都没有错,运行也正确,但效率低运行也正确,但效率低写法2和写法3if(x0)y=-1;if(x=0)if(x=0)if(x0)y=1;if(x0)y=1;else y=0;else y=0;else y=-1;else y=-1;if与else的匹配原则
10、n n就近匹配:就近匹配:嵌套的嵌套的if if语句中,语句中,elseelse总是跟离它最近的上一个总是跟离它最近的上一个尚无匹配的尚无匹配的if if匹配,不管缩进形式是怎样的:匹配,不管缩进形式是怎样的:if(e)if(e)if(e1)s1;if(e1)s1;else s2;/*else s2;/*跟跟匹配匹配*/elseelse /*/*跟跟匹配匹配*/if(e2)s3;if(e2)s3;else s4;/*else s4;/*跟跟匹配匹配*/写法4和写法5y=-1;y=-1;if(x!=0)if(x!=0)if(x0)y=1;if(x0)y=1;else y=0;else y=0;y
11、=0;y=0;if(x=0)if(x=0)if(x0)y=1;if(x0)y=1;else y=-1;else y=-1;条件表达式n ne1?e2:e3n n其中,?:是一个条件运算符,三目的,优先级为13(高于赋值运算符),结合方向是自右至左n n条件表达式的值是这样计算的:n n先对e1求值n n如果e1的值非0,则条件表达式的值为e2n n否则,条件表达式的值为e3条件表达式的应用n n用于二分枝的选择结构,例如:用于二分枝的选择结构,例如:if(ch 128)return 0;if(ch 128)return 0;else return 1;else return 1;可写成以条件表
12、达式为宾语的返回语句:可写成以条件表达式为宾语的返回语句:return return ch 128?0:1ch=60)grade=Y;if(score=60)grade=Y;else grade=N;else grade=N;条件表达式的应用n n条件运算符是自右至左结合的,例如:y=x=0?0:x 0?1:-1相当于y=x=0?0:(x 0?1:-1)因此,条件表达式也可以用于多分枝选择n n不过,为了容易理解,一般应该用if语句来表达switch 语句n n多分枝选择多分枝选择:switchswitch(grade)(grade)casecase A:printf(“85 A:printf
13、(“85100”n”);100”n”);break;break;casecase B:printf(“70 B:printf(“7084n”);84n”);break;break;casecase C:printf(“60 C:printf(“6069”n”);69”n”);break;break;casecase D:printf(“60 n”);D:printf(“60 n”);break;break;defaultdefault :printf(“error n”);:printf(“error n”);switch语句与多分枝if语句的关系n n一般来说,能用一般来说,能用switch
14、switch语句的也能用多分枝语句的也能用多分枝if if语句语句来表达,例如:来表达,例如:if if(grade=A)printf(“85(grade=A)printf(“85100”n”);100”n”);else if(grade=B)printf(“70else if(grade=B)printf(“7084n”);84n”);else if(grade=C)printf(“60else if(grade=C)printf(“6069”n”);69”n”);else if(grade=D)printf(“60 n”);else if(grade=D)printf(“b)if(ac)r
15、eturn a;else return c;else if(bc)return b;else return c;int m=a;if(bm)m=b;if(cm)m=c;return m;你喜欢哪种写法?例5.6 求一元二次方程的根n n输入:系数a,b,cn n过程和输出:n na=0:不是一元二次方程n ndisc=b*b 4*a*c;n nif(disc绝对值近乎0)打印两个相等实根n nif(disc绝对值大于0)打印两个不等实根n nelse 打印两个共轭复根例5.6 教材分析n n程序的主体是一个嵌套的if语句,共有3层,层数多了,理解起来比较困难n n第一层的if只带一个语句,而e
16、lse却带了多层多个语句,不太般配n n第二层的if也只带一个语句,而else却带了多层多个语句,不太般配n n第三层的if和else,在层次和语句数量上比较均衡例5.6 程序修改基本思路:n n减少层次,尽量不用嵌套的if语句n nvoid函数中可以有多个return语句,因此,如果已经处理了某种情况,就可以及时返回,程序其余部分再处理其他情况n n例如,第一种情况,打印了“不是一元二次方程”之后,即可return,这样就省掉了一个层次n n请自行修改这个程序例5.7 运费计算可以有多种写法:n n如教材所示,用switch语句来写n n用多分枝if语句来写请比较两种写法,哪一种更好?(用简洁性、可读性等标准来衡量)本章小结n n关系运算和逻辑运算是理解选择结构和循环结构的基础n n四种if语句由简到繁:单分枝、二分枝、多分枝、嵌套,应尽量使用简单的形式n nswitch语句用于多分枝选择,case和default都是入口标号,一旦进入则顺流而下,除非遇到return语句和break语句n n条件表达式在许多情况下可替代if语句