1
第五章 选择结构程序设计主讲 福州大学数学与计算机学院 韩晓芸
E-mail,hxy@fjtv.net
第五章 选择结构程序设计
2
第五章 选择结构程序设计第一节 引例第二节 关系运算符和关系表达式第三节 逻辑运算符和逻辑表达式第四节 条件运算符和条件表达式第五节 if语句第六节 switch语句第五章 选择结构程序设计
3
第一节 引例
例 1
从键盘输入两个实数,
按照从大到小的顺序输出。
main( )
{float a,b;
scanf("%f,%f",&a,&b);
if (a>=b)
printf("%f%f\n",a,b);
else
printf("%f%f\n",b,a);
}
第五章 选择结构程序设计
4
关系运算符
< <= > >=
== !=
高低第二节 关系运算符和关系表达式优先级第五章 选择结构程序设计
5
关系表达式
– 用关系运算符将两个表达式 (可以是 算术 表达式,关系 表达式,逻辑 表达式或 赋值 表达式 )连接起来的式子,称为关系表达式。
– 例如,下面都是 合法 的关系表达式
a>b,a+b>b+c,(a=3)>(b=5),
a?<?b?,(a>b)>(b<c)
第五章 选择结构程序设计
6
关系表达式
– 关系表达式的值为逻辑值“真”或“假”,以 1代表
“真”,以 0代表“假”。
结合性例,a=3,b=2,c=1,则:
表达式,(a> b)==c”的值为“真”,表达式的值为 1。
表达式,b+ c< a”的值为“假”,表达式的值为 0。
请思考以下赋值表达式的值:
d=a>b; f=a>b>c
从左向右第五章 选择结构程序设计
7
再举例分析:
关系表达式,8==4”的值为“假”,表达式的值为 0。
关系表达式,5>0”的值为“真”,表达式的值为 1。
若 a=5,b=3,c=1,则
a>b>c的计算过程是:
先计算 a>b,结果为真,值为 1
再计算 1>c,结果为假,值为 0
f=b>c!=a的计算过程是:
先计算 b>c,结果为 1
再计算 1! =a结果为 1
最后将 1赋值给 f
第五章 选择结构程序设计
8
逻辑运算符
! (逻辑非 )
&& (逻辑与 )
|| (逻辑或 )
1) && 和 || 是双元运算符它要求有两个关系表达式做为操作数,
如,(a> b)||(x> y) 就是一个逻辑表达式。
2) ! 是一元运算符只要求有一个关系表达式做为操作数,
如,! (a> b) 就是一个逻辑表达式。
第三节 逻辑运算符和逻辑表达式第五章 选择结构程序设计
9
逻辑运算的真值表如下:
a b ! a ! b a&&b a||b
真 真 假 假 真 真真 假 假 真 假 真假 真 真 假 假 真假 假 真 真 假 假第三节 逻辑运算符和逻辑表达式第五章 选择结构程序设计
10
赋值运算符
||
&&
运算符的优先级关系运算符算术运算符高低
!(非)
第五章 选择结构程序设计
11
举例说明:
c>a+b 等效于 c>(a+b)
a>b==c 等效于 (a>b)==c
a==b<c 等效于 a==(b<c)
a=b>c 等效于 a=(b>c)
a>b&&x>y 等效于 (a>b)&&(x>y)
a==b||x==y 等效于 (a==b)||(x==y)
!a||a>b 等效于 (!a)||(a>b)
请思考,5>3&&2||8<4-!0 的值。
第五章 选择结构程序设计
12
逻辑表达式
– C语言编译系统在给出逻辑结果时,以数值 1
代表,真,,以 0代表,假,; 但在判断一个量是否为,真,时,以非 0代表,真,,以 0代表,假,。
– 例如:
若 x=10,则 !x 的值为 0。
若 a=3,b=2,则 a&&b 的值为 1。
5&&0||8 的值为 1。
结合性 从左向右第五章 选择结构程序设计
13
逻辑运算符特点求解逻辑表达式时,并不是所有的运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行下一个运算符。
– 例如,a=5,b=3,c=2,d=1,x=1,y=1 则表达式
(x=a<b)&&(y=c<d) 首先计算,a<b”,结果为 0,则 x=0,即可判断整个表达式的值为 0。
因此,,y=c<d”将不被执行,所以 y的值仍为 1而不是 0。
第五章 选择结构程序设计
14
思考题
1、已知整型变量 a=5,b=6,c=7,则 a<=b、
(a<b)&&(b>c),!(a>c)的值各是:
A、真、假、真 B、真、假、假
C、真、真、真 D、假、假、真
2、有以下程序
main( )
{ int a=1,b=2,m=0,n=0,k;
k=(n=b>a)||(m=a<b);
printf("%d,%d\n",k,m);
}
程序运行后的输出结果是?
第五章 选择结构程序设计
15
练习题书写满足下列要求的表达式:
1,x能够被 3和 7同时整除。
2,ch是一个小写字母。
3,num是一个三位自然数。
4,i不小于 100。
5,m是一个偶数。
第五章 选择结构程序设计
16
条件 运算符?,
条件表达式的形式为:
表达式 1? 表达式 2:表达式 3
– 先计算表达式 1,若其值为非零,则结果为表达式 2的值,否则就是表达式 3的值 。
结合性,从右到左第四节 条件运算符和条件表达式第五章 选择结构程序设计
17
例如:
设 a=2,b=3,c=4,则:
(1) m=a>b?a:b 的值为,
(2) m=a>b?a:b>c?b:c
先计算 b>c?b:c,结果为 4
再计算 m=a>b?a:4,结果为 4
则 m的值为 4,整个表达式的值也为 4。
3
第五章 选择结构程序设计
18
第五节 if语句
if形式:
– if (表达式 ) 语句 ;
– 例如,if(x>y)
printf(“%d”,x);
例如:
输入一个数 m,如果是偶数,输出,YES”。
1,if语句的三种形式:
第五章 选择结构程序设计
19
第五节 if语句
if-else形式:
– if (表达式 ) 语句 1;
– else 语句 2;
– 例如:
– if(x>y) printf(“%d”,x);
– else printf(“%d”,y);
例如,请输入一个自然数 n,
判断其奇偶性,并输出结果。
1,if语句的三种形式:
第五章 选择结构程序设计
20
第五节 if语句
1,if语句的三种形式:
else-if形式
if (表达式 1) 语句 1;
else if (表达式 2) 语句 2;
……
else 语句 n;
例如:
if(num>500) cost=0.15;
else if(num>300) cost=0.10;
else if(num>100) cost=0.075 ;
else if(num>50) cost=0.05;
else cost=0;
第五章 选择结构程序设计
21
第五节 if语句
if语句中的书写问题:
(1)if 语句中在 if后面都有“表达式”,一般为 逻辑表达式或关系表达式 。 在执行 if 语句时先对表达式求解,若表达式的 值为 0,按“假”处理,为非 0,

