1、第五章2022-10-4l 本章要点n 关系表达式n 逻辑表达式n 选择结构程序设计2022-10-4l 主要内容 5.1 关系运算符和关系表达式 5.2 逻辑运算符和逻辑表达式 5.3 if语句 5.4 switch语句 5.5 程序举例2022-10-4在在C语言中,选择结构程序主要是靠语言中,选择结构程序主要是靠if语句实现的。语句实现的。if(条件条件)语句语句1 else 语句语句2例如:求两个数中的最大值。例如:求两个数中的最大值。int max(int x,int y)int z;if(xy)z=x;else z=y;return z;xy条件表达式条件表达式条件表达式的最简单形
2、式是关系运算,即比较运算条件表达式的最简单形式是关系运算,即比较运算10/4/20224(一一)关系运算符及其优先次序关系运算符及其优先次序1.(小于小于)2.(大于大于)4.=(大于或等于大于或等于)5.=(等于等于)6.!=(不等于不等于)优先级相同(高)优先级相同(高)优先级相同(低)优先级相同(低)说明:说明:关系运算符的优先级低于算术运算符关系运算符的优先级低于算术运算符关系运算符的优先级高于赋值运算符关系运算符的优先级高于赋值运算符10/4/20225(二二)关系表达式关系表达式用关系运算符将两个表达式用关系运算符将两个表达式(可以是算术表达式或可以是算术表达式或关系表达式,逻辑表
3、达式,赋值表达式,字符表关系表达式,逻辑表达式,赋值表达式,字符表达式达式)接起来的式子,称关系表达式接起来的式子,称关系表达式例:例:ab,a+bb+c,(a=3)(b=5),ab)(bc)关系表达式的值是一个逻辑值,即关系表达式的值是一个逻辑值,即“真真”或或“假假”。C C语言中没有专用语言中没有专用的逻辑值,的逻辑值,1 1代表代表真,真,0 0代表假代表假例:例:关系表达式关系表达式a(&)-(|)逻辑运算符中的逻辑运算符中的“&”和和“|”低于关系运算符,低于关系运算符,“!”高高 于算术运算符于算术运算符2022-10-47(二二)逻辑表达式逻辑表达式用逻辑运算符将关系表达式或逻
4、辑量连接起来的式子用逻辑运算符将关系表达式或逻辑量连接起来的式子 就是逻辑表达式就是逻辑表达式逻辑表达式的值应该是一个逻辑量逻辑表达式的值应该是一个逻辑量“真真”或或“假假”。例:例:设设a=4,b=5:!a的值为的值为0 a&b的值为的值为1a|b的值为的值为1 !a|b的值为的值为14&0|2的值为的值为1任何非零的数值被认作任何非零的数值被认作“真真”2022-10-48例:53&84-!0 自左向右运算自左向右运算 1&0逻辑值为逻辑值为083逻辑值为逻辑值为1表达式值为表达式值为02022-10-49在逻辑表达式的求解中,并不是所有的逻辑运算符都要在逻辑表达式的求解中,并不是所有的逻
5、辑运算符都要被执行。被执行。(1)a&b&c 只有只有a为真时,才需要判断为真时,才需要判断b的值,只有的值,只有 a和和b都为真时都为真时,才需要判断才需要判断c的值。的值。(2)a|b|c 只要只要a为真,就不必判断为真,就不必判断b和和c的值,只有的值,只有a为为 假,才判断假,才判断b。a和和b都为假才判断都为假才判断c例例:(m=ab)&(n=cd)当当a=1,b=2,c=3,d=4,m和和n的原值为的原值为1时,由于时,由于“ab”的的值为值为0,因此,因此m=0,而,而“n=cd”不被执行,因此不被执行,因此n的值的值不是不是0而仍保持原值而仍保持原值1。2022-10-410
6、用逻辑表达式来表示闰年的条件用逻辑表达式来表示闰年的条件能被能被4整除,但不能被整除,但不能被100整除。整除。能被能被4整除,又能被整除,又能被400整除。整除。答答 (year%4=0&year%100!=0)|year%400=0案案 值为真值为真(1)是闰年,否则为非闰年。是闰年,否则为非闰年。2022-10-411一、一、if语句的三种基本形式语句的三种基本形式(1)if(表达式表达式)语句语句例:例:if(xy)printf(“%d”,x);表达式表达式语句语句真真(非非0)假假(0)2022-10-412(2)if(表达式表达式)语句语句1 else 语句语句2例:例:if(xy
7、)printf(“%d”,x);else printf(“%d”,y);条件条件 语句语句1 语句语句2YN2022-10-413(3)if(表达式(表达式1)语句)语句1 else if(表达式表达式2)语句语句2 else if(表达式表达式3)语句语句3 else if(表达式表达式m)语句语句m else 语句语句n2022-10-414例:例:if(number500)cost=0.15;else if(number300)cost=0.10;else if(number100)cost=0.075;else if(number50)cost=0.05;else cost=0;202
8、2-10-415说明:说明:(1)3种形式的种形式的if语句中在语句中在if后面都有表达式,后面都有表达式,一般为逻辑表达式或关系表达式。一般为逻辑表达式或关系表达式。(2)第二,第三种形式的第二,第三种形式的if语句中,在每个语句中,在每个 else前面有一个分号,整个语句结束处有一前面有一个分号,整个语句结束处有一 个分号。个分号。(3)在在if和和else后面可以只含有一个内嵌的操后面可以只含有一个内嵌的操 作语句,也可以由多个操作语句,此时用花作语句,也可以由多个操作语句,此时用花 括号将几个语句括起来成为一个复合语句。括号将几个语句括起来成为一个复合语句。2022-10-416yna
9、bt=aa=bb=t2022-10-417if ab 将将a和和b对换对换if ac 将将a和和c对换对换if bc 将将b和和c对换对换2022-10-4182022-10-419二、二、if语句的嵌套语句的嵌套if(表达式表达式1)语句语句1else if(表达式表达式2)语句语句2else if(表达式表达式3)语句语句3 else if(表达式表达式m)语句语句m else 语句语句nif(表达式(表达式1)语句)语句1else if(表达式表达式2)语句语句2 else if(表达式表达式3)语句语句3 else if(表达式表达式m)语句语句m else 语句语句n这种形式就是一种
10、这种形式就是一种嵌套的形式嵌套的形式2022-10-420二、二、if语句的嵌套语句的嵌套在在if语句中又包含一个或多个语句中又包含一个或多个if语句称为语句称为if语句的嵌套。语句的嵌套。一般形式:一般形式:if()if()语句语句1else 语句语句2elseif()语句语句3else 语句语句4内嵌内嵌if2022-10-421例:例:if()if()语句语句1elseif()语句语句2 else 语句语句3匹配规则:匹配规则:else总是与它上面的,最近的,同一复合语句中的,总是与它上面的,最近的,同一复合语句中的,未配对的未配对的if语句配对。语句配对。例:例:if()if()语句语
11、句1elseif()语句语句2 else 语句语句3应改为:应改为:if()if()语句语句1elseif()语句语句2else 语句语句3当当if和和else数目不同时,可以加数目不同时,可以加花括号花括号来确定配对关系。来确定配对关系。2022-10-422 -1 (x0)算法算法1:算法算法2:输入输入x 输入输入x若若x0,则则y=-1 若若x0,则则y=1 若若x=0,则则y=0输出输出y 否则否则 y=1 输出输出y 2022-10-423#includevoid main()int x,y;scanf(“%d”,&x);程序段程序段 printf(“x=%d,y=%dn”,x,y
12、);2022-10-424上例中的程序段有四个,请判断哪个是正确的?上例中的程序段有四个,请判断哪个是正确的?程序程序1:程序程序2:if(x=0)y=-1;if(x0)y=1;else else y=0;if(x=0)y=0;else y=-1;else y=1;程序程序3:程序程序4:y=-1;y=0;if(x!=0)if(x=0)if(x0)y=1;if(x0)y=1;else y=0;else y=-1;正确正确2022-10-425三、条件运算符三、条件运算符格式:格式:表达式表达式1 1?表达式?表达式22表达式表达式3 3 功能:功能:判断判断表达式表达式1 1的值,如果成立就执
13、行的值,如果成立就执行表表 达式达式2 2,否则就执行,否则就执行表达式表达式3 3使用场合:若在使用场合:若在 if 语句中,当被判别的表达式的语句中,当被判别的表达式的 值为值为“真真”或或“假假”时,都执行一个赋值语时,都执行一个赋值语 句且向句且向同一个变量同一个变量赋值时,可以用一个赋值时,可以用一个 条件运算符来处理。条件运算符来处理。2022-10-426例:例:if(ab)max=a;else max=b;当当ab时将时将a的值赋给的值赋给max,当,当ab时将时将b的值赋给的值赋给max,可以看到无论可以看到无论ab是否满足,都是向同一个变量赋值。是否满足,都是向同一个变量赋
14、值。可以用下面的条件运算符来处理:可以用下面的条件运算符来处理:max=(ab)?a:b;2022-10-427说明:说明:(1)(1)条件运算符的执行顺序:先求解表达式,若为非条件运算符的执行顺序:先求解表达式,若为非0(0(真真)则求解表达式,此时表达式的值就作为整个条件表达式则求解表达式,此时表达式的值就作为整个条件表达式 的值。若表达式的值为(假),则求解表达式,表达的值。若表达式的值为(假),则求解表达式,表达 式的值就是整个条件表达式的值。式的值就是整个条件表达式的值。(2)(2)条件运算符优先级高于赋值运算符条件运算符优先级高于赋值运算符 ,低于关系运算符,低于关系运算符 和算术
15、运算符。和算术运算符。(3)(3)条件运算符的结合方向为条件运算符的结合方向为“自右至左自右至左”。(4)“(4)“表达式表达式2”2”和和“表达式表达式3”3”不仅可以是数值表达式,还可以不仅可以是数值表达式,还可以 是赋值表达式或函数表达式。是赋值表达式或函数表达式。(5)(5)条件表达式中,表达式的类型可以与表达式和表达条件表达式中,表达式的类型可以与表达式和表达 式的类型不同。式的类型不同。2022-10-428如果字符变量如果字符变量ch的值为大写字母,的值为大写字母,则条件表达式的值为则条件表达式的值为(ch+32),即相,即相应的小写字母。如果应的小写字母。如果ch的值不是大的值
16、不是大写字母,则条件表达式的值为写字母,则条件表达式的值为ch,即不进行转换。即不进行转换。2022-10-429switch语句用于实现多分支结构语句用于实现多分支结构switch语句的格式:语句的格式:Switch(表达式表达式)case 常量表达式常量表达式1:语句:语句1break;case 常量表达式常量表达式2:语句:语句2break;case 常量表达式常量表达式n:语句:语句nbreak;default:语句:语句n+1 break语句用于直语句用于直接转到接转到“”之后之后最后一种情况的处最后一种情况的处理操作之后不用理操作之后不用break语句语句2022-10-430例例
17、:要求按照考试成绩的等级输出百分制分数段,用要求按照考试成绩的等级输出百分制分数段,用switch语句实现:语句实现:switch(grade)case A:printf(85100n);break;case B:printf(7084n);break;case C:printf(6069n);break;case D:printf(60n);break;default:printf(errorn);2022-10-431说明:说明:(1)switch后面括弧内的后面括弧内的“表达式表达式”,ANSI标准允许它为任何标准允许它为任何(2)类型,但一般应为整型或字符型。类型,但一般应为整型或字符
18、型。(2)当表达式的值与某一个当表达式的值与某一个case后面的常量表达式的值相等时,后面的常量表达式的值相等时,就转到该就转到该case开始执行,直到遇到开始执行,直到遇到“break;”或遇到或遇到“”。如果一个如果一个case之后的程序段中没有出现之后的程序段中没有出现“break;”,系统会,系统会 接着执行下一个接着执行下一个case之后的程序段。之后的程序段。(3)两个或多个条件要执行相同的操作时,可以先写出多个两个或多个条件要执行相同的操作时,可以先写出多个 “case 常量常量:”,在这多个,在这多个“case”之后写出要执行的程序段。之后写出要执行的程序段。即多个即多个cas
19、e共用一个程序段。共用一个程序段。2022-10-432(4)若所有的若所有的case 中的常量表达式的值都没有与表达式的值匹中的常量表达式的值都没有与表达式的值匹 配的,就执行配的,就执行default后面的语句。后面的语句。(5)每一个每一个case的常量表达式的值必须互不相同,否则就会出的常量表达式的值必须互不相同,否则就会出 现互相矛盾的现象现互相矛盾的现象(对表达式的同一个值,有两种或多种对表达式的同一个值,有两种或多种 执行方案)。执行方案)。(6)各个各个case和和default的出现次序不影响执行结果。例如,可以的出现次序不影响执行结果。例如,可以 先出现先出现“defaul
20、t:”,再出现,再出现“case D:”,然后再出现,然后再出现 “case A:”。2022-10-433例例5.5 写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。一般程序包括三一般程序包括三部分,输入、计部分,输入、计算、输出。算、输出。输入部分,输入部分,得到年份得到年份值值结束结束开始开始输入年份输入年份是闰年?是闰年?leap=1leap=1输出是闰年输出是闰年输出不是闰年输出不是闰年YYNNleap=0计算部分,根计算部分,根据是否为闰年,据是否为闰年,对对leap赋不同赋不同的值的值编写一个程序,其中的每编写一个程序,其中的每一部分都要有明确的目标一部分都要有明确的目标
21、2022-10-434if(year%4!=0)leap=0;else if(year%100!=0)leap=1;else if(year%400!=0)leap=0;else leap=1;运行情况:运行情况:1989 1989 is not a leap year.2000 2000 is a leap year.2022-10-435例例5.6 求求 ax2+bx+c=0 方程的解。方程的解。基本的算法:基本的算法:a=0,不是二次方程。,不是二次方程。b24ac=0,有两个相等实根。,有两个相等实根。b24ac0,有两个不等实根。,有两个不等实根。b24ac0,有两个共轭复根。,有两
22、个共轭复根。2022-10-4362022-10-4372022-10-438例例5.7 运输公司对用户计算运费。运输公司对用户计算运费。路程路程(s)越远,每公里运费越低。标准如下:越远,每公里运费越低。标准如下:s250km 没有折扣没有折扣 250s500 2折扣折扣 500s1000 5折扣折扣 1000s2000 8折扣折扣 2000s3000 10折扣折扣 3000s 15折扣折扣设每公里每吨货物的基本运费为设每公里每吨货物的基本运费为p,货物重为,货物重为w,距离为距离为s,折扣为,折扣为d,则总运费,则总运费f的计算公式为:的计算公式为:fp*w*s*(1-d)2022-10-439分析折扣变化的规律性:分析折扣变化的规律性:折扣的折扣的“变化点变化点”都是都是250的倍数的倍数 在横轴上加一种坐标在横轴上加一种坐标c,c的值为的值为s/250。c代表代表250的倍数。的倍数。c1,无折扣;,无折扣;1c2,折扣,折扣d2;2c4,d5;4c8,d8;8c12,d10;c12,d15。250 500 1000 2000 3000sd2022-10-4402022-10-441