1、,第5章 选择结构程序设计,2,第5章 选择结构程序设计,5.1 关系运算符和逻辑运算符 5.2 if 语句 5.3 switch语句,3,关系运算符用来比较两个运算对象的大小,比较的结果是真和假两个逻辑值,而逻辑运算符的操作对象和结果也都是逻辑值,因此这两种运算符在使用时有着密切的联系。 1. 关系运算符关系运算符内又分为两类:相等判断和不相等判断,它们分别是:(1) 不相等判断(大于)、=(大于等于)、(小于)、=(小于等于)(2) 相等判断=(等于)、!=(不等于),5.1 关系运算符和逻辑运算符,4,例: includemain()int a,b,c;a=b=c=10;a=b=c;pr
2、intf(a=%d,b=%d,c=%dn,a,b,c);printf(a=():%dn,a=(b=c+*2);printf(a=%d,b=%d,c=%dn,a,b,c); a=b+=+bc+;printf(a=%d,b=%d,c=%dn,a,b,c); 运行输出: a=1,b=10,c=10a=():0a=1,b=20,c=11a=0,b=22,c=12,5.1 关系运算符和逻辑运算符,5,对于有两个不同字符构成的比较运算符,在使用中常见的错误是:(1) 把两个字符的次序写颠倒,把= , != , , =! , =,!=, = , ! = , = , = =。今后凡是由两个以上字符构成的运算符
3、,在使用中都要注意防止出现上面两种错误。(3)把相等运算符误写成赋值运算符,即把=写成=,这也是初学者常犯的错误。,5.1 关系运算符和逻辑运算符,6,2. 逻辑运算符C语言提供了三个逻辑运算符,按由高到低的优先级次序,它们是:! :逻辑非(把逻辑值进行翻转,相当于NOT)& :逻辑与(求两个逻辑值的与,相当于乘运算AND) :逻辑或(求两个逻辑值的或,相当于加运算OR)其中,!为单目运算符,&、为双目运算符,其功能和用法可由真值表说明。,5.1 关系运算符和逻辑运算符,7,例: includemain()int i=7,m,n;m=!i;n=(3i6);printf(i=%d,m=%d,n=
4、%dn,i,m,n);运行输出:i=7,m=1,n=1说明: 虽然经过 !i 运算,但i本身的值并没有改变,它返回给m的只是个中间结果。!i=!(!7)=!0=1,所以m值是1; 3i6即376,从数学上看这个不等式的结果应是假的,但在C语言中却是这样处理的:(3i6)=(3i)6)=(16)=1,5.1 关系运算符和逻辑运算符,8,5.2 if 语句,C语句中条件语句有两个:双分支的if语句和多分支的switch语句。根据不同情况,恰当地使用它们,可以提高编程效率。 1. if语句 if语句的一般形式是:if () else if语句的语义如图所示。,9,首先对表达式求值,若值为真就执行语句
5、1,否则就执行语句2。说明:(1) 语句1和语句2可以是简单语句,也可以是复合语句。else前若是简单语句则必须有分号结束,不要认为分号会把整个if语句拦腰截断,事实上不加分号在C语言中反而是错误的。(2) 语句2也可以没有,这时称为单路结构;若两个分支都有则称为双路结构。,5.2 if 语句,10,例: 输入三角形的三边,求三角形的面积。 编程思路: 定义4个变量a,b,c和area,分别表示三角形的三条边与面积。 由三边求三角形面积的公式是:,5.2 if 语句,11, 根据数学知识,三角形任意两边之和大于第三边,因此对输入的三边必须进行判断,以保证输入的三边能够构成一个有意义的三角形。i
6、ncludeincludemain()float a,b,c,area,s;printf(Input 3 edges:n);scanf(%f%f%f,5.2 if 语句,12,if(a+bc ,5.2 if 语句,13,运行输出: Input 3 edges: 2 3 7(键盘输入三个数,用空格分开) Input error! 再运行一次: Input 3 edges: 3 5 7(键盘输入三个数,用空格分开) area=6.50,5.2 if 语句,14,2. else-if语句在if语句中,它的任一分支又可以是一个if语句,这样就形成了嵌套的if语句,其一般形式为:if () else i
7、f()else if()else其语义如下图所示:,5.2 if 语句,15,图: 嵌套的if语句的语义,5.2 if 语句,16,写嵌套的if语句时应注意以下问题:(1) if和else应配对出现,每一个else和离它最近且没有else的if相匹配。(2) 应在条件为真时执行一个操作,而在条件为假时再去测试下一个条件。不要在某条件成功后再接着去测试下一个条件,这样做,在嵌套层次数多时会失去智力上的控制,即不要写成下面的形式:,5.2 if 语句,17,If()if()if() else else else ,5.2 if 语句,18,(3) 在嵌套的多个条件中,应尽量把求值为真概率最大的条件
8、放在前面优先判断,这样可以提高if语句的效率。 例如:在学生成绩的登记中,90分以上为A,8090分为B,7080分为C,6070分为D。如果8090分之间的学生最多,就应先对这个分数段进行处理:,5.2 if 语句,19,if(score=80 elseprintf(D);,5.2 if 语句,20,if语句在程序中常见的错误是: 忘记标记复合语句的一个或两个花括号。对嵌套在中间的复合语句来说,这样会引起语法错误;对最后的一个复合语句来说,会引起逻辑错误。 if结构的条件部分没有用圆括号括起来,如:if ab 在if结构的条件部分后面加分号,这样在单路选择中会出现逻辑错误。在双路选择中会出现
9、语法错误。,5.2 if 语句,21,例如:if(ab);printf(OK); 原意为当a大于b时打印OK,现在的情况是不管a是否大于b都打印OK。if(ab);printf(Yes);elseprintf(No); 这时会出现语法错误。,5.2 if 语句,22,3. if语句中条件表达式的灵活设置因为C语言中是用非0和0来表示真假的,所以条件的表示可以有多种情况:(1) 用一个数值表示条件。如:int m;scanf(%d, 其中if(!m)等价于if(m=0)。(2) 将赋值运算和条件判断结合起来。,5.2 if 语句,23,如: char ch;if(ch=getchar()!=n)
10、 putchar(ch); 这里先调用getchar函数,输入一个字符,赋给ch,再判断ch是否为回车符,若不是回车符则将其输出。(3) 用复合的逻辑表达式表示条件。如:if(score70 此时常犯的错误是写成数学中的不等式形式:if(70score80)数学中的式子要经过适当改造才能用于C程序中,不能直接照搬。,5.2 if 语句,24,4. 条件运算符条件运算符“?:”是C语言中唯一的一个三目运算符,它有三个运算对象,分别由“?”和“:”把它们连接起来,构成一个条件表达式。其语法形式是:? : 整个条件表达式的值要么是表达式2的值,要么是表达式3的值,全依赖于对表达式1的求值而定。,5.
11、2 if 语句,25,条件运算符的结合性是“由右向左”结合的。例如:ab ? a : cd ? c : d 等价于ab ? a : (cd?c:d)条件运算符的优先级高于赋值运算符而低于关系运算符和算术运算符。因此max = ab ? a : b+1等价于 max = (ab) ? a : (b+1)不等价于 max=(ab?a:b)+1,5.2 if 语句,26,例: include main() int x=10;float y=5;printf(%dn,xy?x:y); ,5.2 if 语句,27,5. if语句和条件表达式的关系如有条件表达式语句max=ab?a:b;,其功能是把a,b
12、中的最大者赋给变量max。这也可以用if语句来实现:if(ab)max=a;elsemax=b;在条件不太复杂的情况下,用条件表达式比较简单,但如条件复杂,嵌套层数较多时还是以if语句为好。,5.2 if 语句,28,例:猜数游戏。程序预置一个常数(称为幻数),让用户猜,猜对时给出正确信息,否则会给出是大了还是小了的提示。includemain()int magic=618 , guess;printf(Input your guess:n);scanf(%d,5.2 if 语句,29,if(guess!=magic) guessmagic ? printf(High):printf(Low)
13、;elseprintf(*Right*n); printf(%d is the magic number.n,magic); 这里的条件表达式语句相当于一个内嵌的if语句。,5.2 if 语句,30,if语句是双分支结构,如果要连续地测试多个条件,就需要用嵌套的if语句来实现。如果嵌套层次过多,不仅写起来麻烦,而且还不清晰。对这类问题,用switch语句可以很好地解决。switch语句是一种多分支结构,其一般形式是: switch()case : case : case : default: ,5.3 switch语句,31,switch 语句的语义如图:,5.3 switch语句,32,例:
14、用switch语句输出学生的分数等级。设分数大于等于90分者为A等,70分90分为B等(含70),60分70分为C等(含60),60分以下为D等,分数为浮点数。编程思路:switch后的表达式必须是有序类型而且求出的结果应当是一个个离散的值,而不是一个数值范围。应该想办法把一个范围转换成一个确定的值,这是使用switch语句的关键。在这里我们可以把分数除以10再取整,即可变成离散的数值,就可以用switch语句解决了。,5.3 switch语句,33,include main() int i;float score;printf(Input a scoren);scanf(%f, ,说明:输入的分数是实数,但通过赋值语句就变成了整型,整型是有序类型,并且i具有有限的离散值。,5.3 switch语句,34,作 业,P111: 习题 5.1 5.10,