“真”处理 。
实际上,表达式的值 可以是任意的数值类型
(包括整型、实型、字符型等)。
下面的例子也是合法的:
if(3) printf(“O.K,”);
if(?a?) printf(“%d”,?a?);
第五章 选择结构程序设计
22
第五节 if语句
if语句中的书写问题:
(2)在每一个 else前面要有一个分号(;),整个语句结束处也要有一个分号(;) 。
(3)在 if和 else 后面 只能含有一个内嵌的操作语句,
如果 有多个语句,要用花括号,{}”将几个语句括起来 成为一个 复合 语句。
第五章 选择结构程序设计
23
例 2 输入两个实数,由小到大输出。
main( )
{float a,b,t;
scanf("%f,%f",&a,&b);
if (a>b)
{t=a; a=b; b=t;}
printf("%5.2f,%5.2f\n",a,b);}
第五章 选择结构程序设计
24
a<
bt=a;
a=b;
b=t;
a<
bt=a;
a=b;
b=t;
使用复合语句 不使用复合语句
N N YY
第五章 选择结构程序设计
25
例 3 输入三个实数,按由小到大顺序输出。
main( )
{float a,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if (a>b) {t=a; a=b; b=t;}
if (a>c) {t=a; a=c; c=t;}
if (b>c) {t=b; b=c; c=t;}
printf("%5.2f,%5.2f,%5.2f\n",a,b,c);
}
第五章 选择结构程序设计
26
例 4
对求三角形面积的程序进行改进,
要求判断输入的三边能否构成三角形。如果能构成三角形则计算面积,否则给出相应信息。
#include "math.h"
main( )
{float a,b,c,s,area;
scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c&&b+c>a&&a+c>b)
{s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%7.2f\n",area);}
else printf(“input data error”);
}
第五章 选择结构程序设计
27
2、嵌套的 if语句
– 在一个 if语句中又包含了另一个 if语句,称为 if语句的嵌套 。
一般形式为:
if ( ) if ( ) 语句 1;
else 语句 2;
else if ( ) 语句 3;
else 语句 4;
一般形式为:
if ( )
{if ( ) 语句 1;}
else if ( ) 语句 2;
else 语句 3;
第五章 选择结构程序设计
28
2、嵌套的 if语句
C语言规定,else总是和它上面离它最近的 if
配对。 因此,最好使内嵌的 if语句也包含 else部分,
如果遇到 if和 else的数目不匹配,可以通过加花括弧来确定配对关系。 例如:
if ( )
{if ( ) 语句 1;}
else 语句 2;
第五章 选择结构程序设计
29
例 5,例 6 编写程序,输入一个 x值,输出对应的 y值。函数为:
-1 (x<0)
y= 0 (x=0)
1 (x>0)
在 if子句中嵌套 在 else子句中嵌套
if (x<=0)
if (x<0) y=-1;
else y=0;
else y=1;
if (x<0) y=-1;
else
if (x==0) y=0;
else y=1;
第五章 选择结构程序设计
30
例 7,编写程序,输入一个字符,判别它是否是大写字母,如果是,将它转换成小写字母;如果不是,
不转换。 然后输出最后得到的字符。
#include,stdio.h"
main( )
{char ch;
scanf(“%c”,&ch);
ch=(ch>=?A?&&ch<=?Z?)?(ch+32):ch;
printf(“%c”,ch);}
其中,32是小写字母和大写字母 ASCII码的差值。
第五章 选择结构程序设计
31
例 8,给一个成绩,要求输出成绩等级。 90分及以上为
‘ A?,80-89分为’ B?,70-79分为’ C?,60-69分为’ D?,
60分以下为’ E?。
S>=90
打印
‘ A’
S>=80
打印
‘ B’
S>=70
打印
‘ C’
S>=60
打印
‘ D’
打印
‘ E’
T F
F
F
F
T
T
T
第五章 选择结构程序设计
32
例 8 源程序编写如下:
#include,stdio.h"
main()
{int s;
scanf(“%d”,&s);
if(s>=90) printf(“A”);
else if(s>=80) printf(“B”);
else if(s>=70) printf(“C”);
else if(s>=60) printf(“D”);
else printf(“E”);}
第五章 选择结构程序设计
33
第六节 switch语句
switch语句的基本格式:
switch (表达式 )
{ case 常量表达式 1:
语句 1; [break;]
case 常量表达式 2:
语句 2; [break;]
……
case 常量表达式 n:
语句 n; [break;]
default:语句 n+1;
}
第五章 选择结构程序设计
34
注意:
– 当 表达式的值与某一个 case后面的常量表达式的值相等 时,就执行该 case后面的语句,都不相等 时,就执行 default后语句。
– 每个 case的常量表达式的值必须互不相同 。
– 用 break语句可以跳出 switch结构 。
– 多个 case语句可以共用一组执行语句 。如:
……
case?A?:
case?B?:
case?C?,printf(“>60\n”); break;
……
第五章 选择结构程序设计
35
将 例 8用 switch 结构语句改写如下:
main()
{int s; scanf(“%d”,&s);
switch(s/10)
{case 10,
case 9,printf(“A”); break;
case 8,printf(“B”); break;
case 7,printf(“C”); break;
case 6,printf(“D”); break;
default,printf(“E”);} }
第五章 选择结构程序设计
36
例 9,输入两个运算量和一个运算符,完成加、
减、乘、除运算,输出运算结果。
#include"stdio.h"
main( )
{int x,y; float z; char ch;
printf("Enter an operator(+,-,*,/):\n");
ch=getchar();
printf("Enter two numbers:");
scanf("%d,%d",&x,&y);
第五章 选择结构程序设计
37
switch(ch)
{
case '+',z=x+y; printf("x+y=%d",z); break;
case '-',z=x-y; printf("x-y=%d",z); break;
case '*',z=x*y; printf("x*y=%d",z); break;
case '/',if (y==0)
printf("division by zero\n");
else
{z=1.0*x/y;
printf("x/y=%f",z);break;}
default,printf("The error operator");
}
}
第五章 选择结构程序设计
38
例 10 用公式 f=p*w*s*(1-d)
计算运输费。
吨公里运价运输距离折扣货重
s< 250(公里 ) d=0
250≤ s< 500 d=0.02
500≤ s< 1000 d=0.05
1000≤ s< 2000 d=0.08
2000≤ s< 3000 d=0.10
3000≤ s d=0.15
第五章 选择结构程序设计
39
用不带 else的 if语句,else-if语句完成上述例题,并做对比。

