C语言程序设计课件0905选择结构程序设计.ppt

上传人:本田雅阁 文档编号:2143063 上传时间:2019-02-21 格式:PPT 页数:35 大小:130.01KB
返回 下载 相关 举报
C语言程序设计课件0905选择结构程序设计.ppt_第1页
第1页 / 共35页
C语言程序设计课件0905选择结构程序设计.ppt_第2页
第2页 / 共35页
C语言程序设计课件0905选择结构程序设计.ppt_第3页
第3页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C语言程序设计课件0905选择结构程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件0905选择结构程序设计.ppt(35页珍藏版)》请在三一文库上搜索。

1、选择结构程序设计,课程:程序设计语言 教材:谭浩强C程序设计第三版 教师:陈小荷,本章重点,掌握关系运算符、逻辑运算符的优先次序,理解条件表达式的意义。 掌握if语句的四种形式,能针对具体问题正确运用。 理解switch语句的控制结构,能正确运用。,关系运算符, 大于 优先级高(6) = 大于或等于 = 等于 优先级低(7) != 不等于,关系表达式,比较两个运算数,表达式成立则值为 1 ( true ) ,否则值为 0 ( false ) : x y / 未知 x + 5 x / 1 ( true ) x + 5 = x / 1 ( true ),关系运算符与算术运算符,算术运算符的优先级是

2、3(乘除余)和4(加减) 以下两个表达式的值是多少? 10 + ( 20 10 ) * 100 以下四个表达式,如果要加括号,并且不能改变原来的优先次序,应该怎么加? 10 + 20 z z = x y , z ! = x y,关系运算符的结合方向,关系运算符的结合方向是自左至右 设x、y、z的值分别是 5、3、1,那么关系表达式 x y z 的值是多少?如果它们的值分别是 1、3、5 呢? 数学书上 x y z 的意思是 x大于y,y大于z,这个意思用C语言来表达,应该是: x y & y z,关系运算符和赋值运算符,重温:赋值运算符的优先级低(14) x = y z 等价于下面哪个表达式?

3、 ( x = y ) z x = ( y z ) 若 x, y, z 的初值分别是 5, 3, 1 ,下面表达式的值是多少? x = y z,逻辑值表,第一行是标题。以第二行为例,读法是: 若a真b真,则非a和非b均假,a & b 为真,a | b 亦为真。 逻辑表达式求值是自左至右的,一旦发现已经可以根据一个运算数求值,就不会再对第二个运算数求值。例如,在 a & b 中,如果已知a假,则整个逻辑表达式为假,不必再考虑b的值,逻辑运算符的优先级和结合方向,逻辑反的结合方向是自右至左,其他逻辑运算符的结合方向均为自左至右 逻辑非 ! ,优先级2 算术运算符,优先级3和4 关系运算符,优先级6和

4、7 逻辑与 & ,优先级11 逻辑或 | | ,优先级12 赋值运算符,优先级14,表达式求值,假定以下变量 a, b, c, d 的值分别是 0, 1, 2, 3 ,变量 x 和 y 的值未知,请对下列表达式求值: x = y & x != x a b | 3 1 a x - 1 a & b | | c & d a & ( b | c ) & d,表达式求值,假定 a, b, c 的值分别是 3, 4, 5 a + b c & b = = c ( a + b ) c ) & ( b = = c ) a | b + c & b c ! ( a b ) & ! c | 1 ! ( x = a )

5、 & ( y = b ) & 0 ! ( a + b ) + c 1 & b + c / 2,练习写一些表达式,判断是否“及格”(60分及格) 判断是否“英文字母” 判断是否“小写英文字母或阿拉伯数字” 判断是否“能被4整除” 判断是否“能被4整除但不能被100整除” 判断是否“闰年”,形式1:if (e) s ;,是否执行s,取决于e的值 sample : 输入g, 0,两个printf语句的执行情况如何? # include if ( isletter(ch) ) /* 判断ch是否字母*/ printf(“%c is a letter n”, ch); printf(“thank you

6、.n”);,形式2:if (e) s1; else s2;,e的值非 0, 执行 s1, 否则执行 s2 sample : 输入g, 0,两个printf 语句的执行情况如何? if ( isletter(ch) ) printf(“%c is a letter n”, ch); else printf(“%c is not a letter n”, ch);,s 可以是一个复合语句,sample: 三个变量的排序(升序) if ( ab ) tmp=a; a=b; b=tmp; if ( ac ) tmp=a; a=c; c=tmp; if ( bc ) tmp=b; b=c; c=tmp;

7、 ,形式3:多分枝的if语句,注意下面语句的逻辑关系: if(n500) cost=0.15; else if(n300) cost=0.10; else if(n100) cost=0.075; else if(n50) cost=0.05; else const=0.0; 例如,第二行相当于说: if(n300) cost=0.10; 如果按n值从小到大的顺序来写多分枝的if语句,应该怎么写?,形式4:嵌套的if语句,if(e) s1; else s2 中,s1或s2本身又是一个if语句 形式3也是嵌套的if语句,但它总是在s2中嵌套 if ( e ) if ( e1 ) s1 ; els

