1、第 5 章 选择结构程序设计选择结构的作用是,根据所指定的条件是否满足,决定从给定的两组操作选择其一。在 C 语言中选择结构是用 if 语句实现的。5.1 关系运算符和关系表达式1.关系运算符实际上是比较运算符。2.C 的关系运算符有: (大于) = (大于或等于) = (等于) != (不等于) 优先级相同 (低)3.关于优先次序: 前 4 种关系运算符(, )的优先级别相同,后两种也相同。前 4 种高于后两种。例如, “”优先于“” 。而“”与“a+b 等效于 c(a+b)ab=c 等效于(ab)=ca=bc 等效于 a=(bc)4.关系表达式(1)用关系运算符将两个表达式(可以是算术表达
2、式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。例如:ab, a+bb+c,(a= =3)(b= =5), a b)(b=0”的值为“真” 。(3)在 C 中都用数值 1 代表 “真” ,用 0 代表“假” 。如果有以下赋值表达式:假定 a=3,b=2,c=1d=ab 则 d 得到的值为 1f=abc f 得到的值为 0(4)关系运算符的运算方向为:由左向右5.2 逻辑运算符和逻辑表达式1.用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。2.C 提供 3 种逻辑运算符:if (xy) printf(“%d”,x);if(条件表达式) 复合语句;
3、例如:求 x 的绝对值#includevoid main( )int x, absx;printf(“please input x=“);scanf(“%d“,absx=x;if(xvoid main( )int x, absx;printf(“please input x=“);scanf(“%d“,if(x=0)absx=x;else absx=-x;printf(“x=%dt|x|=%dn“,x,absx);(3)在 if 语句中又包含一个或多个 if 语句,形式为: if(表达式 1) 语句 1;else if (表达式 2) 语句 2;else if(表达式 3) 语句 3;else
4、 语句 n+1;语句 2,n 可以是复合语句,每层的 if 与 else 配对,或者用来确定层次关系。即:注意:(1)3 种形式的 if 语句中在 if 后面都有表达式,一般为逻辑表达式或关系表达式。(2)第二、第三种形式的 if 语句中,在每个 else 前面有一个分号,整个语句结束处有一个分号。(3)else 语句不能单独使用,它必须是 if 语句的一部分,与 if 配对使用。3.If 语句的嵌套在 if 语句中又包含一个或多个 if 语句的嵌套。If()If()语句 1else 语句 2ElseIf()语句 3Else 语句 4(1)if 与 else 的配对原则:else 总是与它上面
5、最近的且尚未配对的 if 配对。(2)如果 if 与 else 的数目不一样,为实现程序设计者的企图,可以加花括号来确定配对关系。3.条件运算符: ? :条件运算符是 C 语言中唯一一个三目运算符。4.条件表达式的一般形式:表达式 1?表达式 2:表达式 3例如: (ab) ? c=a :c=b c=(ab)?a:b说明:(1)条件运算符的执行顺序:先求解表达式 1,若为非 0(真)则求解表达式 2,此时表达式 2 的值就作为整个条件表达式的值。若为表达式 1 的值为 0(假)则求解表达式 3,此时表达式 3 的值就作为整个条件表达式的值。表达式 1语句 1表达式 2语句 2表达式 3语句 3
6、表达式 4语句 5语句 4(2)条件运算符优先于赋值运算符,低于关系运算符和算术运算符。(3)条件运算符的结合方向为“自右至左” 。结合方向为“自右至左”ab?a:cd?c:d 等价于 ab?a:(cd?c:d)例如:#includevoid main()char ch;scanf(“%c“,ch=(ch=Ascanf(“%c”,switch(grade)case A:printf(“85100n“); break;case B:printf(“7084n“); break;case C:printf(“6069n“); break;case D:printf(“60n“); break;de
7、fault: printf(“errorn“);#includevoid main() char grade;scanf(“%c”,switch(grade)case A:case B:case C:printf(“PASSn“); break;case D:printf(“FAILn“); break;default: printf(“errorn“);5.5 程序举例运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下: s250km 没有折扣250s500 2折扣500s1000 5折扣1000s2000 8折扣2000s3000 10折扣3000s 15折扣设每公里每吨货物
8、的基本运费为 p(price 的缩写),货物重为 w(wright 的缩写) ,距离为,折扣为 d(discount 的缩写),则总运费 f(freight 的缩写) 的计算公式为 f = p * w * s * (1 - d)程序如下: #include void main( )int c,s;float p,w,d,f;printf(please enter p,w,s:);scanf(“%f,%f,%d”,if(s=3000) c=12;else c=s/250;switch (c) case 0:d=0;break;case 1:d=2;break;case 2:case 3:d=5;break;case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);printf(“freight=%fn,f);case 语句说明:1)各个 case 常量与开关表达式的类型要一致,只能是整型、字符型或枚举型。例如:float f=4.0;switch(f) 非法2)case 常量不能重复3)case 后面可以跟一条语句,也可以跟一个语句序列4)可以嵌套5)只进行相等条件的判断,if 则可进行大于、小于的判断