C语言大学使用教材(第2版)第5章讲稿.ppt

上传人:牧羊曲112 文档编号:5426291 上传时间:2023-07-05 格式:PPT 页数:45 大小:319.49KB
返回 下载 相关 举报
C语言大学使用教材(第2版)第5章讲稿.ppt_第1页
第1页 / 共45页
C语言大学使用教材(第2版)第5章讲稿.ppt_第2页
第2页 / 共45页
C语言大学使用教材(第2版)第5章讲稿.ppt_第3页
第3页 / 共45页
C语言大学使用教材(第2版)第5章讲稿.ppt_第4页
第4页 / 共45页
C语言大学使用教材(第2版)第5章讲稿.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《C语言大学使用教材(第2版)第5章讲稿.ppt》由会员分享,可在线阅读,更多相关《C语言大学使用教材(第2版)第5章讲稿.ppt(45页珍藏版)》请在三一办公上搜索。

1、第5章 逻辑运算和分支程序结构,本章介绍条件的表示和程序的分支结构。5.1 关系运算和关系表达式5.2 逻辑运算和逻辑表达式5.3 if 语句5.4 switch语句5.5 分支程序设计示例,任何一个解决实际问题的计算机程序,顺序执行的顺序结构往往是很不够的,实际问题中,更多的是:根据特定条件的不同方面,有选择性地进行不同情况的处理;在一定的条件下,有些处理需要反复多次地执行;实现上述两种情况的程序结构分别是分支结构和循环结构,本章讨论程序的分支结构及其相应的控制语句。要设计选择结构程序,要考虑两个方面的问题:条件的表示:一般用关系表达式或逻辑表达式。选择结构的控制语句:if语句或switch

2、语句。,5.1 关系运算符和关系表达式,“关系运算”实际上就是“比较运算”,是逻辑运算中比较简单的一种,即将两个数据进行比较,判定两个数据是否符合给定的关系(条件)。比较运算的对象可以是两个类型相同的数值、字符、地址。例如,“a b”中的“”表示一个大于关系运算。如果a的值是5,b的值是3,则大于关系运算“”的结果为“真”,即条件成立;如果a的值是2,b的值是3,则大于关系运算“”的结果为“假”,即条件不成立。,1 关系运算符 C语言提供6种关系运算符:(大于),=(大于或等于),=(等于),!=或(不等于)注意:在语言中,“等于”关系运算符是双等号“=”,而不是单等号“=”(赋值运算符)。2

3、 优先级 在关系运算符中,前4个优先级相同,后2个也相同,且前4个高于后2个。,5.1.1 关系运算符及其优先级,与其它种类运算符的优先级关系 关系运算符的优先级低于算术运算符、逻辑移位运算符和逻辑非;关系运算符的优先级高于逻辑运算符和按位运算符;关系运算符的优先级高于赋值运算符;总结起来,C语言中各种主要的运算符的优先级如图5-1所示。,1 关系表达式的概念 关系表达式是指用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来,进行关系运算的式子。例如,下面的关系表达式都是合法的:ab,a+bc-d,(a=3)=b,(ab)=(bc)2 关系表达式的值

4、 关系表达式的结果是逻辑值(非“真”即“假”)。,5.1.2 关系表达式,由于C语言没有逻辑型数据,所以用整数“”表示“逻辑真”,用整数“”表示“逻辑假”。例:假设num1=3,num2=4,num3=5,则:num1num2的值=0。(num1num2)!=num3的值=1。num1num2num3的值=1。思考题:任意改变num1或num2的值,会影响整个表达式的值吗?为什么?(num1num2)+num3的值=6,因为num1num2的值=1,1+5=6。注意:C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。故关系表达式的值,还可以参与其它种类的,关系表达式只能描述单一条件

5、,例如“x=0”。如果需要描述“x=0”、同时“x10”,就要借助于逻辑表达式了。逻辑运算是指在逻辑量或逻辑量之间进行的运算。,5.2 逻辑运算符和逻辑表达式,运算,例如算术运算、逻辑运算等。在实际应用中,任何大于0的整数也代表“逻辑真”。,1 逻辑运算符 C语言提供三种逻辑运算符:&逻辑与(相当于“同时”)|逻辑或(相当于“或者”)!逻辑非(相当于“否定”)例:(x=0)&(x5),!(x=0),(year%4=0)&(year%100!=0)|(year%400=0)2 运算规则&:当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。,5.2.1 逻辑运算符及其运算规则,|

