C语言桂林理工大学4第四章 选择结构程序设计Word文档格式.docx
- 文档编号:18636418
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:16
- 大小:125.13KB
C语言桂林理工大学4第四章 选择结构程序设计Word文档格式.docx
《C语言桂林理工大学4第四章 选择结构程序设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言桂林理工大学4第四章 选择结构程序设计Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
二、逻辑运算符和逻辑表达式
1.逻辑运算符
逻辑与&
&
逻辑或||
逻辑非!
2.逻辑表达式
用逻辑运算符将参与逻辑运算的操作数连接起来的式子称为逻辑表达式。
*TurboC编译系统规定,对于非0的操作数均认为是“真”,即1。
*在逻辑表达式的求解中,并不是所有的逻辑运算符都执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
如:
inta,b=20;
b=(a=b)&
b;
printf("
b=%d\n"
b);
b>
a&
(b=a);
程序运行结果为:
b=1
b=1
分析:
b=(a=b)&
b;
是赋值语句,其求解过程是:
首先圆括号之内要先操作,将b的值20赋给a,接着完成同b的逻辑与运算,并将结果
(1)赋给b。
而对于后一语句b>
,则先算b>
a(也就是1>
20),结果为0,紧接着要进行逻辑与的运算,但由于第一个操作数已经为0,所以逻辑与运算符&
之后的另一个操作数(即b=a)就不必运算了,(此时整个逻辑表达式的值已经确定为0),这样,&
运算符之后的赋值表达式b=a就不被执行了,所以b的值仍为1。
*优先级:
高
!
(非)
算术运算符
关系运算符
&
和||
赋值运算符低
4.2if语句
if语句用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
4.2.1if语句三种形式
1、if(表达式)语句
例如:
if(x>
y)printf(“%d”,x);
流程图见图4-1(a)
2、if(表达式)语句1else语句2
elseprintf(“%d”,y);
流程图见图4-1(b)
图4-1
复合语句在if语句中的使用
基本形式中的语句(如s、s1、s2等)均可采用多于一条语句的复合语句结构,这时要使用花括号{}把各语句括起来而成为复合语句。
**注意不要将==与=混淆,这种错误是编程错误,而不是语法错误,编译器不会发现),如下面两个语句都没有错误,但表示了完全不同的意义:
if(x=y)printf(“%d”,x);
if(x==y)printf(“%d”,x);
第一个语句把y的值赋给x,只要x的值不等于0,都显示x的值,第二个语句则表示,只有在x等于y时,才显示x的值。
例1:
判断奇、偶数。
main()main()
{{
inta;
inta;
printf(“inputa:
”);
printf(“inputa:
scanf(“%d”,&
a);
scanf(“%d”,&
if(a%2==0)if(a%2==0)
printf(“evennumber.\n”);
printf(“evennumber.\n”);
}else
printf(“oddnumber.\n”);
}
3、if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3
…
elseif(表达式m)语句m
else语句m+1
(实际是else子句中嵌套if语句)
执行流程见图4-2。
图4-2
if(number>
500)cost=0.15;
elseif(number>
300)cost=0.10;
100)cost=0.075;
50)cost=0.05;
elsecost=0;
说明:
(1)三种形式的if语句中的“表达式”一般为关系表达式或逻辑表达式,但不限于这两种表达式。
记住:
C语言中需要逻辑值的地方,只有0代表“假”,非0(其它)均代表“真”。
if(‘a’)printf(“%d”,’a’);
-printf(…)这条语句一定运行,因为’a’=97,即“真”。
P198例11-13倒数12行,bit=(mask&
n)?
1:
0。
mask,n都是整数,&
(位与)后也是整数。
(2)else子句不能单独使用,必须是if语句的一部分,与if配对使用。
(3)在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句构成的语句块(复合语句)。
语句块用{}括起来,语句块后面不要“;
”号。
if(a+b>
c&
b+c>
c+a>
b){s=0.5*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(area);
}
elseprintf(“itisnotatriangle”)
例:
输入两个实数,按数值由小到大的次序输出这两个数。
(难点:
交换数据算法)
main()
{
floata,b,t;
/*t-临时变量*/
scanf(a,b);
if(b<
a){t=a;
a=b;
b=t;
}/*交换a,b*/
printf(a,b);
输入三个数a,b,c,按照由小到大的顺序输出。
算法:
(伪代码-三个数的选择法排序)
ifb<
a将a,b交换(a是a,b中的小者)
ifc<
a将a,c交换(a是a,c中的小者,因此a是三者中的最小者)
b将b,c交换(在剩下的两个数b,c中选次小数,存放在b中)
输出a,b,c。
floata,b,c,t;
scanf(a,b,c);
if(c<
a=c;
c=t;
b){t=b;
b=c;
printf(a,b,c);
4.2.2if语句的嵌套
if语句的嵌套:
if语句的if块或else块中,由包含一个if语句。
一般形式:
if(…)
if(…)语句1;
else语句2;
else
if(…)语句3;
else语句4;
注意:
应当注意if与else的配对关系。
else总是与它上面的最近的未配对的if配对。
函数:
-1(x<
0)
y=0(x=0)
1(x>
编一个程序,输入x,输出y。
算法1:
输入x
yx<
0?
n
y<
=-1/
yx=0?
=0/
yx>
=1/
输出y。
intx,y;
scanf(&
x);
if(x<
0)y=-1;
if(x=0)y=0;
if(x>
0)y=1;
printf(x,y);
算法2:
yx<
=-1
y<
=0
=1
elseif(x=0)y=0;
elsey=1;
4.2.3条件运算符(?
:
)
在if语句中,在表达式为“真”和“假”时,都只执行一个赋值语句给同一个变量赋值时,可以使用简单的条件运算符来处理。
if(a>
b)max=a;
elsemax=b;
可以使用条件运算符来处理:
max=a>
b?
a:
(注:
a>
b关系运算有没有()都一样)。
它这样执行,a>
b为“真”吗?
如果为“真”,条件表达式为a,否则为b。
条件表达式的一般形式:
表达式1?
表达式2:
表达式3
执行过程:
(1)条件运算符的执行顺序:
先求解表达式1,若为非0(真)则求解表达式2,表达式2的值就是整个条件表达式的值。
若表达式1的值为0(假),则求解表达式3,此时表达式3的值就是整个条件表达式的值。
(2)条件运算符的优先级高于赋值运算符,低于关系运算符和算术运算符。
b等价于:
max=((a>
b)?
b)
(3)条件运算符的结合性“自右向左”。
c>
d?
c:
d。
先考虑优先级、再考虑结合性:
上面表达式等价与:
(a>
((c>
d)?
d)。
(4)表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式,函数表达式。
(a=100):
(b=100);
prinf(“%d”,a):
prinf(“%d”,a);
(5)表达式1,表达式2,表达式3的类型都可以不同。
条件表达式值的类型是表达式2,表达式3中类型较高的类型。
x>
y?
1.5整个表达式类型为实型。
例:
输入一个字符,如果是大写字母,转换为小写,如果不是不转换。
最后输出。
charch;
scanf(ch);
ch=(ch>
=’A’&
ch<
=’Z’)?
(ch+32):
ch;
printf(ch);
表达式ch=(ch>
ch中的()括号都可以不要。
有()括号看上去更加清楚些。
4.3开关分支语句
多分支可以使用嵌套的if语句处理,但如果分支较多,嵌套的if语句层数多,程序冗长,降低可读性。
C语言中switch语句是多分支选择语句。
其一般形式:
switch(表达式)
case常量表达式1:
语句1
case常量表达式2:
语句2
………
case常量表达式n:
语句n
[default:
语句n+1]
switch语句case中语句的终止可以使用break.
(1)switch括号后面的表达式,允许为任何类型。
(2)当“表达式”的值与某个case后面的常量表达式的值相等时,就执行此case后面的语句。
如果表达式的值与所有常量表达式都不匹配,就执行default后面的语句(如果没有default就执行跳出switch,执行switch语句后面的语句)。
(3)各个常量表达式的值必须互不相同,否则出现矛盾。
(4)各个case,default出现的顺序不影响执行结果。
(5)执行完一个case后面的语句后,流程控制转移到下一个case中的语句继续执行。
此时,“case常量表达式”只是起到语句标号的作用,并不在此处进行条件判断。
在执行一个分支后,可以使用break语句使流程跳出switch结构,即终止switch语句的执行(最后一个分支可以不用break语句)。
(6)case后面如果有多条语句,不必用{}括起来。
多个case可以共用一组执行语句。
(注意break使用的位置)
【例】已知x=100,y=15,要求输入一个算术运算符(+、-、*或/),并对x和y进行指定的算术运算。
#include"
stdio.h"
main()
{floatx=100,y=15,z;
charop;
op=getchar();
switch(op)
{case'
+'
:
z=x+y;
break;
case'
-'
z=x-y;
*'
z=x*y;
/'
z=x/y;
default:
z=0;
if((int)z!
=0)printf("
%f%c%f=%f\n"
x,op,y,z);
elseprintf("
%cisnotanoperator\n"
op);
4.4程序举例
例1求ax2+bx+c=0方程的解。
分以下几种情况讨论:
①a=0,不是二次方程。
②b2-4ac=0,有两个相等实根。
③b2-4ac>
0,有两个不等实根。
④b2-4ac<
0,有两个共轭复根。
N-S流程图见下图。
据此编写程序如下:
#include<
math.h>
{floata,b,c,d,disc,x1,x2,realpart,imagpart;
scanf("
%f,%f,%f"
,&
a,&
b,&
c);
Theequation"
);
if(fabs(a)<
=le-6)
printf("
isnotaquadratic"
{disc=b*b-4*a*c;
if(fabs(disc)<
hastwoequalroots:
%8.4\n"
,-b/(2*a));
elseif(disc>
le-6)
{x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
hasdistinctrealroots:
%8.4fand%8.4f\n"
,x1,x2);
}
{realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
hascomPlexroots∶\n"
%8.4f+%8.4fi\n"
,realpart,imagpart);
%8.4f-%8.4fi\n"
}
}
程序中用disc代表b2-4ac,先计算disc的值,以减少以后的重复计算。
对于判断b2-4ac是否等于0时,要注意一个问题:
由于disc(即b2-4ac)是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:
if(disc==0)……因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于零而导致结果错误。
所以采取的办法是判别disc的绝对值(fabs(disc))是否小于一个很小的数(例如10-6),如果小于此数,就认为disc=0。
程序中以realpart代表实部P,以imagpart代表虚部q,以增加可读性。
例2运输公司对用户计算运费。
路程(S)越远,每公里运费越低。
标准如下:
s<
250km没有折扣
250≤S<
5002%折扣
500≤S<
10005%折扣
1000≤S<
20008%折扣
2000≤S<
300010%折扣
3000≤S15%折扣
设每公里每吨货物的基本运费为P(Price的缩写),货物重为w(weight的缩写),距离为S,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为f=P*w*S*(1-d)
程序如下:
main()
{
intc,S;
floatP,w,d,f;
%f,%f,%d"
P,&
w,&
S);
if(S>
=3000)c=12;
else c=S/250;
switch(c)
case0∶d=0;
break;
case1∶d=2;
case2∶
case3∶d=5;
case4∶
case5∶
case6∶
case7∶d=8;
case8∶
case9∶
case10∶
case11∶d=10;
case12∶d=15;
f=P*w*S*(1-d/100.0);
freight=%15.4f"
,f);
请注意:
c、S是整型变量,因此c=S/250为整数。
当S≥3000时,令c=12,而不使c随S增大,这是为了在switch语句中便于处理,用一个case可以处理所有S≥3000的情况。
本章教学过程中注意问题:
1、学生编程能力的培养。
对于同一个问题的求解,鼓励学生尝试用不同的方法实现程序。
同样可以用一些趣味性的程序来提高学生的编程兴趣。
2、良好编程习惯的培养。
锯齿状的书写规范。
本章讨论问题:
1、给定一个较复杂的算法,组织同一小组的同学们以不同的程序实现,并对程序进行说明和评价。
2、讨论仅有顺序结构及选择结构是否可以解决所有的问题,给出一个带循环结构的算法让同学们进行讨论,引入下一章。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言桂林理工大学4第四章 选择结构程序设计 语言 桂林 理工大学 第四 选择 结构 程序设计