1
教学目与要求掌握关系运算符和逻辑运算符及其优先顺序,关系表达式和逻辑表达式的组成及运算,if语句的三种形式,条件嵌套时 If和 else配对规则,条件 运算符及条件表达式,switch语句格式和作用。
教学内容:
关系运算符和关系表达式;逻辑运算符和逻辑表达式; if语句; switch语句;程序举例。
教学重点与难点:
if语句的三种形式及 switch语句,条件嵌套。
第 5章 选择结构程序设计
2
5.1 关系运算符和表达式
5.1.1 关系运算符及优先次序:
种类,< <= == >= > !=
结合方向:自左向右
优先级别:低于算术,高于赋值
<
<=
>
>=
==
!=
优先级 6(高)
优先级 7(低)
例 c>a+b //c>(a+b)
a>b!=c //(a>b)!=c
a==b<c //a==(b<c)
a=b>c //a=(b>c)
5.1.2 关系表达式:用关系运算符将两个表达式 (算术、关系、逻辑、赋值及字符表达式)连接起来的式子。其值是一个逻辑值“真”或“假”,在 C的逻辑运算中,分别用 1和 0表示
例 int a=3,b=2,c=1,d,f;
a>b
(a>b)==c
b+c<a
d=a>b
f=a>b>c
//表达式值 1
//表达式值 1
//表达式值 0
//d=1
//f=0
3
关系运算注意:
例 若 a=0; b=0.5; x=0.3;
则 a<=x<=b的值为 0
例 5>2>7>8在 C中是允许的,
值为 0
例 int i=1,j=7,a;
a=i+(j%4!=0);
则 a= 2
例 ‘ a?>0 结果为
‘ A?>100 结果为
1
0
5.1 关系运算符和表达式
4
关系运算注意:
例 注意区分,=”与,==”
int a=0,b=1;
if(a=b)
printf(“a equal to b”);
else
printf(“a not equal to b”);
例 应避免对实数作相等或不等的判断如 1.0/3.0*3.0==1.0 结果为可改写为,fabs(1.0/3.0*3.0-1.0)<1e-6
0
5.1 关系运算符和表达式
5
a b !a !b a&&b a||b
真假真假假假真真
5.2,逻辑运算符和表达式
5.2.1 逻辑运算符及顺序
种类,! && ||
逻辑运算真值表
C语言中,运算量,0表示,假,,
非 0表示,真,,
运算结果,0表示,假,,
1表示,真,,
真假假假假假真真假假真真真假真真
6
! (2)
&& (11)
|| (12)
高低例 a<=x && x<=b
a>b&&x>y
a==b||x==y
!a||a>b
优先级,
结合方向:
!,从右向左
&&,从左向右
||,从左向右
// (a<=x) && (x<=b)
//(a>b)&&(x>y)
//(a==b)||(x==y)
//(!a)||(a>b)
5.2,逻辑运算符和表达式
5.2.2 逻辑表达式
7
! (2)
&& (11)
|| (12)
高低
优先级:
结合方向:
!,从右向左
&&,从左向右
||,从左向右例 a=4;b=5;
!a
a&&b
a||b
!a||b
4&&0||2
5>3&&2||8<4-!0
c?&&?d?
值为 1
值为 0
值为 1
值为 1
值为 1
值为 1
//(5>3)&&2||(8<(4-(!0))) 值为 1
5.2,逻辑运算符和表达式
5.2.2逻辑表达式
8
! (2)
&& (11)
|| (12)
高低
优先级:
结合方向:
!,从右向左
&&,从左向右
||,从左向右短路特性,逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符例 a&&b&&c //只在 a为真时,才判别 b的值;
只在 a,b都为真时,才判别 c的值例 a||b||c //只在 a为假时,才判别 b的值;
只在 a,b都为假时,才判别 c的值例 a=1;b=2;c=3;d=4;m=1;n=1;
(m=a>b)&&(n=c>d) //结果 m=0,n=1
5.2,逻辑运算符和表达式
5.2.2 逻辑表达式
9
5.2 if语句
5.3.1 if语句的三种形式
形式一:
格式,if (expression)
statement
执行过程:
expr
statement
非 0
=0
expr
statement1 statement2
非 0 =0?形式二,?格式,if (expression)
statement1
else
statement2
执行过程,例,if (x>y) max=x;
else max=y;
例,if (x>y)
printf(“%d”,x);
10
5.2 if语句
5.3.1 if语句的三种形式形式三:
格式:
if ( expr1 ) statement1
else if (expr2 ) statement2
else if (expr3 ) statement3
…...
[ else statementn ]
expr1
statemnt
1
非 0
=0
expr2
expr3
statemnt
n
statemnt
3
statemnt
2
非 0
非 0
=0
=0
执行过程:
例,if (salary>1000) index=0.4;
else if (salary>800) index=0.3;
else if (salary>600) index=0.2;
else if (salary>400) index=0.1;
else index=0;
11
如,if(a==b&&x==y) printf(“a=b,x=y”);
if(3) printf(“OK”);
if(?a?) printf(“%d”,?a?);
5.2 if语句
5.3.1 if语句的三种形式 说明:
if后面的表达式类型任意?语句可以是复合语句
if(x)? if(x!=0)
if(!x)? if(x==0)例 考虑下面程序的输出结果,
#include <stdio.h>
main()
{ int x,y;
scanf(“%d,%d”,&x,&y);
if(x>y)
x=y; y=x;
else
x++; y++;
printf(“%d,%d\n”,x,y);
}
Compile Error!
12
5.3.2 if语句嵌套,
一般形式:
if (expr1)
if (expr2) statement1
else statement2
else
if(expr3) statement3
else statement4
内嵌 if
内嵌 if
if (expr1)
if (expr2)
statement1
else
statement2
内嵌 if
if (expr1)
{ if (expr2)
statement1; }
else
statement3
内嵌 if
if (expr1)
statement1
else
if(expr3)
statement3
else
statement4
内嵌 if
13
if ~ else 配对原则,缺省 { }时,else总是和它上面离它最近的未配对的 if配对
if(……)
if(……)
if(……)
else…...
else…...
else…...
5.3.2 if语句嵌套,
14
例,if (a==b)
if(b==c)
printf(“a==b==c”);
else
printf(“a!=b”);
修改,if (a==b)
{ if(b==c)
printf(“a==b==c”);
}
else
printf(“a!=b”);
实现 if ~ else 正确配对方法:加 { }
5.3.2 if语句嵌套,
15
#include <stdio.h>
main()
{ int a=1,b=-1,c=3;
if (a<b)
if (b<0) c=0; else c++;
printf(“%d\n”,c);
}
1.写出程序的运行结果 2.若执行以下程序时从键盘上键入 5,则输出结果是什么
#include <stdio.h>
main()
{ int x;
scanf(“%d”,&x);
if (++x<6)
printf(“%d\n”,x)
else
printf(“%d\n”,x--);
}
结果,3
结果,6
16
#include <stdio.h>
main()
{ int a=4,b=3,c=5,t=0;
if (a<b)
t=a;a=b;b=t;
if (a<c)
t=a;a=c;c=t;
printf(“%d,%d,%d\n”,a,b,c);
}
3.写出下列程序的运行结果 #include <stdio.h>
main()
{ int i=1,j=1,k=1;
if ((j++ || k++) && i++)
printf(“%d,%d,%d\n”,i,j,k);
}
#include <stdio.h>
main()
{ int x,y=5;
if (x=y!=0)
printf(“%d \n”,x);
else printf(“%d \n”,x+2);
}
结果,503
结果,2,2,1
结果,1
17
5.3.3 条件运算符一般形式,expr1? expr2,expr3
执行过程
功能:相当于条件语句例 if (a>b)
printf(“%d”,a);
else
printf(“%d”,b);
printf(“%d”,a>b?a:b);
例 求 a+|b|
printf(“a+|b|=%d\n”,b>0?a+b:a-b);
expr1
取 expr2值 取 expr3值非 0 =0
例 (a==b)Y?:?N?
(x%2==1)?1:0
(x>=0)?x:-x
(c>=?a? && c<=?z?)?c-?a?+?A?:c
条件运算符可嵌套
如 x>0?1:(x<0?-1:0)
优先级,13
结合方向,自右向左
如 a>b?a:c>d?c:d? a>b?a:(c>d?c:d)
expr1,expr2,expr3类型可不同,表达式值取较高的类型 例 xa?:?b? //x=0,表达式值为‘ b?; x?0,表达式值为‘ a?
x>y?1:1.5 //x>y,值为 1.0; x<y,值为 1.5
例 表达式 2>1>0?3>2>1:4>3>2?5>4>3:6>5>4的值?
结果,0
18
例 考虑下面程序输出结果,
main()
{ int x=100,a=10,b=20;
int v1=5,v2=0;
if(a<b)
if(b!=15)
if(!v1)
x=1;
else
if(v2) x=10;
x=-1;
printf(“%d”,x);
}
结果,-1
19
5.4 switch语句一般形式,switch( 表达式 )
{ case E1:
语句组 1;
break;
case E2:
语句组 2;
break;
…….
case En:
语句组 n;
break;
[default:
语句组 ;]
break;}
执行过程,
1.计算表达式的值;
2.若与 常量表达式 Ei的值一致,则从语句 i开始执行,直到遇到 break语句或 switch的 };
3.若与任何常量表达式值均不一致时则执行 default语句或后续语句 。
switch
表达式语句组 1 语句组 2 语句组 n 语句组…...
E 1 E 2 En default
case
常量表达式
20
说明:
表达式可以是整型、字符型、枚举型,为实型时自动取整
E1,E2,… En是 常量表达式,且值必须互不相同,与表达式的类型应一致
语句标号作用,必须用 break跳出
case后可包含多个可执行语句,且不必加 { }
switch可嵌套
多个 case可共用一组执行语句如,……
case?A?:
case?B?:
case?C?,
printf(“score>60\n”);
break;
……..
5.4 switch语句
21
例 switch(score)
{ case 5,printf(“Very good!”);
case 4,printf(“Good!”);
case 3,printf(“Pass!”);
case 2,printf(“Fail!”);
default,printf(“data error!”);
}
运行结果,score为 5时,输出:
Very good! Good! Pass! Fail! data error!
5.4 switch语句
22
例 void main()
{ int x=1,y=0,a=0,b=0;
switch(x)
{ case 1:
switch(y)
{ case 0,a++; break;
case 1,b++; break;
}
case 2,a++;b++; break;
case 3,a++;b++;
}
printf(“\na=%d,b=%d”,a,b);
}
运行结果,a=2,b=1
5.4 switch语句
23
思考,编写程序实现下列功能:从键盘输入整数 x,判断 x是否大于 10,若是,继续判断 x是否大于 100,若大于,则输出
,x>100”;若 x不大于 10,则输出,x<=10”。以下程序是否正确?若否,应如何修改?
void main()
{int x;
printf(“Enter x:,);
scanf(“%d”,&x);
if(x>10)
if(x>100) printf(“x>100”);
else printf(“x<=10);
}
if(x>10)
{ if(x>100) printf(“x>100”); }
else printf(“x<=10);
if(x>10)
if(x>100) printf(“x>100”);
else ;
else printf(“x<=10);
24
void main( )
{ float value1,value2;
char operator;
printf(″Input your expression,\n″);
scanf(″%f,%c,%f″,&x,&op,&y);
if (op==′+′)
printf(″%f+%f=%.2f\n″,x,y,x+y);
else if (op==′-′)
printf(″%f-%f=%.2f\n″,x,y,x-y);
else if (operator==′*′)
printf(″%f*%f%.2f\n″,x,y,x*y);
else if (o==′/′)
{ if (y==0.0)
printf(″Division by zero.\n″);
else
printf(″%f//%f%.2f\n″,x,y,x/y);
}
}
练习:设计一个简单的计算器,完成两个数的加减乘除 。
void main( )
{ float value1,value2;
char operator;
printf(″Input your expression,\n″);
scanf(″%f,%c,%f″,&x,&op,&y);
switch (op)
{ case ‘+’:
printf(″%f+%f=%.2f\n″,x,y,x+y);
break;
case ‘-’,
printf(″%f-%f=%.2f\n″,x,y,x-y);
break;
case ‘*’,
printf(″%f*%f%.2f\n″,x,y,x*y);
break;
case ‘/’,
if (y==0.0)
printf(″Division by zero.\n″);
else
printf(″%f//%f%.2f\n″,x,y,x/y);
}
}
25
void main()
{ int x;
scanf("%d",&x);
switch (x)
{ case x%2==0:
printf("this is even\n");break;
default:
printf("this is odd\n");break;
}
}
思考,用 switch 语句编写如下,
程序是否有错?
26
if (s>0 && s<10)
if (s>5) x=2; else x=1;
else x=0;
将以下 if-else语句改写成 switch语句,请填空。
switch (s>0 && s<10)
{ case,switch (s>5)
{ case 1,x=2; ;
case 0,x=1;
}break;
case,x=0;
}
1
break
0
27
作业