第五章 选择结构程序设计本章内容:
1.关系运算符和关系表达式
2.逻辑运算符和逻辑表达式
3.if语句的使用
4.条件运算符和条件表达式
5.switch语句的使用
6.程序举例顺序结构语句 1
语句 2
条件语句 1 语句 2
Y N
选择结构选择结构 --根据某些条件决定执行或不执行某组操作关系运算符和表达式
1.关系运算符及优先次序比较两个量的运算符称为关系运算符 。
在C语言中有以下关系运算符:
< 小于 <= 小于或等于 > 大于
>= 大于或等于 = = 等于 != 不等于关系运算符的优先级别:
(1) >,>=,<,<=优先级相等,= =,!=优先级相等,
前者高于后者 。
(2) 关系运算符的优先级低于算术运算符 。
(3) 关系运算符的优先级高于赋值运算符 。
关系表达式的一般形式为:
表达式 1 关系运算符 表达式 2
例如,a+b>c-d x>3/2
'a'+1<c -i-5*j==k+1
关系表达式的值是,关系成立为,真,,不成立则为
,假,。
C语言中没有逻辑数据型,用 1 表示,真,,0 表示
,假,。
如,5>0的值为,真,,即为 1。
(a=3)>(b=5)由于 3>5不成立,其值为 0。
关系表达式是表达式,因此也允许出现嵌套的情况 。
如,a>(b>c),a!=(c==d)等 。
2.关系表达式
1.逻辑运算符
C语言中提供了三种逻辑运算符
! 非运算 && 与运算 || 或运算运算符 &&,运算符 || 均为双目运算符,具有左结合性 。
非运算符 !为单目运算符,具有右结合性 。
1)逻辑运算符优先级如下:
( 1) ! 高于 && 高于 ||
( 2) &&,|| 低于关系运算符,! 高于算术运算符 (*,/ )
逻辑运算符和表达式按照运算符的优先顺序可以得出:
a>b && c>d 等价于 (a>b) && (c>d)
!b==c||d<a 等价于 ((!b)==c)||(d<a)
a+b>c && x+y<b 等价于 ((a+b)>c) && ((x+y)<b)
逻辑运算符
2)逻辑运算的值:
逻辑运算的值也为,真,和,假,两种,用,1”和,0,来表示。
反过来在判断一个量是为,真,还是为,假,时,以,0”
的数值代表,假,,以非,0”的数值代表,真,。
( 1) 与运算 &&
参与运算的两个量都为真时 (非 0),结果才为真 (值为 1),
否则为假 (值为 0)。
例如,5>0 && 4>2,由于 5>0为真,4>2也为真,其结果也为,真,,表达式的值为 1。
3)逻辑运算的规则:
( 2)或运算 ||
参与运算的两个量只要有一个为真 (非 0),结果就为真 (值为 1)。 两个量都为假(值为 0)时,结果为假(值为 0)。
例如,5>0 || 5>8,结果也就为真(值为 1)。
( 3) 非运算 !
参与运算量为真 ( 非 0) 时,结果为假 ( 值为 0) ;参与运算量为假 ( 值为 0) 时,结果为真 ( 值为 1) 。
例如,!(5>0)的结果为假,即为 0。
2.逻辑表达式逻辑表达式的一般形式为:
表达式 && 表达式 表达式 || 表达式 ! 表达式逻辑表达式的值:各种逻辑运算的最后值,以,1”和,0”
分别代表,真,和,假,。
3)逻辑运算的规则:
main()
{
char c='k';
int i=1,j=2,k=3;
float x=3e+5,y=0.85;
printf("%d,%d\n",!x*!y,!!!x);
printf("%d,%d\n",x||i&&j-3,i<j&&x<y);
printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);
}
分析下段程序的输出结果
0,0
1,0
0,1
在逻辑表达式的求解中,并不是所有的逻辑运算符都执行,只有在必须执行下一个逻辑运算符才能求出表达式的值时,才执行下一个运算符。
( 1) 表达式 1 && 表达式 2 && ……
a+b>0 && b++ ( a=1,b=-2)
如果:表达式 1的值是 0,无论表达式 2的值是什么,
整个表达式的值都为 0,因此表达式 2就不计算了。
( 2)表达式 1 || 表达式 2 || ……
a+b>0 || b++ ( a=1,b=2 )
如果:表达式 1的值是 1,无论表达式 2的值是什么,
整个表达式的值都为 1,因此表达式 2就不计算了 。
说 明,
( 3)若 a= 1,b= 2,c= 3,d=4,m和 n原值为 1
(m=a>b) && (n=c>d)
则 m= 0,而 n仍保持原值
(4)?c? &&?d?
逻辑运算符两侧,可以是任意类型的数据类型说 明,
1.if语句有三种基本形式
1) 第一种形式,基本形式,
if (表达式 ) 语句;
如果表达式的值为真,则执行其后语句,否则不执行该语句 。
语句表达式非 0 0
if 语句
void main()
{ int a,b,max;
scanf("%d,%d",&a,&b);
max=a;
if (max<b) max=b;
printf("max=%d",max);
}
if(表达式 )
语句 1;
else
语句 2;
如果表达式的值为真,则执行语句 1,否则执行语句 2。
void main()
{ int a,b;
scanf("%d,%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
}
例:
语句 1
表达式非 0 0
语句 2
2)第二种形式,if-else形式前二种形式的 if语句一般都用于两个分支的情况 。
当有多个分支选择时,可采用 if-else-if语句,其一般形式为:
if(表达式 1)
语句 1;
else if(表达式 2)
语句 2;

