第五章 选择结构程序设计
第五章 选择结构程序设计
本章要点
关系表达式
逻辑表达式
选择结构程序设计
5.1 关系运算符和关系表达式
1.关系运算符及其优先次序
说明:
关系运算符的优先级低于算术运算符
关系运算符的优先级高于赋值运算符
2.关系表达式
用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符表达式)接起来的式子,称关系表达式
例:a>b,a+b>b+c,(a=3)>(b=5),’a’b)>(b
例:关系表达式”a>b”的值为“真”,表达式的值为1。
5.2 逻辑运算符和逻辑表达式
1.逻辑运算符及其优先次序
(1)&& (逻辑与) 相当于其他语言中的AND
(2)|| (逻辑或) 相当于其他语言中的OR
(3)! (逻辑非) 相当于其他语言中的NOT
例:a&&b 若a,b为真,则a&&b为真。
a||b 若a,b之一为真,则a||b为真。
!a 若a为真,则!a为假。
优先次序:
!(非)->&&()->||()
逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符
2.逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。
逻辑表达式的值应该是一个逻辑量“真”或“假”。
例:设a=4,b=5:(任何非零的数值被认作“真”)
!a的值为0 a&&b的值为1
a||b的值为1 !a||b的值为1
4&&0||2的值为1
在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。
(1)a&&b&&c 只有a为真时,才需要判断b的值,只有a和b都为真时,才需要判断c的值。
(2)a||b||c 只要a为真,就不必判断b和c的值,只有a为假,才判断b。a和b都为假才判断c
例:(m=a>b)&&(n=c>d)
当a=1,b=2,c=3,d=4,m和n的原值为1时,由于“a>b”的值为0,因此m=0,而“n=c>d”不被执行,因此n的值不是0而仍保持原值1。
5.3 if语句
1.if语句的三种基本形式
360doc
360doc
360doc
例:
if(number>500)cost=0.15;
else if(number>300)cost=0.10;
else if(number>100)cost=0.075;
else if(number>50)cost=0.05;
else cost=0;
说明:
(1)3种形式的if语句中在if后面都有表达式,一般为逻辑表达式或关系表达式。
(2)第二,第三种形式的if语句中,在每个 else前面有一个分号,整个语句结束处有一个分号。
(3)在if和else后面可以只含有一个内嵌的操作语句,也可以由多个操作语句,此时用花括号将几个语句括起来成为一个复合语句。
2.if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套。
形式:
匹配规则:
else总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对。
当if和else数目不同时,可以加花括号来确定配对关系。
3.条件运算符
格式:表达式1?表达式2∶表达式3
功能:判断表达式1的值,如果成立就执行表
达式2,否则就执行表达式3
使用场合:若在if语句中,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值时,可以 用一个条件运算符来处理。
例:
if(a>b) max=a;
elsemax=b;
当a>b时将a的值赋给max,当a≤b时将b的值赋给max,可以看到无论a>b是否满足,都是向同一个变量赋值。 可以用下面的条件运算符来处理:
max=(a>b)?a∶b;
说明:
(1)条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。
(2)条件运算符优先级高于赋值运算符 ,低于关系运算符和算术运算符。
(3)条件运算符的结合方向为“自右至左”。
(4)“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式。
(5)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。
5.4switch语句
1.switch语句的格式:
switch (表达式)
{
case 常量表达式1:语句1
case 常量表达式2:语句2
…
case 常量表达式n:语句n
default :语句n+1
}
例:要求按照考试成绩的等级输出百分制分数段,用switch语句实现:
switch(grade)
{ case ′A′∶printf(″85~100\n″);
case ′B′∶ printf (″70~84\n″);
case ′C′∶ printf (″60~69\n″);
case ′D′∶ printf (″<60\n″);
default∶( printf ″error\n″);
}
说明:
(1)switch后面括弧内的“表达式”, ANSI标准允许它为任何类型。
(2) 当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。
(3) 每一个case的常量表达式的值必须互不相同,否则就 会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。
(4) 各个case和default的出现次序不影响执行结果。例如,可以先出现“default:…”,再出现“case ′D′:…”,然后是“case′A′:…”。
(5) 执行完一个case后面的语句后,流程控制转移到下一 个case继续执行。“case常量表达式”只是起语句标号作用,并不是在条件判断。在执行switch语句时,根据switch后面表达式的值 找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。应该在执行一个case分支后,可以用一个break语句来终止switch语句的执行。
(6) 多个可以共用一组执行语句。
例5.7 运输公司对用户计算运费。
路程(s)越远,每公里运费越低。标准如下:
s<250km 没有折扣
250≤s<500 2%折扣
500≤s<1000 5%折扣
1000≤s<2000 8%折扣
2000≤s<3000 10%折扣
3000≤s 15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:f=p*w*s*(1-d)
分析折扣变化的规律性:
折扣的“变化点”都是250的倍数在横轴上加一种坐标c,c的值为s/250。c代表250的倍数。
c
1≤c<2,折扣d=2%;
2≤c<4,d=5%;
4≤c<8,d=8%;
8≤c<12,d=10%;
c≥12,d=15%。
#include
void main ( )
{
int c,s;
float p,w,d,f;
scanf("%f,%f,%d",&p,&w,&s);
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:case6: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=%15.4f\n",f);
}