8、e s2 ; else if ( e2 ) s3 ; else s4 ;,写法1,if (x0) y = 1 ; 语法、逻辑都没有错,运行也正确,但效率低,写法2和写法3,if (x0) y = -1 ; else if (x=0) y = 0 ; else y = 1 ;,if (x=0) if (x0) y = 1 ; else y = 0 ; else y = -1 ;,if与else的匹配原则,就近匹配: 嵌套的if语句中,else总是跟离它最近的上一个尚无匹配的if匹配,不管缩进形式是怎样的: if ( e ) if ( e1 ) s1 ; else s2 ; /* 跟匹配 */ e

9、lse /* 跟匹配 */ if ( e2 ) s3 ; else s4 ; /* 跟匹配 */,写法4和写法5,y = -1 ; if (x!=0) if (x0) y = 1 ; else y = 0 ;,y = 0; if (x=0) if (x0) y = 1 ; else y = -1 ;,条件表达式,e1 ? e2 : e3 其中,? : 是一个条件运算符,三目的,优先级为13(高于赋值运算符),结合方向是自右至左 条件表达式的值是这样计算的: 先对e1求值 如果e1的值非0,则条件表达式的值为e2 否则,条件表达式的值为e3,条件表达式的应用,用于二分枝的选择结构,例如: if

10、( ch = 60 ) grade = Y ; else grade = N ;,条件表达式的应用,条件运算符是自右至左结合的,例如: y = x = 0 ? 0 : x 0 ? 1 : -1 相当于 y = x = 0 ? 0 : (x 0 ? 1 : -1) 因此,条件表达式也可以用于多分枝选择 不过,为了容易理解,一般应该用if语句来表达,switch 语句,多分枝选择 : switch ( grade ) case A : printf ( “85100”n”); break; case B : printf ( “7084n”); break; case C : printf ( “

11、6069”n”); break; case D : printf ( “ 60 n”); break; default : printf ( “error n”); ,switch语句与多分枝if语句的关系,一般来说,能用switch语句的也能用多分枝if语句来表达,例如: if ( grade = A ) printf ( “85100”n”); else if ( grade = B ) printf ( “7084n”); else if ( grade = C ) printf ( “6069”n”); else if ( grade = D ) printf ( “ 60 n”);

12、else printf ( “error n”);,switch语句的语法,每个标号语句都是一个入口 依次检查每个case语句,看是否有合适的入口;若每个case语句都不合适,则从default语句进入;若无default语句,则无法进入 一旦找到了合适的入口,便执行此后的所有语句,除非遇到return语句或break语句 因此,break语句很重要,应在每个case后都加break,除非有理由不加,几个case共享一个动作,如果几个case的动作相同,可以只写一次,例如: switch ( month ) / 求一个月有几天 case 2: if (is_leap_year(year) da

13、ys=29; else days=28; break; case 4: case 6: case 9: case 11: days=30; break; default : days=31; ,例5.5 判断某一年是否闰年,输入:年份数字(大于0) 输出:打印 “是闰年” 或 “不是闰年” 教材提供了三种写法,请比较优劣: 嵌套的if语句 多分枝的if语句 二分枝的if语句,求三个数中的最大者,if ( ab ) if ( ac ) return a; else return c; else if ( bc ) return b; else return c;,int m=a; if ( bm

14、 ) m=b; if ( cm ) m=c; return m; 你喜欢哪种写法?,例5.6 求一元二次方程的根,输入:系数a, b, c 过程和输出: a = 0 : 不是一元二次方程 disc = b*b 4*a*c ; if (disc绝对值近乎0) 打印两个相等实根 if (disc绝对值大于0) 打印两个不等实根 else 打印两个共轭复根,例5.6 教材分析,程序的主体是一个嵌套的if语句,共有3层,层数多了,理解起来比较困难 第一层的if只带一个语句,而else却带了多层多个语句,不太般配 第二层的if也只带一个语句,而else却带了多层多个语句,不太般配 第三层的if和else

15、,在层次和语句数量上比较均衡,例5.6 程序修改,基本思路: 减少层次,尽量不用嵌套的if语句 void函数中可以有多个return语句,因此,如果已经处理了某种情况,就可以及时返回,程序其余部分再处理其他情况 例如,第一种情况,打印了“不是一元二次方程”之后,即可return,这样就省掉了一个层次 请自行修改这个程序,例5.7 运费计算,可以有多种写法: 如教材所示,用switch语句来写 用多分枝if语句来写 请比较两种写法,哪一种更好?(用简洁性、可读性等标准来衡量),本章小结,关系运算和逻辑运算是理解选择结构和循环结构的基础 四种if语句由简到繁:单分枝、二分枝、多分枝、嵌套,应尽量使用简单的形式 switch语句用于多分枝选择,case和default都是入口标号,一旦进入则顺流而下,除非遇到return语句和break语句 条件表达式在许多情况下可替代if语句,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1