要 根据运输距离 计算折扣 d,关键是要构造 switch后的表达式,根据题目,选择 c=s/250 来求 c的值。
if (s>=3000) c=12;
else c=s/250;
程序中当 c的值为 2,3时,
d的值都是 0.05,则这两个 case语句可以共同使用一个语句。
分析说明第五章 选择结构程序设计
40
#include“stdio.h”
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,
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 (“fright=%15.4f\n”,f );
}
例 10 源程序编写如下:
第五章 选择结构程序设计
41
#include“stdio.h”
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);
printf(“a leap year.\n”);
}
例 11A 编写程序,判断某一年是否是闰年:
第五章 选择结构程序设计
42
#include“stdio.h”
void main()
{ int year,leap ;
scanf(“%d”,&year);
if( year%4!=0)
leap=0 ;
else if( year%100!=0)
leap=1;
else if( year%400!=0)
leap=0;
else leap=1;
If(leap)
printf(“%d is”,year) ;
else
printf(“%d is not”,year);
printf(“a leap year.\n”);
}
例 11B 编写程序,判断某一年是否是闰年:
第五章 选择结构程序设计
43
例 11C 编写程序,判断某一年是否是闰年:
void main()
{ int year,leap ;
scanf(“%d”,&year);
if((year%4==0&&year%100!=0)||(year%400==0))
leap=1;
else
leap=0;
if(leap)
printf(“%d is”,year) ;
else
printf(“%d is not”,year);
printf(“a leap year.\n”);}
第五章 选择结构程序设计
44
例 12
求 ax2+ bx+ c=0方程的解。
应该考虑以下几种情况:
① a=0,不是二次方程。
② b2-4ac=0,有两个相等实根。
③ b2-4ac> 0,有两个不等实根。
④ b2-4ac< 0,有两个共轭复根。
第五章 选择结构程序设计
45
例 12 源程序编写如下:
#include“stdio.h”
#include“math.h”
void main()
{ float a,b,c,disc,x1,x2,p,q ;
scanf(“%f,%f,%f”,&a,%b,%c);
printf(“The equition”);
if(fabs(a)<=1e-6)
printf(“is not a quadratic”);
else
disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf(“has two equal
roots:%8.4f\n”,-b/(2*a));
else if(disc>1e-6)
{x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf(“has distinct real
roots:%8.4f and 8.4f\n”,x1,x2);
}
else
{ p=-b/(2*a);
q=sqrt(-disc)/(2*a);
printf(“has complex roots:\n”);
printf(“%8.4f+%8.4fi\n”,p,q);
printf(“%8.4f-%8.4fi\n”,p,q);
}
}
第五章 选择结构程序设计
46
作业
1,输入一个三位自然数 n,计算该数各数位的数字之和。 如,320的数位之和= 3+2+0= 5
2,输入一个三位自然数,判断是否为水仙花数?
注,一个 3位数,各个数位的数字的立方和等于该数本身,即称为水仙花数。 如,153= 13+53+33
测试数据,135,153
3,输入一个三位自然数 n,输出该数的逆序数。
如,541的逆序数为 145。
4,输入一个字母,进行大小写转换,输出转换后的字母。
第五章 选择结构程序设计
47
休息一会儿。。。