1
共 37页 第 2 页第一节 关系运算与逻辑运算第二节 用 if语句设计选择结构程序第三节 用 switch语句设计多分支结构第四节 应用实例共 37页 第 3 页
§ 5.1 关系运算与逻辑运算
关系运算和逻辑运算经常作为条件语句和循环语句中的条件,其结果为一 逻辑值
A和 B中至少有一个大于 C
如何用 C语言描述 A和 B全部大于 C
A为不大于 100 的 偶 数关系运算是一种比较运算,将两个值(表达式)进行比较,判断比较的结果是否符合给定的条件关系运算逻辑运算共 37页 第 4 页一、关系运算符大于 >,大于等于 >=,小于 <,
不等 != 小于等于 <=,恒等 ==,
1,六个
==,! =的优先级低于其余四个2,优先级关系运算的优先级高于赋值,低于算术区别赋值
§ 5.1 关系运算与逻辑运算(续)
5.1.1关系运算符与关系表达式
3,结合性,从左向右 a>b>c
共 37页 第 5 页
2,关系表达式的结果是一个逻辑值,根据关系是否满足,
分别取 1,或 0
二、关系表达式
1,关系运算符与运算分量构成关系表达式
int i=1,j=7,a; a=i+(j%4!=0)
a的值? 结果,a=2
3,使用关系表达式应注意
1) 数学上,判断 x是否在区间 [a,b] 时,习惯上写成
a<=x<=b,但在 C 中,必须写成 a<=x && x<=b&&
2) 字符是按 ASCII 存储的,因此 ‘ a’>0 的值为逻辑 1
§ 5.1 关系运算与逻辑运算(续)
共 37页 第 6 页
1.0/3.0 * 3.0 == 1.0的逻辑值为 0
3) 当判断两个浮点数是否相等时,由于存储上的误差,可能会有错误的结果,例如:数学上,恒等式
1.0 / 3.0 * 3.0 = 1.0
4) 在数学中,5 > 2 > 7 > 8 无效,但 C中是允许 的
5)关系表达式的结果可以当成 整型数
int a=3,b=5,c=7,d; d = a<b > c
逻辑 1
1>7
逻辑 0
d的值为 0
§ 5.1 关系运算与逻辑运算(续)
共 37页 第 7 页
5.1.2 逻辑运算符与逻辑表达式一,逻辑运算符
1,有三个
& & (与 ),两边为 1,结果为 1
|| (或):两边有一个为 1,结果为 1
! (非):非 1为 0,非 0为 1
2,优先级,! 的优先级高于 &&和 ||
逻辑运算与其他运算相比,非的优先级最高,与和或低于其他。
3,结合性:与和或是从左向右,非是从右向左
§ 5.1 关系运算与逻辑运算(续)
共 37页 第 8 页二,逻辑表达式
2,表达式的值为 逻辑 的 1和 0,表示 真 与 假任何非零实数均可作为逻辑上的 1
例,a=5,b=7,c=4,d=3
x=(a+b)>(c+d)&&(d>a)
先 做算术运算,再做关系判断,将最后结果赋给 x
1,用逻辑运算符将 关系运算表达式 或 逻辑量 连接起来构成逻辑表达式
5 > 2 > 7 > 8 从左向右运算 (5>2)逻辑值为 1
(1>7)逻辑值为 0
(0>8)逻辑值为 0整个表达式的值为 0
§ 5.1 关系运算与逻辑运算(续)
共 37页 第 9 页
3,在逻辑表达式中,并不是所有的逻辑运算都必须执行
,如果 &&的一边已经为 0,结果一定为 0,如果 || 的一边已经为 1,结果一定为 1
(1) a&&b&&c a为非 0时,再判断 b,a,b均为非 0,再判断 c
(2 ) a||b||c,若 a为非 0,不必判断 b和 c,结果一定为 1
已知,a=1,b=2,c=3,d=4,m=1,n=1 执行
(m=a>b)&&(n=c>d) 之后,m=? n=?
由于 a>b的值为 0,m=0
不再判断 ( n=c>d)的值,因此,n 维持原有的值
m=0
n=1
§ 5.1 关系运算与逻辑运算(续)
共 37页 第 10 页求逻辑表达式的值
1 ) 1<4&&4<7 2 ) 1<4 && 7>4
3 ) !(2<=5) 4 ) ! ( 1< 3) || (2<5)
5 ) !(4<=6)&&(3<=7)
用 C语言描述:
1) a小于 b或小于 c
2) a和 b都大于 c
3) a和 b中有一个大于 c
4) a是非正整数
5) a是奇数
6) a不能被 b整除如何表示闰年
§ 5.1 关系运算与逻辑运算(续)
((year%4==0)&&(year%100
!=0)
||(year%400)==0)
共 37页 第 11 页
5.1.3 条件运算符与条件表达式三,条件运算符 C语言中唯一的一个三目运算符
X=(表达式 1)?(表达式 2):(表达式 3)
将条件语句化成赋值语句
1,格式判断 表达式 1的值,若为非 0,将 表达式 2的值赋给 x,否则,将 表达式 3的值赋给 x
2 功能:
x=(a>b)?a:b 当
a=9,b=5时,x=9
条件运算要求有三个运算分量,并且不论条件是否成立,都必须是为同一个变量赋值
§ 5.1 关系运算与逻辑运算(续)
共 37页 第 12 页
3 条件运算符的优先级:高于赋值,低于其他
4 结合性:从右向左 z=(a>b)?a:(a>d)?c:d
5 数据类型可以不同,x>y?’a’:’b’
执行,int x=10,y=9; int a,b,c;
a=(- -x==y++)?--x:++y;
b=x++; c=y;
后 a,b,c?
a,b,c
A) 9,9,9
B) 8,8,10
C) 8,10,9
D) 1,11,10
X为 9
y为 10 X为 8
§ 5.1 关系运算与逻辑运算(续)
共 37页 第 13 页若 w,x,y,z,m均为 int型变量,则执行下面语句后的 m
值为:
w=1;x=2;y=3;z=4;
m=(w<x)? w,x;
m=(m<y)? m,y;
m=(m<z)? m:z;
A) 1 B) 2 C) 3 D) 4
若 w=1,x=2,y=3,z=4,则表达式
w<x?w:y<z?y:z的值是:
A) 4 B)3 C)2 D)1
§ 5.1 关系运算与逻辑运算(续)
共 37页 第 14 页
§ 5.2 用 if语句设计选择结构程序
if语句构成的选择结构是 C的三种基本结构之一。用来确定给定的条件是否满足,所含条件一般是关系表达式或逻辑运算表达式。
根据学生分数判断是否及格?
根据学生分数如何进行分级?
自然语言,如果 … 那么 …
否则 …
C语言,选择(分支)语句如何解决?
问题:
共 37页 第 15 页本节重点
if语句的缺省形式
if语句的标准形式复合 if语句
if语句的嵌套一,if语句的三种基本形式
1 格式,if(表达式)
语句功能,判断表达式的值,若为非 0,执行语句,否则,跳过 语句继续输出不及格的成绩
main()
{ int a;
scanf(“%d”,&a);
if (a<60)
printf(“%d\n”,a); ; }
§ 5.2 用 if语句设计选择结构程序共 37页 第 16 页
2,格式,if( 表达式)
语句组 1
else
语句组 2
功能,判断表达式的值,若为非 0,执行 语句组 1,否则执行 语句组 2
if(a>60)
printf(“及格 \n”);
else
printf(“不及格 \n”);
条件语句组
Y
N 条件
Y N
语句组 2语句组 1
§ 5.2 用 if语句设计选择结构程序共 37页 第 17 页求 a 和 b 两数中较大的一个。
main( )
{ int a,b,max;
scanf("%d,%d",&a,&b);
max=a;
if ( max<b ) max=b;
printf("The max of a and b,%d\n",max);
}
max<b
max=b
Y
N
格式一
§ 5.2 用 if语句设计选择结构程序共 37页 第 18 页
main( )
{ int a,b,max;
scanf("%d,%d",&a,&b);
if ( a >b ) max=a;
else max=b;
printf("The max of a and b,%d\n",max);
}
求 a和 b两数中较大的一个。
a>b?
max=b
Y N
max=a
格式二
§ 5.2 用 if语句设计选择结构程序共 37页 第 19 页
3,多分支的 i f 结构格式 if (表达式 1)
语句 1
e l se i f ( 表达式 2 )
语句 2
e l s e i f (表达式 3)
语句 3
……
e l s e
语句 n
从键盘输入一个整数 a,按其值的大小,判断并输出 a是几位数。
表达式 1
表达式 3
表达式 2语句 1
语句 2
语句 3
语句 n
.
.
.
.
Y
Y
Y
N
N
N
§ 5.2 用 if语句设计选择结构程序共 37页 第 20 页
if语句中进行条件判断的,表达式,必须用 (
)括起来且不可省略。
#include <math.h>
main( )
{ int a;
scanf(,%d”,&a);
if (abs(a)<10) printf(,%d是一位数
.\n”,a);
else if (abs(a)<100 )
printf(“%d是二位数,\n”,a);
else if( abs(a)<1000)
printf(“%d是三位数,\n”,a);
else if(abs(a)<10000)
printf(“%d是 四 位数,\n”,a);
else printf(“%d是 五 位数,\n”,a);
}
§ 5.2 用 if语句设计选择结构程序共 37页 第 21 页二,if语句的嵌套格式,if( 表达式)
if( 表达式 1) 语句 1
else 语句 2
else if (表达式 2)语句 3
else 语句 4
在一个 if结构中,包含一个或多个 if结构判断表达式的值,若为非 0,再判断 表达式 1的值,非 0执行语句 1,否则执行语句 2。
若表达式的值为 0,再判断 表达式 2的值,
非 0执行语句 3,否则执行语句 4。
功能,
表达式语句 1 语句 2 语句 3 语句 4
表达式 2表达式 1
1
1 1
0
00
§ 5.2 用 if语句设计选择结构程序共 37页 第 22 页在 if语句的“语句 1”或“语句 2”中又包含着 if语句
main( )
{ int x,y;
printf ("Enter integer X and Y:");
scanf ("%d%d",&x,&y);
if ( x != y )
if ( x > y ) printf ("X>Y\n");
else printf ("X<Y\n");
else printf ("X==Y\n");
}
表达式
if与 else之间的匹配,else总是与同它最近的 if相匹配表达式
1
注意
§ 5.2 用 if语句设计选择结构程序共 37页 第 23 页例题当,a=1,b=3,c=5,d=4
if(a<b)
if(c<d) x =1;
else
if(a<c)
if(b<d) x=2;
else x=3;
else x=6;
else x=7;
A) 1 B) 2
C) 3 D) 6
main( ) { int a=5,b=1;
if(a++>5)
if(a++>5) b=2;
else if(a++>5) b=3;
else b=4;
printf(“%d”,b); }
A) 1 B) 2
C) 3 D) 4
else
else
l
if
if
if
§ 5.2 用 if语句设计选择结构程序共 37页 第 24 页
§ 5.3 用 if语句设计选择结构程序
1,if语句中的条件表达式必须用()括起来,并且在括号外部没有分号;
2,if或 else 子句后面的执行语句均有分号;
3,else是 if语句的子句,不可单独使用;
4,当 if或 else子句后是多个执行语句构成的语句组时(复合语句),必须用 { }括起来,否则各子句均只管到其后第一个分号处;
5,if或 else 子句后只接一单个分号时,应把之作为空语句处理。
有关 if语句使用的几点说明,
共 37页 第 25 页格式,switch(表达式 )
{ case 常量表达式 1,语句 1
case 常量表达式 2,语句 2
……..
case 常量表达式 n,语句 n
default,语句 n+1 }
先计算 表达式 的值,判断此值是否与某个常量表达式的值匹配,如果有,控制转向其后相应的语句,若无,检查 default。
功能:
多 重分支的条件语句 switch
§ 5.3 用 switch语句设计多分支结构语句 1
常量 1?
计算表达式的值语句 2
常量 2
语句 n+1
default?…
共 37页 第 26 页例题:按照考试成绩输出百分制分数段。
main( )
{ char grade;
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”);
default,printf(“Error\n”);
} }
输入字母‘ B? 输出,70---84
60--69
<60
Error
printf(“70--84\n”); break;
§ 5.3 用 switch语句设计多分支结构共 37页 第 27 页
main( ) { float x,y; char c; double r;
scanf(“%f,%f,%c”,&x,&y,&c);
switch(c)
{ case?+?,r=x+y; break;
case?-?,r=x-y ; break;
case?*?,r=x*y ; break;
case?/?,r=x/y ; break;
} printf(“%lf”,r);
}
当输入 3,5,+<回车 >之后 r的值为 8.000000
如果没有 break语句,
会顺序执行下面的
r=x-y;
r=x*y;
r=x/y;
则,最后的结果为
§ 5.3 用 switch语句设计多分支结构共 37页 第 28 页
2 case 后的每个常量表达式必须 各不相同说明,
1 括号内的表达式可以是 int,char
3 case 和 default的 位置是任意的
4 每一个 case之后应有一个 以跳出
switch( ) 结构
break(间断语句)
5 每个 case 之后的执行语句可多于一个,但 不必 加 { }
6 允许几种 case情况下执行相同的语句,不必每个都写
§ 5.3 用 switch语句设计多分支结构共 37页 第 29 页
§ 5.4 程序实例例 1,银行如何根据存入现金和年限计算利息?
银行计算利息的情况如下:
1、当存储年限 Y为 1年以上时,
月息 r为 5‰ ;
2,当存储年限 Y为 2年以上时,
月息 r为 6‰ ;
3、当存储年限 Y为 3年以上时,
月息 r为 6.5‰ ;
4、当存储年限 Y为 5年以上时,
月息 r为 8‰ ;
5、当存储年限 Y为 8以上年,
月息 r为 10‰ ;
Y==1
Y==3
Y==2r = 5‰
r = 6‰
r = 6.5‰
r =0
.
.
.
.
1
0
0
1 0
1 0
… …
t = m + m * r *12 * y
共 37页 第 30 页
main( )
{ int Y;
float m,r,t ; /* 本金,月利率,本利合计 */
printf("Input money and year =?");
scanf("%f%d",&m,&Y); /* 输入本金和年限 */
if ( Y == 1 ) r = 0.005; /* 根据年限定利率 */
else if ( Y == 2 ) r = 0.006;
else if ( Y >= 3 &&Y<5 ) r = 0.0065;
else if ( Y >=5&&Y<8) r = 0.008;
else if ( Y >8 ) r = 0.010;
else r = 0.0;
t = m + m * r *12 * y;
printf(" Total = %.2f \n",t ); }
§ 5.3 用 if语句设计选择结构程序共 37页 第 31 页例 2,输入年,月,计算该月有多少天 。输入年、月后,该年月的天数有以下几种可能:
1,当输入的 month为,大月” 时

