资源预览内容
第1页 / 共47页
第2页 / 共47页
第3页 / 共47页
第4页 / 共47页
第5页 / 共47页
第6页 / 共47页
第7页 / 共47页
第8页 / 共47页
第9页 / 共47页
第10页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第4章 选择结构程序设计 4.1 条件的描述 4.2 if选择结构 4.3 条件运算 4.4 switch多分支选择结构 4.5 选择结构程序举例 本章小结,4.1 条件的描述 4.1.1 关系运算 1关系运算符 C语言的关系运算符有: (大于)、=(大于等于)、=(等于)、!=(不等于) 在C语言中,约定以1(非0)表示真,以0表示假。由于C语言中没有逻辑型数据,因此C语言规定用整型数据来表示逻辑值,即用整数值1表示逻辑真,用整数值0表示逻辑假。在C语言中,将非0视为真。 在上述6种关系运算符中前4种(、=)的优先级高于后两种(=、!=)。另外,关系运算符的优先级低于算术运算符的优先级。,2关系表达式 关系表达式是由关系运算符将两个表达式连接起来的式子。一般格式为: 表达式1 关系运算符 表达式2 关系表达式的结果为1(真)或0(假)。设有i=1,j=2,k=3,则ij的值为0,i=kj的值为1(先计算kj,其值为1,等于i的值),i+j=k的值为1。,在表达式中连续使用关系运算符时,要注意正确表达运算的含义,注意运算优先级和结合性。例如,变量x的取值范围为0x20时,不能写成0=0 & x=20,4.1.2 逻辑运算 1逻辑运算符 C语言的逻辑运算符有: &(逻辑与)、|(逻辑或)、!(逻辑非) 其中运算符 & 和 | 是双目运算符,要求有两个运算分量,用于连接多个条件,构成更复杂的条件。运算符 ! 是单目运算符,用于对给定条件取非。逻辑运算产生的结果也是一个逻辑量:真或假,分别用1或0表示。,逻辑运算符中, ! 的优先级最高,其次是 &,| 的优先级最低。另外,& 和 | 的优先级低于关系运算的优先级, ! 的优先级高于算术运算符的优先级。,2逻辑表达式 逻辑表达式是用逻辑运算符将逻辑量连接起来的式子。除!以外,& 和 | 构成的逻辑表达式一般形式为: p1 逻辑运算符 p2 其中p1,p2是两个逻辑量。,若逻辑运算符为 &,则当连接的两个逻辑量全为真时,逻辑表达式取值为真,只要有一个为假,便取假值。若逻辑运算符为 |,则当连接的两个逻辑量中只要有一个为真,逻辑表达式的值为真,只有两个逻辑量同时为假时,才产生假值。 ! 是一个单目运算符,只作用于后面的一个逻辑量。它对后面的逻辑量取非,如果逻辑量为假,便产生真值,如果逻辑量为真,便产生假值。,由于在C语言中,以1(非0)表示逻辑真,0表示逻辑假,所以参与逻辑运算的分量也可以是其他类型的数据,以非0和0判定它们是真还是假。 在一个包含算术、关系、逻辑运算的表达式中,不同位置上出现的数值,应区分哪些是数值运算对象、哪些是关系运算和逻辑运算对象。例如: 21 & 4 & 73+!0,3逻辑运算的重要规则 逻辑与和逻辑或运算分别有如下性质: (1)a & b:当a为0时,不管b为何值,结果为0。 (2)a | b:当a为1时,不管b为何值,结果为1。,C语言利用上述性质,在计算连续的逻辑与运算时,若有运算分量的值为0,则不再计算后继的逻辑与运算分量,并以0作为逻辑与算式的结果;在计算连续的逻辑或运算时,若有运算分量的值为1,则不再计算后继的逻辑或运算分量,并以1作为逻辑或算式的结果。也就是说,对于a & b,仅当a为非零时,才计算b;对于a | b,仅当a为0时,才计算b。,例如,有下面的定义语句和逻辑表达式: int a=0,b=10,c=0,d=0; a&b&(c=a+10,d=100) 因为a为0,无论b&(c=a+10,d=100)值为1或为0,表达式a&b&(c=a+10,d=100)值一定为0。所以,b&(c=a+10,d=100)部分运算不需要计算。该表达式运算完成后,c和d值都不变,保持原值0。,又如: int a=5,b=10,c=0,d=0; a&b&-(c=b*b,d=a/b) 表达式中的-(c=b*b,d=a/b)是第二个&运算符的右操作数,若加上一对圆括号更清晰。所以,可写成: a&b&(-(c=b*b,d=a/b) 因为a、b均为非0,该逻辑运算表达式值还不能确定,(-(c=b*b,d=a/b)需要计算。该表达式运算完成后,其值为0,c为100,d为0。,对于逻辑或运算,有下面的定义语句和逻辑表达式: int a=1,b=10,c=0,d=0; a|b|(c=a+10,d=100) 因为a为非0,无论b|(c=a+10,d=100)值为0或为1,表达式a|b|(c=a+10,d=100)值都为1。所以,表达式b|(c=a+10,d=100)不需要计算。该表达式运算完成后,c和d值不变,保持原值0。,又如: int a=0,b=0,c=0,d=0; a|b|(c=a+b,d=100) 因为a、b均为0,该逻辑运算表达式值还不能确定,(c=a+b,d=100)需要计算。该表达式运算完成后,其值为1,c为0,d为100。,在程序设计中,常用关系表达式和逻辑表达式表示条件。下面将通过具体示例来进行说明。 【例4.1】写出下列条件: (1)判断年份year是否为闰年。 (2)判断ch是否为小写字母。 (3)判断m能否被n整除。 (4)判断a是否为整数。 (5)判断ch既不是字母也不是数字字符。,4.2 if选择结构 4.2.1 单分支if选择结构 单分支if选择结构的一般格式为: if(表达式) 语句 执行过程是:计算表达式的值,若值为非0,则执行语句,然后执行if语句的后继语句。若值为0,则直接执行if语句的后继语句。其执行过程如图4-1所示。,图4-1 单分支if选择结构的执行过程,注意: (1)if后面的表达式必须用圆括号括起来。 (2)if后面的表达式不限于是关系表达式或逻辑表达式,还可以是任意表达式。例如语句: if (B) printf(“%dn”,B); 是合法的,将输出大写字母B的ASCII码值66。 【例4.2】输入两个整数a和b,按从大到小的顺序输出。,4.2.2 双分支if选择结构 双分支if选择结构的一般格式为: if(表达式) 语句1 else 语句2 执行过程是:计算表达式的值,若值为非0,则执行语句1,否则执行语句2,语句1或语句2执行后再执行if语句的后继语句。其执行过程如图4-2所示。,图4-2 双分支if选择 结构的执行过程,注意:表达式后面或else后面的语句若包含多个语句,应将它们写成复合语句的形式。例如: if(i%2=1) x=i/2;y=i*i; else x=i;y=i*i*i; 请读者分析下列if语句与上述if语句的区别: if(i%2=1) x=i/2,y=i*i; else x=i,y=i*i*i; 【例4.3】输入三角形的三个边长,求三角形的面积。,程序运行时,选择结构的每一条分支不可能同时被执行,每次只能执行一个分支。所以在检查选择结构程序的正确性时,设计的原始数据应包括每一种情况,保证每一条分支都检查到。如例4.3中,第一次运行时,输入三边能构成一个三角形,求出其面积。第二次运行时,输入三边不能构成一个三角形,提示用户输入数据有误。 【例4.4】输入x,求对应的函数值。,4.2.3 多分支if选择结构 多分支if选择结构的一般格式为: if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 else if(表达式m) 语句m else 语句n,执行过程是:多分支选择结构的执行过程如图4-3所示。当表达式1的值为非0时,执行语句1。否则判断表达式2的值是否为0,非0时,执行语句2,否则处理表达式3,依此类推。若表达式的值都为0,则执行else后面的语句n。,图4-3 多分支if选择结构的执行过程,注意: (1)不管有几个分支,程序执行完一个分支后,其余分支将不再执行。请思考,当表达式1和表达式2都为非0时,语句的执行路线如何? (2)else if不能写成elseif,也就是else与if之间要有空格。 【例4.5】输入一个字符,若为大写字母,则输出其后继字符,若为小写字母,则输出其前驱字符,若为其他字符则原样输出。,4.2.4 if选择结构的嵌套 if语句中可以再嵌套if语句。C语言规定,在嵌套的if语句中,else子句总是与前面最近的、不带else的if相结合。例如,有以下形式的if语句: (1)if(表达式1) if(表达式2) 语句1 else 语句2 (2)if(表达式1) if(表达式2) 语句1 else 语句2 (3)if(表达式1) if(表达式2) 语句1 else 语句2 (1)和(2)是等价的,else与第二个if配对。(3)将没有else对应的内嵌if语句写成复合语句,else与第一个if配对。,【例4.6】硅谷公司员工的工资计算方法如下: (1)工作时数超过 120小时者,超过部分加发15%。 (2)工作时数低于60小时者,扣发 700元。 (3)其余按每小时84元计发。 输入员工的工号和该号员工的工作时数,计算应发工资。 【例4.7】根据键盘输入的3个数,找出最大数并输出。,4.2.5 容易混淆的等于运算符和赋值运算符 这是C语言程序设计中极易出错的一个问题,有必要单独提出来讲述。把等于运算符 =和赋值运算符 = 交换使用,通常不会发生语法错误,也就是说,程序能编译通过并能运行,但运算结果往往不正确,所以这类错误较隐蔽,不易被发现。,出现这种错误的原因有两个方面。一方面,由于在数学上用“=”表示等于,这一点许多人已经习以为常了,所以特别容易混淆(其实容易混淆的地方还有很多,如标识符的定义、表达式的书写、标准函数的调用等)。另一方面,由于在C语言中,任何具有值的表达式都可以作为选择控制或循环控制的判断条件,表达式值为0,认为是“假”,表示条件不成立,表达式值为非0,认为是“真”,表示条件成立,而C语言的赋值表达式会产生一个值,即赋值运算符左边变量的值,所以赋值表达式可以表示条件。但这时逻辑上的含义却大大不同了。,例如,假定把语句: if(StudentID=5) score+=20; 不小心写成: if(StudentID=5) score+=20; 第一条if语句能够判断学生的学号(StudentID)是否为5,给学号为5的学生的成绩(score)加20分,而第二条if语句先计算条件表达式,该表达式是一个赋值语句,它的值为5。因为任何非0值都被当作“真”,所以if语句的条件总是满足的,也就是说,不论学生的学号是多少,他总可以加20分。在这里,语法上并没有错误,但逻辑上有错,所以程序得不到正确结果。,4.3 条 件 运 算 条件运算是C语言中唯一的一个三目运算,有3个运算分量。它的一般形式为: 表达式1?表达式2:表达式3 条件运算的运算规则是先求表达式1的值,如果表达式1的值非0(真),则求表达式2,并以表达式2的值为条件运算的结果(不再计算表达式3)。如果表达式1的值为0(假),则求表达式3,并以表达式3的值为条件运算的结果(不再计算表达式2)。,使用条件表达式可以使程序简洁明了。例如,赋值语句z=ab?a:b中使用了条件表达式,很简洁地表示了判断变量a与b的最大值并赋给变量z的功能。所以,使用条件表达式可以简化程序。 另外,条件运算的3个运算分量的数据类型可以各不相同。例如: i?a:A i是整型变量,若i的值非0,则条件表达式的值为a,否则条件表达式的值为A。又如: ij?20:31.5 当条件运算中,表达式2与表达式3的类型不一致时,C语言约定在表达式2与表达式3中,类型低的向类型高的转换。因此,上式当ij时,条件表达式的值为20.0,否则为31.5。,【例4.8】生成3个随机整数,输出其中最大的数。 例4.7和例4.8中介绍了求3个数中的最大数的实现方法,可以选择单分支、多分支、if结构嵌套和条件表达式来实现,这说明
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号