1、1第三章选择机构程序设计第三章选择机构程序设计主要内容主要内容3 3.1.1 关系运算符和关系表达式关系运算符和关系表达式3 3.2.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式3 3.3 if.3 if语句语句3 3.4 switch.4 switch语句语句3 3.5.5 程序举例程序举例23.1 关系运算符和关系表达式关系运算符和关系表达式(一一).).关系运算符及其优先次序关系运算符及其优先次序 (小于小于)=(大于大于)=(=(大于或等于大于或等于)=(=(等于等于)!=(!=(不等于不等于)优先级相同(高)优先级相同(高)优先级相同(低优先级相同(低)说明:说明:关系运算符的优
2、先级低于算术运算符关系运算符的优先级低于算术运算符关系运算符的优先级高于赋值运算符关系运算符的优先级高于赋值运算符33.1 关系运算符和关系表达式关系运算符和关系表达式(二二).).关系表达式关系表达式用关系运算符将两个表达式(可以是算术表达式或用关系运算符将两个表达式(可以是算术表达式或 关系表达式,逻辑表达式,赋值表达式,字符表达式)关系表达式,逻辑表达式,赋值表达式,字符表达式)接起来的式子,称关系表达式接起来的式子,称关系表达式例:例:ab,a+bb+c,(a=3)(b=5),ab)(bb”的值为的值为“真真”,表达式的值为,表达式的值为1。41.1.有三个有三个&(与与):两边为两边
3、为1,结果为,结果为1|(或):两边有一个为(或):两边有一个为1,结果为,结果为1!(非):非(非):非1为为0,非,非0为为12.优先级:优先级:!的优先级高于的优先级高于&和和|逻辑运算与其他运算相比:逻辑运算与其他运算相比:非的优先级最高,与和或低非的优先级最高,与和或低于其他于其他3.结合性:与和或是从左向右,非是从右向左结合性:与和或是从左向右,非是从右向左(一一).).逻辑表达式及其优先顺序逻辑表达式及其优先顺序3.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式53.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式例:例:设设a=4a=4,b=5b=5:!a!a的值为的值为0
4、a&b0 a&b的值为的值为1 1a|ba|b的值为的值为1 !a|b1 !a|b的值为的值为1 14&0|24&0|2的值为的值为1 1任何非零的数值被认作任何非零的数值被认作“真真”(二)(二)逻辑表达式逻辑表达式2.表达式的值为表达式的值为逻辑逻辑的的1和和0,表示,表示真真与与假假用逻辑运算符将用逻辑运算符将关系运算表达式关系运算表达式或或逻辑量逻辑量连接起来构成连接起来构成逻辑表达式逻辑表达式63.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式补充:在逻辑表达式的求解中,并不是所有的逻辑运算符补充:在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。都要被执行。(1)a&b&c
5、 (1)a&b&c 只有只有a a为真时,才需要判断为真时,才需要判断b b的值,只有的值,只有a a和和b b都为真时,才需要判断都为真时,才需要判断c c的值。的值。(2)a|b|c (2)a|b|c 只要只要a a为真,就不必判断为真,就不必判断b b和和c c的值,只有的值,只有a a为假,才判断为假,才判断b b。a a和和b b都为假才判断都为假才判断c c例例:(m=ab)&(n=cd)当当a=1,b=2,c=3,d=4,ma=1,b=2,c=3,d=4,m和和n n的原值为的原值为1 1时,由于时,由于“ab”ab”的值的值为为0 0,因此,因此m=0m=0,而,而“n=cd”
6、n=cd”不被执行,因此不被执行,因此n n的值不是的值不是0 0而而仍保持原值仍保持原值1 1。73.3 if语句语句一一.If.If语句的三种基本形式语句的三种基本形式(1)if (1)if (表达式)(表达式)语句语句;例:例:if(xy)printf(“%d”,x);表达式表达式语句语句真(非真(非0)假假(0)83.3 if语句语句(2)if(2)if(表达式表达式)语句语句1;1;else else 语句语句2;2;例:例:if(xy)printf(“%d”,x);else printf(“%d”,y);条件条件 语句语句1 语句语句2YN91011123.3 if语句语句(3)i
7、f(3)if(表达式(表达式1 1)语句)语句1 1 else if(else if(表达式表达式2)2)语句语句2 2 else if(else if(表达式表达式3)3)语句语句3 3 else if(else if(表达式表达式m)m)语句语句m m else else 语句语句n n13143.3 if语句语句二二.If.If语句的嵌套语句的嵌套 格式格式:if(表达式)(表达式)if(表达式表达式1)语句语句1;else 语句语句2;else if(表达式表达式2)语句)语句3;else 语句语句4;判断表达式的值,若为非判断表达式的值,若为非0,再判断,再判断表达式表达式1的值,非
8、的值,非0执行语句执行语句1,否则执行语句,否则执行语句2。若表达式的值为若表达式的值为0,再,再判断判断表达式表达式2的值,非的值,非0执行语句执行语句3,否则执行语句否则执行语句4。155.3 if语句语句表达式表达式语句语句1语句语句2语句语句3语句语句4表达式表达式2表达式表达式1111000在一个在一个if结构中,包含一个或多个结构中,包含一个或多个if结构结构1617183.3 if语句语句匹配规则匹配规则:elseelse总是与它上面的,最近的,统一复合语句中的,未配总是与它上面的,最近的,统一复合语句中的,未配对的对的ifif语句配对。语句配对。例:例:If()If()if()
9、if()语句语句1;1;elseelseif()if()语句语句2;2;else else 语句语句3;3;例:例:If()If()if()if()语句语句1;1;elseelseif()if()语句语句2;2;else else 语句语句3;3;当当ifif和和elseelse数目不同时,可以加数目不同时,可以加花括号花括号来确定配对关系。来确定配对关系。193.3 if语句语句1 1、条件运算符条件运算符?和和:,它们与三个操作数组组成三元运算。它们与三个操作数组组成三元运算。2 2、形式为形式为:1?2:33 3、求值规则和表达式的值求值规则和表达式的值:真真(非非0),0),求解表达式
10、求解表达式2 2 求解表达式求解表达式1 1 条件表达式条件表达式的值的值 假假(0),(0),求解表达式求解表达式3 3例如例如:int max,int max,a=5;b=3;a=5;b=3;max=ab?a:b max=ab?a:b maxmax及赋值表达式的值均为及赋值表达式的值均为5;5;ab?a:b+1 abab时将时将a a的值赋给的值赋给maxmax,当,当abab时将时将b b的值赋给的值赋给maxmax,可以看到无论可以看到无论abab是否满足,都是向同一个变量赋值。是否满足,都是向同一个变量赋值。可以用下面的条件运算符来处理:可以用下面的条件运算符来处理:()?)?;21
11、3.3 if语句语句例例5.45.4输入一个字符,判别它是否大写字母,如果是,将输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。得到的字符。#include#include void main()void main()char ch;char ch;scanf(%c,&ch);scanf(%c,&ch);ch=ch=(ch=A&ch=A&ch=Z)?(ch+32):ch;printf(%cn,ch);printf(%cn,ch);如果字符变量ch的值为大写字母,则条件表达式的值为(),即相应
12、的小写字母。如果ch的值不是大写字母,则条件表达式的值为,即不进行转换。222324252627282930313233343536373839405.4 switch语句语句格式:格式:switch(表达式表达式)case 常量表达式常量表达式1:语句语句1 case 常量表达式常量表达式2:语句语句2 .case 常量表达式常量表达式n:语句语句n default:语句语句n+1 先计算表达式的值,判断此值是否先计算表达式的值,判断此值是否与某个常量表达式的值匹配,如果与某个常量表达式的值匹配,如果有,控制转向其后相应的语句,若有,控制转向其后相应的语句,若无,检查无,检查 default
13、。多重分支的条件多重分支的条件语句语句 switch语句1常量常量1?计算表达式计算表达式的值的值语句语句2常量常量2语句语句n+1default?41 补充:补充:后面括弧内的后面括弧内的“表达式表达式”,标准允许标准允许 它为任何类型。它为任何类型。(2)(2)当表达式的值与某一个后面的常量表达式的值相当表达式的值与某一个后面的常量表达式的值相 等时,就执行此后面的语句,若所有的等时,就执行此后面的语句,若所有的 中的常量表达式的值都没有与表达式的值匹配的,就执行中的常量表达式的值都没有与表达式的值匹配的,就执行 后面的语句。后面的语句。(3)(3)每一个的常量表达式的值必须互不相同,否则
14、就每一个的常量表达式的值必须互不相同,否则就 会出现互相矛盾的现象(对表达式的同一个值,有两种或会出现互相矛盾的现象(对表达式的同一个值,有两种或 多种执行方案)。多种执行方案)。5.4 switch语句语句425.4 switch语句语句(4)(4)各个和的出现次序不影响执行结各个和的出现次序不影响执行结 果。果。(5)(5)执行完一个后面的语句后,流程控制转移到下一执行完一个后面的语句后,流程控制转移到下一 个继续执行。在执行语句时,根据个继续执行。在执行语句时,根据后面表达式的值找到匹配的入口标号,就从此标后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。号开始执行
15、下去,不再进行判断。应该在执行一个分应该在执行一个分支后支后,可以用一个语句来终止可以用一个语句来终止switchswitch语句的执行。语句的执行。(6)(6)多个可以共用一组执行语句。多个可以共用一组执行语句。435.5 程序举例程序举例例例5 56 6 求方程的解求方程的解。基本的算法:基本的算法:,不是二次方程。,不是二次方程。,有两个相等实根。,有两个相等实根。,有两个不等实根。,有两个不等实根。,有两个共轭复根。,有两个共轭复根。445.5 程序举例程序举例 程序如下:程序如下:#include#include#include#include void main()void mai
16、n()float a,b,c,disc,x1,x2,realpart,imagpart;float a,b,c,disc,x1,x2,realpart,imagpart;scanf(%f,%f,%f,&a,&b,&c);scanf(%f,%f,%f,&a,&b,&c);printf(the equation);printf(the equation);if(fabs(a)=1e-6)if(fabs(a)=1e-6)printf(is not a quadraticn);printf(is not a quadraticn);elseelse disc=b disc=b*b-4b-4*a a*c
17、;c;if(fabs(disc)=1e-6)if(fabs(disc)1e-6)else if(disc1e-6)x1=(-b+sqrt(disc)/(2x1=(-b+sqrt(disc)/(2*a);a);x2=(-b-sqrt(disc)/(2 x2=(-b-sqrt(disc)/(2*a);a);printf(“has distinct real roots:%8.4f and printf(“has distinct real roots:%8.4f and%8.4fn”,x1,x2);%8.4fn”,x1,x2);else elserealpart=-b/(2realpart=-b/(2*a);a);imagpart=sqrt(-disc)/(2 imagpart=sqrt(-disc)/(2*a);a);printf(“has complex rootsn”);printf(“has complex rootsn”);printf(“%8.4f+%8.4fin”,realpart,imagpart);printf(“%8.4f+%8.4fin”,realpart,imagpart);printf(“%8.4f-%8.4fin”,realpart,imagpart);printf(“%8.4f-%8.4fin”,realpart,imagpart);