c语言程序设计第五章程序控制流程选择结构

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第1页第五章程序控制流程——选择结构5.1关系运算符和逻辑运算符一、关系运算符和关系表达式1.关系运算符(1)关系运算符的分类C语言为用户提供了6个关系运算符:(小于)、=(小于等于)、(大于)、=(大于等于)、==(关系相等)和!=(关系不等)。(2)关系运算符的优先级关系运算符内部优先级是、=、、=的优先级相等,且优先级高于==和!=。在C语言所有运算符中,关系运算符的优先级要低于算术运算符和位移运算符。(3)关系运算符的结合性所有的关系运算符的结合性都是从左至右。2.关系表达式的基本形式有值表达式1op有值表达式2,其中op代表6个关系运算符。关系表达式的结果要么为0(操作数不满足关系运算),要么为1(操作数满足关系运算)。假设有以下变量定义:inta=1,b=-3,c=2,i=13;以下都是合法的关系表达式:ab、i=10、a+bb+c、(a=c)(b=5)、a==5、a+b==2009、a!=b+2、b*b=4*a*c等。3.关系运算符的使用(1)带有关系运算符的复杂表达式计算【例5.1】当a=3,b=2,c=1时,表达式f=abc的值是。【例5.2】下面关系表达式中结果为假的是。A)0!=1B)2=8C)(a=2*2)==2D)y=(2+2)==4说明:在C语言中用一切非0数(往往是1)表示逻辑真,0表示逻辑假。【课内思考题5.1】当a=5,b=4,c=2时,表达式ab!=c的值是。(2)关系运算中的隐式类型转换【例5.3】分析下面程序的输出结果,并说明原因。#includestdio.h第2页main(){inti=-10;unsignedintj=1;printf(ij:%d\n,ij);}(3)怎样比较两个浮点数是否相等有些浮点数在计算机内部是无法精确表示的,这主要是由于浮点数在计算机内部特殊的存储格式引起的,例如:#includestdio.hmain(){doublea=123456789.9*9,b=1111111109.1;doublec=0.1+0.2;printf(c==0.3%d\n,c==0.3);printf(a==b%d\n,a==b);}【例5.4】比较两个浮点数是否相等的正确方法#includestdio.h#includemath.h#defineYUZHI1e-6main(){doublea=123456789.9*9,b=1111111109.1;doublec=0.1+0.2;printf(a=%.9f,b=%.9f\n,a,b);printf(a==b%d\n,a==b);printf(a==b%d\n,fabs(a-b)=YUZHI);printf(c==0.3%d\n,c==0.3);printf(c==0.3%d\n,fabs(c-0.3)=YUZHI);}第3页说明:应该避免直接比较两个浮点数是否相等,而是通过看两个浮点数差的绝对值是否小于某个很小的数来达到判断两个浮点数是否相等。二、逻辑运算符和逻辑表达式1.逻辑运算符(1)逻辑运算符的分类C语言为用户提供了3个逻辑运算符:!(逻辑非)、&&(逻辑与)和||(逻辑或)。(2)逻辑运算符的优先级其中!(逻辑非)是单目运算符,在C语言所有运算符中优先级排第二(所有的单目运算符优先级都是第二)。&&(逻辑与)的优先级高于||(逻辑或),||的优先级高于?:(条件运算符)。(3)逻辑运算符的结合性其中!(逻辑非)的结合性是从右至左(所有的单目运算符的结合性都是从右至左),&&和||的结合性是从左至右。2.逻辑表达式的基本形式!有值表达式1,有值表达式1&&有值表达式2,有值表达式1||有值表达式2。逻辑表达式的结果见下表:说明:实际编程时,总是用逻辑运算符去连接关系表达式。3.逻辑运算符的使用(1)带有逻辑运算符的复杂表达式计算【例5.5】以下程序的运行结果是。#includestdio.hmain(){有值表达式1有值表达式2!有值表达式1有值表达式1&&有值表达式2有值表达式1||有值表达式2非0非0011非000010非010100100第4页inta,b,d=241;a=d/100%9;b=(-1)&&(-1);printf(%d,%d,a,b);}A)6,1B)2,1C)6,0D)2,0【课内思考题5.2】若a=2,b=4,则表达式!(x=a)||(y=b)&&0的值是。【课内思考题5.3】inta=3,b=4,c=5;,则以下表达式!(a+b)+c-1&&b+c/2的值为。(2)短路计算对于逻辑表达式“表达式1&&表达式2&&…&&表达式n”而言,若在计算过程中发现表达式m的值为0,根据&&的特点,整个逻辑表达式的结果肯定为0,为提高计算效率,编译器不会计算从表达式m+1开始的后序表达式了,称为短路计算。同样对于“表达式1||表达式2||…||表达式n”而言,只要发现某个表达式的值为1,肯定计算结果的同时也没有必要计算后面这些表达式的值。短路计算在编程中有重要用途,能够为其他运算提供卫士:(number!=0)&&(1/number0.5),由于在做除法时,除数不能为0,所以在计算1/number是否大于0.5之前,先判断变量number的值是不是0。【例5.6】设有说明语句:inta=1,b=2,c=3,d=4,m=2,n=2;,则执行(m=ab)&&(n=cd)后n的值为。【例5.7】执行以下语句后a的值为,b的值为。inta=5,b=6,w=1,x=2,y=3,z=4;(a=wx)&&(b=yz);四、用关系或逻辑表达式表示条件要按照语义并使用关系或逻辑表达式去描述条件,且当条件成立时,表达式值为1;当条件不成立时,表达式值为0。【例5.8】设y为int变量,请写出描述“y是奇数”的表达式。分析:首先,用来描述条件的表达式中必然包含变量y。其次,这个带有变量y的表达式的值只有两种结果:假如y的值是奇数的话,该表达式的计算结果为1;假如y是偶数的话,该表达式的计算结果为0。最后,按照语义来构造表达式——奇数的特点是被2除余1(也可第5页认为不能被2整除),不难得到:(y%2)==1(由%的优先级高于!=,所以也可写成y%2==1)。请思考还有没有别的写法?【课内思考题5.4】假设x是一个int变量,怎样用表达式表示条件“x被3整除,同时被5除余3”?【课内思考题5.5】假设x是一个double变量,怎样描述条件”2x3”(也即写一个表达式能判断x∈(2,3)中,如果x∈(2,3),表达式值为1;如果x不在(2,3),则表达式值为0)?【例5.9】若x、y、z均为int变量,则描述“x或y中有一个小于z”的表达式是。【例5.10】判别某年year是否闰年。闰年的条件是符合下面二者之一:能被4整除,但不能被100整除;能被400整除。可以用一个逻辑表达式来表示:((year%4==0)&&(year%100!=0))||(year%400==0),如果熟悉运算符的优先级,则表达式进一步简化为year%4==0&&year%100!=0||year%400==0。【课内思考题5.6】判断char型变量ch是否为大写字母的正确表达式是。A)'A'=ch='Z'B)(ch='A')&(ch='Z')C)(ch='A')&&(ch='Z')D)(ch='A')AND(ch='Z')第6页5.2用if语句和if-else语句实现选择控制流程一、if语句1.基本语法格式if(表达式)语句说明:(1)if语句的执行过程是先计算表达式的值,如果非0就执行包含在if中的语句;如果为0就不执行该语句。如下图所示:(2)if语句中的表达式可以是任意的有值表达式,实际编程时往往使用关系表达式或将多个关系表达式用逻辑运算符连接起来的逻辑表达式。(3)if中的语句可以是除了声明语句以外的其他语句,例如各种流程控制语句(if、if-else、switch、while、do-while和for)、流程转移语句(break、continue、return和goto)、表达式语句(包括函数调用语句)、空语句和复合语句。2.应用示例【例5.11】分析以下程序的执行结果。#includestdio.hmain(){inti=-1;if(i=0)printf(%d\n,i++);printf(%d,--i);非00表达式语句if语句下面这条语句第7页}【例5.13】从键盘输入三个整数,计算其中的最大者并将其输出。#includestdio.hmain(){inta,b,c;intmax;scanf(%d,%d,%d,&a,&b,&c);max=a;/*先假定变量a的值最大*/if(maxb)max=b;/*比较变量max值和变量b值的大小,如果b大,就将b赋给max*/if(maxc)max=c;/*比较变量max值和变量c值的大小,如果c大,就将c赋给max*/printf(themaxnumberin%d,%d,%d,is%d\n,a,b,c,max);}二、if-else语句1.基本语法格式if(表达式)语句1else语句2说明:(1)if-else语句是由if子句和else子句组成的。具体执行过程是先计算表达式的值,如果非0就执行语句1;如果为0就执行语句2。如下图所示:非00表达式语句1语句2下一条语句第8页(2)表达式和语句的说明同if语句。2.应用示例【例5.13】分析以下程序的执行结果。#includestdio.hmain(){inta10,b=50,c=30;if(a=b+c)printf(*******\n);elseprintf($$$$$$$\n);}【例5.14】输入两个实数,按代数值由小到大的次序输出这两个数。#includestdio.hmain(){doublea,b,t;scanf(%lf,%lf,&a,&b);if(ab){t=a;a=b;b=t;}printf(%lf,%lf,a,b);}【课内思考题5.7】如果将上面的if的复合语句的花括号去掉,根据输入值,结果如何?本例也可改用if-else语句实现:#includestdio.hmain(){doublea,b;第9页scanf(%lf,%lf,&a,&b);if(ab)printf(%lf,%lf,a,b);elseprintf(%lf,%lf,b,a);}【例5.15】以下不正确的if语句形式是。A)if(xy&&x!=y);B)if(x==y)x+=y;C)if(x!=y)scanf(%d,&x);elsescanf(%d,&y);D)if(xy){x++;y++;}分析:选项A中的if后面是一个空语句(仅仅由;构成的语句)。空语句语法主要用在以下场合:程序的某些地方不需要执行任何操作,但是由于语法的定义,这些地方必须要有语句,在这种情况下就不得不使用空语句。三、嵌套的if-else语句1.if子句后面嵌套if语句或者if-else语句有四种基本形式:(1)if(表达式1)if(表达式2)语句(2)if(表达式1)if(表达式2)语句1else语句2(3)if(表达式1)if(表达式2)语句1else语句2(4)if(表达式1)if(表达式2)语句1else语句2else语句3上面只给出一次嵌套的四种情况(其实是三种,(2)和(3)是等价的),事实上if语句和if-else语句可以连续嵌套。从(2)和(3)中不难发现,当if子句后面嵌套if语句或者if-else语句时,就会产生第10页else子句究竟和哪个if子句配对的问题。为了解决表达上的歧义,C语言语法规定:在嵌套的if语句或者if-else语句中,else子句总是与之前离它最近的if子句配对。根据这条规则,那么(2)和(3)的语句结构就是相同了。【例5.16】以下程序的输出是。#includestdio.hmain(){intx=2,y=-1,z=2;

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功