该月的 day为 31天;
2,当输入的 month为,小月” 时

该月的 day为 30天 ;
3,当 输入的 month为,二月,时

如果该年 year为润年,则该月 day为 29天; 否则,该月
day为 28。
§ 5.4 程序实例
month
day=31 day=30
“大月”
1,3,5

“小月”
4,6,9

,2月”
2
year?1 0
day=29 day=28
共 37页 第 32 页
main( )
{ int year,month,days;
printf(“Enter year&month\n”);
scanf(“%d,%d”,&year,&month);
switch(month)
{ case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12,days=31; break;
几个 CASE
执行相同的语句跳出开关结构
/* 处理,大,月 */
§ 5.4 程序实例共 37页 第 33 页
case 4:
case 6:
case 9:
case 11,days=30 ; break;
case 2,if ((year%4==0)&&(year%100!=0)
||(year%400)==0) days=29;
else days=28; break;
default:printf(“Enter error!\n”); days=0;
break; }
if (days!=0)
printf(“%d\n”,days); }
判断是否为闰年开关结构结束
/* 处理,小,月 */
/* 处理,平,月 */
§ 5.4 程序实例共 37页 第 34 页三、开关语句(基本形式,功能,要求,break 的 作用,
和 default的作用)
二,if语句的基本形式,分支形式,多分支形式,以及嵌套形式 else与 if 的匹配四,需注意的:
1,自增,自减作为 if的条件时,边界条件的处理
2,if中的复合语句 { }
一、关系运算和逻辑运算共 37页 第 35 页补充题:
1,能正确表示“当 x的取值在 [1,10]和 [200,210]范围内的式子是 ( )
A,(x>=1)&&(x<=10)&&(x>=200)&&(x<=210)
B,(x>=1||(x<=10)&||(x>=200||x<=210)
C,(x>=1)&&(x<=10)||((x>=200)&&(x<=210))
D,(x>=1)||(x<=10)&&(x>=200)||(x<=210)
2.判断 char型变量 c1是否为小写字母的正确表达式为( )
A,?a?<=c1<=?z? B,(c1>=a)&&(c1<=z)
C,(c1>=?a?)||(c1<=?z?) D,(c1>=?a?)&&(c1<=?z?)
3.设有,int a=1,b=2,c=3,d=4,m=2,n=2; 执行( m=a>b) &&(n=c>d)
后 n的值为( )
A,0 B,1 C,2 D,3
共 37页 第 36 页
4.以下程序的输出结果是 ( )
main( ) { int a=100,x=10,y=20,ok1=5,ok2=0;
if(x<y)
if (y!=10)
if (! ok1)
a=1;
else if (ok2) a=10;
a=-1;
printf(“%d\n”,a); }
A,1 B,10 C,-1 D.值不确定
5,已知 A=7.5,B=2,C=3.6,表达式 A>B&&C >A||A<B&&!C >B
的值是 。
共 37页 第 37 页
6,以下程序的运行结果是( )
main( )
{ if (2*2= =5<2*2= =4) printf(“T\n”);
else printf(“F\n”); }
7,输入一个字符,如果是大写字母,则把其变成小写字母;如果是小写字母,则变成大写字母;其它字符不变。请在()内填入缺省的内容。
main( )
{ char ch;
scanf(“%c”,&ch);
if ( ) ch=ch+32;
else if (ch>?a?&&ch<?z?) ( );
printf(,%c\n”,ch); }