第四章 分支结构程序设计总结

【例4.1】输人三角形的三条边,判断是否能构成三角形,若能则计算并输出三角形的面
积,否则给出出错提示。
include<<stdio.h>
#include<math.h>
int main()
inta,b,c:
/定义三个整型变量/
float area;
/定义一个单精度实型变量*
double s;
/关定义一个双精度实型变量
printf(“请输入三角形的三条边长:”);
scanf("%d,%d,%d",&.a,8.b,8.c);
/¥输入三角形的三条边
s=(a+b+c)/2.0;
if(a+b<=cb+c<=aa+c<=b)
/判断能否构成三角形
printf(“不构成三角形\n");
/为输出不能构成三角形的提示,
else
area=sgr(s(s一a)%(s一b)(s一c);/x计算三角形的面积
printf(“三角形的面积是:%八n”,area);
/输出三角形的面积
}
​return0;
运行结果:
请输入三角形的三条边长:3,4,5
三角形的面积是:6.000000
说明:程序运行时,首先输入三角形的三条边,分别保存在三个整型变量a、b、c中,然后
根据三角形的构成条件,判断任意两边之和是否大于第三边。若不满足此条件,则这三条边
就不能构成一个三角形,若满足此条件就可以构成三角形,则根据相应的公式计算出三角形
的面积。
​【例4.2】编写程序,输入x的值,按以下分段函数计算并输出y的值。
1
x≠0
y=f(x)=
0x=0
#include<stdio.h>
int main()
{intx;float y;
printf(“输入x的值:”);
scanf("%d",&.x);
/×输入x的值
/
if(x!=0)
/条件判断/
y=1.0/x;
else
y=0;
printf("%d,%f",x,y);
return0;
运行结果1:
输入x的值:2
2,0.500000
​运行结果2:
输入x的值:0
0.0.000000
说明:
程序中用到了逻辑运算符“!”,含义是“非”
4.2
关系运算符、逻辑运算符、条件运算符
4.2.1
关系运算符和关系表达式
1.关系运算符
关系运算符用于判断两个操作数的大小关系。在C语言中有6个关系运算符、如表
4.1所示。
​表4.1关系运算符
运算符 含义

大于
=大于等于
<小于
<=小于等于
等于
!=不等于
​注意:
(1)关系运算符都是双目运算符,其结合方向是左结合。
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符。
(3)关系运算符中,>、<、>=、<=的优先级相同,
、!=的优先级相同,前者的优
先级高于后者,即“>=”的优先级高于“”。
2.关系表达式
用关系运算符将两个表达式连接起来的式子称为关系表达式。关系表达式的一般形
式为
表达式1关系运算符表达式2
功能:比较两个表达式的大小,返回一个逻辑值。
例如:“a+b>=c-d”、“x<=3/2”、“a+1!=c”、“一i一5*j
k+1”都是合法的关
系表达式。
关系表达式中允许出现嵌套的情况,例如:“a>(b>c)”、“a!=(cd)”等。
注意:
(1)注意区分运算符“=”和“
”。“=”是赋值运算符,“”是关系运算符。
为0。
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0
1.0”的结果为0。
​(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形
式。因为关系运算符的优先级高于赋值运算符,表达式“a>b=0”相当于“(a>b)=o”,赋值
运算符左边不是变量,会出现编译错误。
关系表达式主要用于分支结构中的条件判断。关系表达式的结果是一个逻辑值“真”或
“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”。例如关系表
达式“(a=3)>(b=8)”的值为(0。
【例4.3】关系运算示例。
#include<stdio.h>
int main()
{ char c=‘m’;
inti=10,j=20,k=30;
float x=13e+5,y=10.85;
​printf("%d,%d,",‘a’+5<c,-
i-2j>=k+1);
printf("%d,%d,",1<j<5, x-5.25<=x+y);
printf(”%d,%d\n",i+j+k==-2
j,kji+5 5);
return0;
运行结果:
1,0,1,1,0,0
​4.2.2 逻辑运算符和逻辑表达式
1.逻辑运算符
关系表达式只能描述单一的条件。对于较复杂的复合条件,例如“x小于10且x大
4”,如果用关系表达式“4<x<10”来描述,则当x=2时,由于关系运算符是左结合的.因
先计算“4<x”,其值为0;然后再计算“0<10”,其值为1;即说明当x=2时满足关系“4<x<
l0”,很显然是错误的。此时需要用到逻辑运算符将若干个关系表达式连接起来才能正确
述上述关系。
​(1)参与逻辑运算的数据可以是1和0,也可以是非零值和0,还可以是任何类型的数
据,但最终都是以非0和0来判断他们是“真”或“假”。
(2)在逻辑表达式中也可以使用赋值运算符,如“a8.8.(b=0)”,但是不能写成“=&&
=0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a8.8b=0”相当于
“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误。
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式进行运算。即在
若干个子表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了
整个逻辑表达式的值时,此后就不再计算右边剩下的子表达式的值,这种情况称为“短路”
①对于逻辑与(&.&.)运算,若“&.&.”左边的表达式的值为假,则可以得出整个表达式的
值为假,那么“&.&”右边的表达式将不再进行计算;只有当“&&”左边的表达式值为真时才
计算右边表达式的值。
②对于逻辑或()运算,若“”左边的表达式的值为真,则可以得出整个表达式的值为
真,那么“”右边的表达式将不再进行计算;只有当“”左边的表达式值为假时才计算右边
表达式的值。
【例4.4】若有定义“inta=3,b=4,c=5;”,则执行表达式“(a>b)&&(b+=c)1(c
=b)”后a、b和c的值分别是多少?
分析:根据运算符的优先级,表达式(a>b)&.&(b+三c)(e十b)相当于(a>b)
8.8.(b+=c)(c+=b),因此先计算表达式a>b,结果为假,则子表达式(a>b)&&(b+
=c)的结果为假,此时表达式“b十=c不再计算,因此b的值不发生变化、由于或运算符左
边表达式的值为假,因此还需计算表达式“e十=b”的值,其值为9、非零即为真,因此表达式
“(a>b)&.8.(b+=c)|1
(c+=b)”的值为1,最后a=3,b=4,c=9
​【例4.5】逻辑运算示例
#include<stdio.h
int main()
inta=3,b=3,c=2,d;
printf("%d,",!a&.&.!b&.&.c);
/语句1/
printf("%d,",!all!b|lc);
/*语句2/
printf("%d\n",a>=b&.&.b>c);
/语句3/
d=c–(b=6)&.&.a++;
/语句4/
printf(“a=%d,b=%d,c=%d,d=%d\n”,a,b,c,d);
return0;
运行结果:
0,1,1
a=3,b=3,c=1,d=1
(1)语句1中,逻辑表达式“!a&.&!b&&c”中包含逻辑运算符“!“和“&&”由于!的
分析:
优先级高,因此先计算“!a,值为0,则由于逻辑运算符的短路现象,后面的表达式不再计算
即可得出表达式“!a&.&!b&.&.c”的值为0。
(2)语句2中,由于“!”的优先级高于1”,先计“1,值为0则还要继装计算b、童
为0,然后计算010,结果为0,最后计算0c结果谷因此表达式a1!b1e的值为.
()语句3中,美系运算符的优先级高于逻辑运算符、因此先计算”心=b”、值为1、再计算“b>c”,值为1,最后计算18.81,值为1,因此表达式“a>=b&.&.b>c”值为1
(4)语句4中,逻辑运算符“&&.”的优先级高于“|1”,因此语句4相当于“d=c一一
(b=6)&.8.a十+);”,在计算表达式“e一一|1(b=6)&.&.a+十)”时,先计算"c一一”,值为
2,再将“c一一”的结果与表达式“(b=6)&.&.a十+”进行逻辑或运算,由于“”左边的表达
式的值为真,则可以得出整个表达式的值为真,即d=l,同时“|”右边的表达式不再进行计
算。另外表达式“c一一”计算完后c自减1,即e=1。因此语句4执行完后,a=3.b=3.c=1,d=1。算术运算符、关系运算符及逻辑运算符的优先级从高到低的顺序如表4.4所示。全部运算符的优先级和结合性见附录B。
​4.2.3
条件运算符和条件表达式
1.条件运算符
条件运算符由“?”和“:”两个符号组成,用于条件求值,它是一个三目运算符,需要三个
操作数。条件运算符的优先级低于逻辑运算符、高于赋值运算符,它是右结合的
2.条件表达式
由条件运算符将3个表达式连接起来的式子称为条件表达式,其一般形式为:
表达式1?表达式2:表达式3
条件表达式的执行顺序是:先计算表达式1的值,若值为非0,表示条件为真,则格表达
式2的值作为整个条件表达式的值,否则,将表达式3的值作为整个条件表达式的值。如
4>3?5:7的值为5
若已有声明“intx=4,y=3;”,则表达式x<y?x十+:y++的值是3.
分析:对于条件表达式“x<y?x+十:y十+”,先计算表达式“x<y”的值,结果为0.则将
表达式“y++”的值,也就是3,作为条件表达式“x<y?x++:y++”的值,面变量x的值
为4。
关于条件表达式的说明:
(1)条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表这式3的类型也可以不同,此时系统会自动进行转换,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型。例如条件表达式“a?1:2.0”的结果为double型的1.0。
(2)条件表达式中表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式,如“a>b?b=3:(c=4)”,但是不能写成“a>b?b=3:c=4”的形式。这是由于在表达式“a>b?b=3:c=4”中,条件运算符的优先级高于赋值运算符,上述表达式相当于“(a>b?b=3:c)=4”,因赋值运算符左边不是变量,所以会出现编译错误。
(3)条件表达式允许嵌套,例如“a>3?b:c>2?1:0”,根据条件表达式的结合性,它相当
于“a>3?b:(c>2?1:0)”
​双分支if一else语句的执行流程如图4.1所示。其语义是首先求解表达式,如果表达式
的值为“真”,则执行语句1;若表达式的值为“假”,则执行语句2,无论执行完语句1还是通
句2,都会结束整个if语句的执行。例4.1和例4.2均是双分支if一else语句。
​2.单分支if语句
其一般形式如下:
if(表达式)
语句;
双分支if一else语句中,若缺省了“语句2时”,则构成
了单分支if语句,执行流程如图4.2所示。其语义是首先
计算表达式,如果表达式的值为“真”,则执行语句;否则不
执行语句,直接执行if语句的下一语句。
​4.3.2
if语句的嵌套
在4.3.1节介绍了分支结构f语句的基本形式。使用f语句的基本形式解决分支少于两个的问题十分方便,而经常遇到的是多于两个分支,或者需要在多个不同条件下行不同语句的问题,这就需要掌握f语句的嵌套以及多分支结构。一个if语句中又包含一个或多个if语句的现象称为if语句的嵌套。
if语句的基本形式:
if(表达式)
语句1:
else
语句2;
其中“语句1”或“语句2”都可以嵌套另一个if语句,在缺省else部分的语句中的“通
句”也可以嵌套另一个f语句。因此,具体嵌套形式可以有很多种。如
if(表达式1)
if(表达式2)
​其执行流程如图4.3所示。注意上述f语句书写时采用了缩进格式,尽管不采用进格式编译系统不会报错,但采用缩进格式输入代码,使程序的结构更清晰、易读。
4.3.3 多分支if语句
多分支if语句是最常用的实现多路分支的方法,其一般形式如下:
if(表达式1)
语句1:
else if(表达式2)
语句2:
else if(表达式n一1)
语句n一1;
else
语句n;
执行流程如图4.5所示。首先求解表达式1,如果表达式1的值为“真”,则执行语句1,
并结束整个f语句的执行;否则,求解表达式2,…,若表达式1至表达式口一1的值都为“假”
时,执行语句n.
4.4 使用switch语句实现分支结构
在C语言中还提供了一种switch语句也可以实现多分支的选择。
switch语句的一般形式如下:
switch(表达式)
case常量表达式1:语句1;break;
case常量表达式2:语句2;break:
case常量表达式n:语句n;break;
default:语句n+1;break;

switch语句多分支结构执行流程如图4.6所示。其执行过程为:首先计算switch后面括号内的表达式,然后将表达式的值从上到下按顺序与各个case后面的常量表达式的值适行比较,若与某个常量表达式的值相等,则执行该常量表达式后面的语句,然后执行break语句,跳出switch语句,switch语句执行结束;如果表达式的值与任何一个常量表达式的值都不相等,则执行default后的语句,结束switch语句的执行。
4.5 分支结构程序设计示例
【例4.19】编写程序,输入x,计算并输出下列分段函数f(x)的值(保留2位小数),要求调用sgrtO函数求平方根,调用pow()函数求幂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值