6、:当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。!:当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。各种逻辑运算及其真值表如表5-1所示。例:假定x=5,则(x=0)&(x5)的值为“假”。,表5-1 逻辑运算及其真值表,1 逻辑表达式的概念 逻辑表达式是指用逻辑运算符将1个或多个表达式连接起来,进行逻辑运算的式子。在C语言中,用逻辑表达式表示多个条件的组合。例:判断一个年份是否是闰年。判断某年year为闰年,闰年的条件是以下二者之一:能被4整除但不能被100整除;能被4整除又能被100整除;可以用一个的逻辑表达式表示:(year%4=

7、0)&(year%100!=0)|(year%400=0),5.2.2 逻辑表达式,逻辑表达式的值也是一个逻辑值(非“真”即“假”)。2 逻辑量的真假判定 C语言用整数“”表示“逻辑真”、用“”表示“逻辑假”。但在判断一个数据的“真”或“假”时,却以和非为根据:如果为,则判定为“逻辑假”;如果为非,则判定为“逻辑真”。例:假设num=12,则:!num的值为,num=1 num31的值为1。3 说明 逻辑运算符两侧的操作数,除可以是和非的整数外,也可以是其它任何类型的数据,如实型、字符型等。,在计算逻辑表达式时,只有在必须执行下一个表达式才能求解时,才求解该表达式(即并不是所有的表达式都被求解

8、)。换句话说:对于逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。对于逻辑或运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。例:假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式“(x=n1n2)&(y=n3n4)”后,x的值变为,而y的值不变,仍等于1!,例1:输入任意三个整数num1、num2、num3,求三个数中的最大值。main()int num1,num2,num3,max;printf(Please input three numbers:);scanf(%d,%d,%d,5.3 if 语句,程序运行情况如

9、下:Please input three numbers:11,22,18The three numbers are:11,22,18max=22 本例中的第1个if语句,可优化为如下不带else子句的形式:max=num1;if(num2max)max=num2;这种优化形式的基本思想是:首先取一个数预置为max(最大值),然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max中的数就是最大值。这种方法,对从3个或3个以上的数中找最大值的处理,非常有效。,简单分支指的是某一程序段的执行取决于条件是否成立(为“真”)。1 语句格式if()

10、;2 语句的作用 当为“真”时,执行;否则,跳过,什么也不执行。,5.3.1 简单分支,if语句是用来控制程序分支结构的一种方式,是根据条件是否满足,决定执行不同的程序部分,C语言中的if语句有三种形式。,3 语句的执行过程如右图5-2所示。4 说明 表示条件,常用关系表达式或逻辑表达式表示,称为“条件表达式”,必须放在一对圆括号中。也可以为整型或字符表达式。,是当条件为“真”(非0)时所要完成的处理。当处理是由两个或两个以上的简单语句组成时,必须构造成复合语句,且复合语句的最后不能有“;”。例1:输入两个实数,按从大到小输出。分析:假设输入的数是a,b,输出的顺序也是a,b,则当a小于b时交

11、换。,main()float a,b,temp;scanf(%f,%f,选择分支指的是根据一个条件,在不同的情况(为“真”或为“假”)时分别执行不同的处理。1 语句格式if();else;2 语句的作用 当为“真”时,执行;否则,即为“假”时,执行。,5.3.2 选择分支,3 语句的执行过程如右图5-3所示。例2:输入两个实数,按从大到小输出。,分析:假设输入的数是a,b,根据a,b值的大小,输出的顺序分别是a,b或b,a。main()float a,b,temp;scanf(“%f,%f,多条件选择指的是在一个条件下分不同的情况,然后继续往下还有更加递进的条件。C语言用ifelse实现。1

12、语句格式if();else if();else if();else if();else;,5.3.3 多条件选择,3 语句的执行过程如右图5-4所示。,4 说明 在选择分支及多条件选择的语句形式中,每个else前面以及整个语句的最后必须要有“;”,若没有,则是语法错误。当是复合语句时则不能有“;”;上述两种形式中的if和else是两个不同的语句,它们都属于同一个if语句;else子句不能作为一个语句单独使用,是if语句的一部分,必须与if配对使用。例3:输入三个整数a,b,c,若能构成三角形则求三角形的面积;若不能则给出提示信息。分析:三个数a,b,c,若满足下列三种情况之一就不能构成三角形。

13、a,b,c中只要有一个为负数或0;任意两个数之和小于或等于另一个数;,任意两个数之差大于或等于另一个数;#include stdio.h#include math.hmain()int a,b,c;float s,area;scanf(%d,%d,%d,else s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c);printf(The area is%8.3f,area);,在前面的几种if语句结构中,语句可以是复合语句,当然可以包含一个或多个if语句的分支结构,称为分支的嵌套。1 语句格式,5.3.4 分支的嵌套,2 说明 对于多条件选择或分支的嵌套,特别

14、要注意else与if的匹配关系。else总是与其前面最近的if匹配;在程序中,当if和else的数目不一致时,为了保证分支结构在逻辑上是清晰的,最好使用“”构成复合语句来确定else与if的匹配关系。,例4:输入三个整数a,b,c,求最大值。以下给出三个程序,判断哪个能求得真正的最大值。程序一:#include stdio.hmain()int a,b,c,max;scanf(%d,%d,%d,程序二:#include stdio.hmain()int a,b,c,max;scanf(%d,%d,%d,程序三:#include stdio.hmain()int a,b,c,max;scanf(

15、%d,%d,%d,若在选择分只结构中,当条件为“真”或为“假”时要做的处理仅仅是给同一个变量赋值。对于这种情况,C语言提供了简单的条件运算符来实现。1 语句符形式?:2 功能 若为“真”(非0),则以作为整个条件运算表达式的值;否则,以作为整个条件运算表达式的值。如表达式:(a=0)?a:-a,是求|a|。,5.3.5 条件运算,例5:输入三个整数a,b,c,求最大值。#include stdio.hmain()int a,b,c,max;scanf(%d,%d,%d,3 说明 条件运算不能取代一般的ifelse语句,只有当条件为“真”或为“假”时要做的处理仅仅是给同一个变量赋值时才可以替换i

16、felse语句;条件运算表达式中,和的类型可以不同,但一般应是相容的;条件运算可以嵌套,即或由可以是条件运算表达式。如上例中的三个语句:max=a;max=(maxb)?(ac?a:c):(bc?b:c);,5.4 switch语句,实际应用中有这样的情况:同一个数值有多种不同的处理方式,即多分支选择处理。C语言提供了switch语句直接处理多分支选择。1 switch语句的一般形式switch()case:;break;case:;break;.case:;break;default:;,例6:从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80scor

17、e90,等级为B;70score80,等级为C;60score70,等级为D;score60,等级为E。main()int score,grade;printf(Input a score(0100):);scanf(%d,case 8:printf(grade=Bn);break;case 7:printf(grade=Cn);break;case 6:printf(grade=Dn);break;case 5:case 4:case 3:case 2:case 1:case 0:printf(grade=En);break;default:printf(The score is out o

18、f range!n);,2 功能 switch后的依次与各个常量表达式进行测试,如果某个常量与的值相等,则以此case作为执行的入口,往下执行switch结构中的所有语句,直到遇到break语句或到达switch的末尾。3 执行过程 计算switch后的值;依次与case后的各个常量表达式进行测试;若与某个case后面的“常量表达式”的值相同时,则以此case作为执行的入口,往下执行switch结构中的所有语句,直到遇到break语句或到达switch的末尾。当执行到break语句时,跳出switch语句,转向执行switch语句的下一条;,如果没有任何一个case后面的“常量表达式”的值与“

19、表达式”的值匹配时:若有default子句,则执行default后面的语句(组),执行完后跳出switch语句,转向执行switch语句的下一条;若没有default子句,则直接跳出switch语句,转向执行switch语句的下一条。4 说明 switch后面的“表达式”称为“开关控制表达式”,可以是int、char和枚举型中的一种。Case后的各个常量的类型必须与该“表达式”的类型相同;每个case后面“常量表达式”的值,必须互不相同,否则会出现相互矛盾现象。但当多个常量相匹配后做相同的处理(执行相同的语句序列)时,这多个case可以依次排在一起,如例6;,各个case和default的次序

20、并不影响执行结果,但一般将default子句放在最后;case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行判断。因此,当一个case后的语句组执行完后应及时地结束switch语句,则在语句组的最后应加上break语句。,例1:求方程ax2+bx+c=0的实数根。a,b,c由键盘输入,假设a0。分析:根据输入的系数a,b,c,有以下几种情况:b2-4ac=0:有两个相等的实根;b2-4ac0:有两个不相等的实根;b2-4ac0:有两个共轭虚根;其次,由于实数的存储误差,一般在判断实数是否为0时不是以真正的值0作为标准,而是将一个很小的数(

21、如10-6)看成0。,5.5 分支结构程序设计示例,#include math.h main()float a,b,c,disc,x1,x2,p,q;scanf(%f,%f,%f,else p=-b/(2*a);/*求出两个共轭复根*/q=sqrt(fabs(disc)/(2*a);printf(x1=%7.2f+%7.2f in,p,q);printf(x2=%7.2f-%7.2f in,p,q);例2:已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与提成的关系如下(单位:元):profit1000没有提成;1000profit2000提成10%;2000profi

22、t5000提成15%;5000profit10000提成20%;10000profit提成25%。,算法设计要点:为使用switch语句,必须将利润profit与提成的关系,转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、),如果将利润profit整除1000,则当:profit1000对应0、11000profit2000对应1、22000profit5000对应2、3、4、55000profit10000对应5、6、7、8、9、1010000profit对应10、11、12、为解决相邻两个区间的重叠问题,最简单的方法就是:利润pro

23、fit先减1(最小增量),然后再整除1000即可:,profit1000对应01000profit2000对应12000profit5000对应2、3、45000profit10000对应5、6、7、8、910000profit对应10、11、12、#include stdio.hmain()long profit;int grade;float salary=500;printf(Input profit:);scanf(%ld,/*将利润-1整除1000,转化成 switch语句中的case标号*/,switch(grade)case 0:break;/*profit1000*/case 1:salary+=profit*0.1;break;case 2:case 3:case 4:salary+=profit*0.15;break;case 5:case 6:case 7:case 8:case 9:salary+=profit*0.2;break;default:salary+=profit*0.25;printf(salary=%.2fn,salary);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号