else if(表达式 m)
语句 m;
else
语句 n;
语句 n
语句 1
表达式 1
非 0 0
语句 2
非 0
0表达式 2
表达式 m
非 0
0
语句 m
if…else if 结构的执行过程
3)第三种形式,if-else-if形式
void main()
{ int result;
printf("input your result,");
scanf(“%d”,&result);
if (result>=90)
printf(“your result is wounderful!\n");
else if(result >=80)
printf(" your result is good!\n");
else if(result >=70)
printf(" your result is normal!\n");
else if(result >=60)
printf(" your result is passed!\n");
else
printf(“you?ll take a another test!\n");
}
例 如:
(1)在三种形式的 if语句中,在 if关键字之后均为 表达式 。 该表达式通常是 逻辑表达式 或 关系表达式,
但也可以是 其它表达式,如 赋值表达式 等,甚至也可以是一个 变量 。
注 意,
例如,if(a=5) 语句; if(b) 语句;
只要表达式的值为非 0,即为,真,。
但是在 if(a=5) …;中表达式的值永远为非 0,
所以其后的语句总是要执行的,但在语法上是合法的。
又如,问下面程序段的输出结果?,
int b,a=10;
scanf("%d",&b);
if (a=b)
printf("a=b%d\n",a);
else
printf("a!=b%d,%d\n",a,b);
注 意,
(2) 在 if 语句中,条件判断 表达式必须用括号括起来,即使是一个变量的最简单表达式,也要用括号括起来; 在语句之后必须加分号 。
(3) 在 if 语句的三种形式中,所有的语句应为单个语句,
如果要想在满足条件时执行一组 (多个 )语句,则必须把这一组语句用 { } 括起来组成一个复合语句 。
注意,
例如:交换两个变量
if (a>b)
{ t= a;
a=b;
b=t; }
当 if语句中包含 if语句时,则构成了 if 语句嵌套的情形 。
其一般形式可表示如下:
if (表达式 1)
if (表达式 2) 语句 1;
else 语句 2;
2,if 语句的嵌套
if(表达式 1)
if (表达式 2) 语句;
在嵌套内的 if语句可能又是 if-else型的,这将会出现多个 if和多个 else重叠的情况,这时要特别注意 if和 else的配对问题。
if (x>=1)
if(x>5)
x++;
else
x--;
其中的 else究竟是与哪一个 if配对呢?
应该理解为,还是应理解为:
if( x>=1) if(x>=1)
if(x>5) if(x>5)
x++; x++;
else else
x--; x--;
C语言规定,else 总是与它前面最近的 if配对例 如:
例,void main()
{ int a,b;
printf("please input a,b,");
scanf("%d,%d",&a,&b);
if (a!=b)
if (a>b) printf("a>b\n");
else printf("a<b\n");
else printf("a=b\n");}
if( x>=1)
{ if(x>5)
x++; }
else
x--;
如果要使 else与第一个 if配对,则可加括号 { }来实现。
例 5.3 Pg.95
-1 (x<0)
y= 0 (x=0)
1 (x>0)
main()
{ int x,y;
scanf("%d",&x)
if(x<0) y=-1;
else if (x==0) y=0;
else y=1;
printf("x=%d,y=%d\n",x,y);
}
if(x>=0)
if (x>0) y=1;
else y=0;
else y=-1;
程序 1
y=0;
if (x!=0)
if (x>0) y=1;
else y=-1;
程序 2
y=-1;
if(x>=0)
if (x>0) y=1;
else y=0;
程序 3
条件运算符为?,
三目运算符,即有三个参与运算的量。
由条件运算符组成条件表达式的一般形式为:
表达式 1? 表达式 2,表达式 3
其求值规则为:如果表达式 1的值为真,则以表达式 2 的值作为条件表达式的值,否则以表达式 2的值作为整个条件表达式的值 。
条件运算符和条件表达式条件表达式通常用于赋值语句之中。
例如条件语句:
if(a>b) max=a;
else max=b;
可用条件表达式写为 max=(a>b)?a:b;
执行该语句的语义是:如 a>b为真,则把 a 赋予 max,
否则把 b 赋予 max。
条件运算符和条件表达式条件运算符的运算优先级低于关系运算符和算术运算符,高于赋值符 。
因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b
条件运算符?,是一对运算符,不能分开单独使用 。
条件运算符的结合方向是自右至左 。
例如,a>b?a:c>d?c:d 应理解为 a>b?a:(c>d?c:d)
条件表达式常常用在只执行单个的赋值语句时,不但使程序简洁,也提高了运行效率 。
注意以下几点:
例,输入一个字符,若为大写字母,是则转换成小写,
否则不转换
main()
{
char ch;
scanf("%c",&ch);
ch=(ch>='A' && ch <='Z')? ch+32:ch;
printf("%c",ch);
}
1.switch语句使用的一般形式为:
switch(表达式 )
{
case 常量表达式 1,语句 1;
case 常量表达式 2,语句 2;

case 常量表达式 n,语句 n;
default,语句 n+1;
}
switch语句先计算表达式的值,并逐个与其后的常量表达式值相比较;
当表达式的值与某个常量表达式的值相等时,即执行其后的语句;
然后不再进行判断,继续执行后面所有 case后的语句;
如表达式的值与所有 case后的常量表达式均不相同时,
则执行 default后的语句 。
语句的执行过程,
void main()
{ char grade;
printf("input your mark,");
scanf("%c",&grade);
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"); }
}
程序运行时输入 A,其输出结果是什么?
例 如在 switch语句中,,case 常量表达式,只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个 switch 语句,将继续执行所有后面 case语句的情况 。
为了避免上述情况,C语言还提供了一种 break语句,专用于跳出 switch语句 。
break 语句使用形式为,break;
在每一 case语句之后增加 break 语句,使每一次执行之后均可跳出 switch语句,从而避免输出不应有的结果 。
说 明
switch(表达式 )
{
case 常量表达式 1,语句 1; break;
case 常量表达式 2,语句 2; break;

case 常量表达式 n,语句 n; break;
default,语句 n+1;
}
使用 switch语句的通常形式为:
void main()
{ char grade;
printf("input your mark,");
scanf("%c",&grade);
switch (grade)
{ case?A?:printf(“85~100\n");break;
case?B?2:printf(“70~84\n"); break;
case?C?:printf(“60~69\n"); break;
case?D?:printf(“\<60n"); break;
default,printf("error\n"); }
}
例题修改如下:
1.在 case后的各常量表达式的值不能相同,否则会出现错误 。
2.在 case后,允许有多个语句,可以不用 { }括起来 。
3.各 case和 default子句的先后顺序可以变动,而不会影响程序执行结果 。
4.default子句可以省略不用。
5.若判断的是一个区间,要将区间转换成单个值,见例 5.7。
注意以下几点:
s<250km 没有折扣
250<=s<500 2%折扣
500<=s<1000 5%折扣
1000<=s<2000 8%折扣
2000<=s<3000 10%折扣
3000<=s 15%折扣将区间转换成常量
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 7,d=8;break;
……
case 11,d=10;break;
case 12,d=15;break;
}
例 5.7 计算运输公司的运费,s为路程例,判断某一年是否闰年
void main()
{int year,leap;
scanf(“%d”,&year);
if (year%4==0)
{if (year%100==0)
{if (year%400==0) leap=1;
else leap=0;}
else leap=1;}
else leap=0;
if (leap) printf(“%d is”,year);
else printf(“%d is not”,year);}
闰 年:
1,能被 4整除,但不能被
100整除
2,能被 4整除,又能被
400整除
if (year%4!=0) leap=0;
else if (year%100!=0) leap=1;
else if (year%400!=0) leap=0;
else leap=1;
if ((year%4==0&& year%100!=0)|| (year%400==0)) leap=1;
else leap=0;
if (year%4==0)
{if (year%100==0)
{if (year%400==0) leap=1;
else leap=0;}
else leap=1;}
else leap=0;
判断闰年的不同实现方式
void main()
{ float a,b,s;
char c;
printf("input expression,a+(-,*,/)b \n");
scanf("%f%c%f",&a,&c,&b);
switch(c)
{ case '+',printf("%f\n",a+b);break;
case '-',printf("%f\n",a-b);break;
case '*',printf("%f\n",a*b);break;
case '/',printf("%f\n",a/b);break;
default,printf("input error\n");
}
}
计 算 器 程 序用户输入运算数和四则运算符,输出计算结果
1.关系表达式和逻辑表达式是两种重要的表达式,主要用于条件执行的判断。
2.C语言提供了多种形式的条件语句以构成分支结构 。
(1)if语句主要用于单向选择 。
(2)if-else语句主要用于双向选择 。
(3)if-else-if语句和 switch语句用于多向选择 。
这几种形式的条件语句一般来说可以互相替代。
本章小结课本 Pg.104 5.3 5.5 5.6
作 业