C语言大学使用教材(第2版)第5章讲稿PPT课件_第1页
C语言大学使用教材(第2版)第5章讲稿PPT课件_第2页
C语言大学使用教材(第2版)第5章讲稿PPT课件_第3页
C语言大学使用教材(第2版)第5章讲稿PPT课件_第4页
C语言大学使用教材(第2版)第5章讲稿PPT课件_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精选,1,第5章逻辑运算和分支程序结构,本章介绍条件的表示和程序的分支结构。5.1关系运算和关系表达式5.2逻辑运算和逻辑表达式5.3if语句5.4switch语句5.5分支程序设计示例,精选,2,任何一个解决实际问题的计算机程序,顺序执行的顺序结构往往是很不够的,实际问题中,更多的是:根据特定条件的不同方面,有选择性地进行不同情况的处理;在一定的条件下,有些处理需要反复多次地执行;实现上述两种情况的程序结构分别是分支结构和循环结构,本章讨论程序的分支结构及其相应的控制语句。要设计选择结构程序,要考虑两个方面的问题:条件的表示:一般用关系表达式或逻辑表达式。选择结构的控制语句:if语句或switch语句。,精选,3,5.1关系运算符和关系表达式,“关系运算”实际上就是“比较运算”,是逻辑运算中比较简单的一种,即将两个数据进行比较,判定两个数据是否符合给定的关系(条件)。比较运算的对象可以是两个类型相同的数值、字符、地址。例如,“ab”中的“”表示一个大于关系运算。如果a的值是5,b的值是3,则大于关系运算“”的结果为“真”,即条件成立;如果a的值是2,b的值是3,则大于关系运算“”的结果为“假”,即条件不成立。,精选,4,1关系运算符C语言提供6种关系运算符:(大于),=(大于或等于),=(等于),!=或(不等于)注意:在语言中,“等于”关系运算符是双等号“=”,而不是单等号“=”(赋值运算符)。2优先级在关系运算符中,前4个优先级相同,后2个也相同,且前4个高于后2个。,5.1.1关系运算符及其优先级,精选,5,与其它种类运算符的优先级关系关系运算符的优先级低于算术运算符、逻辑移位运算符和逻辑非;关系运算符的优先级高于逻辑运算符和按位运算符;关系运算符的优先级高于赋值运算符;总结起来,C语言中各种主要的运算符的优先级如图5-1所示。,精选,6,1关系表达式的概念关系表达式是指用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来,进行关系运算的式子。例如,下面的关系表达式都是合法的:ab,a+bc-d,(a=3)=b,(ab)=(bc)2关系表达式的值关系表达式的结果是逻辑值(非“真”即“假”)。,5.1.2关系表达式,精选,7,由于C语言没有逻辑型数据,所以用整数“”表示“逻辑真”,用整数“”表示“逻辑假”。例:假设num1=3,num2=4,num3=5,则:num1num2的值=0。(num1num2)!=num3的值=1。num1num2num3的值=1。思考题:任意改变num1或num2的值,会影响整个表达式的值吗?为什么?(num1=0”、同时“x=0)printf(Pleaseinputthreenumbers:);scanf(%d,%d,%d,5.3if语句,精选,15,程序运行情况如下:Pleaseinputthreenumbers:11,22,18Thethreenumbersare:11,22,18max=22本例中的第1个if语句,可优化为如下不带else子句的形式:max=num1;if(num2max)max=num2;这种优化形式的基本思想是:首先取一个数预置为max(最大值),然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max中的数就是最大值。这种方法,对从3个或3个以上的数中找最大值的处理,非常有效。,精选,16,简单分支指的是某一程序段的执行取决于条件是否成立(为“真”)。1语句格式if();2语句的作用当为“真”时,执行;否则,跳过,什么也不执行。,5.3.1简单分支,if语句是用来控制程序分支结构的一种方式,是根据条件是否满足,决定执行不同的程序部分,C语言中的if语句有三种形式。,精选,17,3语句的执行过程如右图5-2所示。4说明表示条件,常用关系表达式或逻辑表达式表示,称为“条件表达式”,必须放在一对圆括号中。也可以为整型或字符表达式。,是当条件为“真”(非0)时所要完成的处理。当处理是由两个或两个以上的简单语句组成时,必须构造成复合语句,且复合语句的最后不能有“;”。例1:输入两个实数,按从大到小输出。分析:假设输入的数是a,b,输出的顺序也是a,b,则当a小于b时交换。,精选,18,main()floata,b,temp;scanf(%f,%f,精选,19,选择分支指的是根据一个条件,在不同的情况(为“真”或为“假”)时分别执行不同的处理。1语句格式if();else;2语句的作用当为“真”时,执行;否则,即为“假”时,执行。,5.3.2选择分支,精选,20,3语句的执行过程如右图5-3所示。例2:输入两个实数,按从大到小输出。,分析:假设输入的数是a,b,根据a,b值的大小,输出的顺序分别是a,b或b,a。main()floata,b,temp;scanf(“%f,%f,精选,21,多条件选择指的是在一个条件下分不同的情况,然后继续往下还有更加递进的条件。C语言用ifelse实现。1语句格式if();elseif();elseif();elseif();else;,5.3.3多条件选择,精选,22,3语句的执行过程如右图5-4所示。,精选,23,4说明在选择分支及多条件选择的语句形式中,每个else前面以及整个语句的最后必须要有“;”,若没有,则是语法错误。当是复合语句时则不能有“;”;上述两种形式中的if和else是两个不同的语句,它们都属于同一个if语句;else子句不能作为一个语句单独使用,是if语句的一部分,必须与if配对使用。例3:输入三个整数a,b,c,若能构成三角形则求三角形的面积;若不能则给出提示信息。分析:三个数a,b,c,若满足下列三种情况之一就不能构成三角形。a,b,c中只要有一个为负数或0;任意两个数之和小于或等于另一个数;,精选,24,任意两个数之差大于或等于另一个数;#includestdio.h#includemath.hmain()inta,b,c;floats,area;scanf(%d,%d,%d,精选,25,elses=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c);printf(Theareais%8.3f,area);,精选,26,在前面的几种if语句结构中,语句可以是复合语句,当然可以包含一个或多个if语句的分支结构,称为分支的嵌套。1语句格式,5.3.4分支的嵌套,精选,27,2说明对于多条件选择或分支的嵌套,特别要注意else与if的匹配关系。else总是与其前面最近的if匹配;在程序中,当if和else的数目不一致时,为了保证分支结构在逻辑上是清晰的,最好使用“”构成复合语句来确定else与if的匹配关系。,精选,28,例4:输入三个整数a,b,c,求最大值。以下给出三个程序,判断哪个能求得真正的最大值。程序一:#includestdio.hmain()inta,b,c,max;scanf(%d,%d,%d,精选,29,程序二:#includestdio.hmain()inta,b,c,max;scanf(%d,%d,%d,精选,30,程序三:#includestdio.hmain()inta,b,c,max;scanf(%d,%d,%d,精选,31,若在选择分只结构中,当条件为“真”或为“假”时要做的处理仅仅是给同一个变量赋值。对于这种情况,C语言提供了简单的条件运算符来实现。1语句符形式?:2功能若为“真”(非0),则以作为整个条件运算表达式的值;否则,以作为整个条件运算表达式的值。如表达式:(a=0)?a:-a,是求|a|。,5.3.5条件运算,精选,32,例5:输入三个整数a,b,c,求最大值。#includestdio.hmain()inta,b,c,max;scanf(%d,%d,%d,精选,33,3说明条件运算不能取代一般的ifelse语句,只有当条件为“真”或为“假”时要做的处理仅仅是给同一个变量赋值时才可以替换ifelse语句;条件运算表达式中,和的类型可以不同,但一般应是相容的;条件运算可以嵌套,即或由可以是条件运算表达式。如上例中的三个语句:max=a;max=(maxb)?(ac?a:c):(bc?b:c);,精选,34,5.4switch语句,实际应用中有这样的情况:同一个数值有多种不同的处理方式,即多分支选择处理。C语言提供了switch语句直接处理多分支选择。1switch语句的一般形式switch()case:;break;case:;break;.case:;break;default:;,精选,35,例6:从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80score90,等级为B;70score80,等级为C;60score70,等级为D;score0:有两个不相等的实根;b2-4ac0:有两个共轭虚根;其次,由于实数的存储误差,一般在判断实数是否为0时不是以真正的值0作为标准,而是将一个很小的数(如10-6)看成0。,5.5分支结构程序设计示例,精选,41,#includemath.hmain()floata,b,c,disc,x1,x2,p,q;scanf(%f,%f,%f,精选,42,elsep=-b/(2*a);/*求出两个共轭复根*/q=sqrt(fabs(disc)/(2*a);printf(x1=%7.2f+%7.2fin,p,q);printf(x2=%7.2f-%7.2fin,p,q);例2:已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与提成的关系如下(单位:元):profit1000没有提成;1000profit2000提成10%;2000profit5000提成15%;5000profit10000提成20%;10000profit提成25%。,精选,43,算法设计要点:为使用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、为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1(最小增量),然后再整除1000即可:,精选,44,profit1000对应01000profit2000对应12000profit5000对应2、3、45000profit10000对应5、6、7、8、910000profit对应10、11、12、#includestdio.hmain()longprofit;intgrade;floatsalary=500;printf(Inputprofit:);scanf(%ld,/*将利润-1整除1000,转化成switch语句

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论