《第3章 程序的控制结构教学课件PPT.ppt》由会员分享,可在线阅读,更多相关《第3章 程序的控制结构教学课件PPT.ppt(85页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、完整版教学课件完整版教学课件第3章 程序的控制结构第第3 3章章 程序的控制结构程序的控制结构u3.1 3.1 程序灵魂程序灵魂:算法算法u3.2 3.2 流水作业流水作业:顺序结构顺序结构u3.3 3.3 择优录取择优录取:选择结构选择结构u3.5 3.5 本章小结本章小结u3.4 3.4 周而复始周而复始:循环结构循环结构第第3 3章章 程序的控制结构程序的控制结构43.1 3.1 程序灵魂程序灵魂:算法算法 可以把可以把“算法算法”理解为完成一件事情理解为完成一件事情或解决一个问题而采取的方法和步骤。或解决一个问题而采取的方法和步骤。由此可知,算法这一概念早已融入我们由此可知,算法这一概
2、念早已融入我们的学习与生活中:如何求解一个方程、的学习与生活中:如何求解一个方程、如何安排去某地旅游的路线或行程等都如何安排去某地旅游的路线或行程等都包含着某种算法。当然我们现在只讨论包含着某种算法。当然我们现在只讨论计算机算法,即计算机可以实现的算法。计算机算法,即计算机可以实现的算法。5 按数据的处理方式,计算机中的按数据的处理方式,计算机中的算法可分算法可分为:为: (1)(1)数值运算数值运算:目的是求数值解,如求方程的:目的是求数值解,如求方程的根,求函数的定积分等。根,求函数的定积分等。 (2)(2)非数值运算非数值运算:目前使用范围广泛,如办公:目前使用范围广泛,如办公自动化处理
3、、图书情报检索等。自动化处理、图书情报检索等。 一般来说,不同的问题,有不同的解决方法一般来说,不同的问题,有不同的解决方法和步骤,而对同一问题,也可能有不同的解决和步骤,而对同一问题,也可能有不同的解决方法和步骤,也就是有不同的算法。方法和步骤,也就是有不同的算法。算法有优算法有优劣劣,一般而言,应当选择简单的、运算步骤少,一般而言,应当选择简单的、运算步骤少的,运算快、内存开销小的算法。的,运算快、内存开销小的算法。3.1 3.1 程序灵魂程序灵魂:算法算法63.1.1 3.1.1 算法的特性算法的特性1 1有穷性有穷性 算法包含的操作步骤是有限的,每一步都应在合理的时间内完成。算法包含的
4、操作步骤是有限的,每一步都应在合理的时间内完成。 2 2确定性确定性 算法中的每一步骤都应是唯一的和确定无误的,不允许有岐义性。算法中的每一步骤都应是唯一的和确定无误的,不允许有岐义性。如如“输出成绩优秀的同学名单输出成绩优秀的同学名单”就有岐义,就有岐义,“成绩优秀成绩优秀”的含义不明的含义不明确。确。 3 3有效性有效性 算法中每一步骤都应是能有效地执行,且能得到确定的结果,例如:算法中每一步骤都应是能有效地执行,且能得到确定的结果,例如:求一个负数的对数,就是一个无效的步骤。求一个负数的对数,就是一个无效的步骤。 4 4没有输入或有多个输入没有输入或有多个输入 有些算法无需从外界输入数据
5、,如计算有些算法无需从外界输入数据,如计算6 6!,而有的算法需从外界!,而有的算法需从外界输入数据,如计算输入数据,如计算n n! 。 5 5有一个或多个输出有一个或多个输出 即算法必须得到结果,没有结果的算法是毫无意义的即算法必须得到结果,没有结果的算法是毫无意义的。73.1.2 3.1.2 算法的表示算法的表示 观察上述的算法,可以考虑使用一个观察上述的算法,可以考虑使用一个变量变量(sum)(sum)既用来既用来存放每一次的求和结果,又用来表示每一次求和时的被加存放每一次的求和结果,又用来表示每一次求和时的被加数。数。这样方法这样方法1 1中的中的9999个步骤可以表示为:个步骤可以表
6、示为: s1: sum=sum+2 s1: sum=sum+2; ( (在这之前先把在这之前先把sumsum初始化为初始化为1) 1) s2: sum=sum+3; s2: sum=sum+3; s3: sum=sum+4; s3: sum=sum+4; s99: sum=sum+100; s99: sum=sum+100; 再次观察上述的算法,可以考虑再使用一个再次观察上述的算法,可以考虑再使用一个变量变量i i来表来表示加数示加数,让,让i i从从2 2开始,不断地做开始,不断地做sum=sum+i sum=sum+i 这一个相同的这一个相同的循环操作,直到循环操作,直到i i超过超过10
7、0100为止。于是可以得到改进的算法为止。于是可以得到改进的算法如下:如下:83.1.2 3.1.2 算法的表示算法的表示 方法方法2 2:用变量用变量 sum sum 和和 i i 分别表示两个加数,和也用分别表示两个加数,和也用变量变量 sum sum 表示。用自然语言描述如下:表示。用自然语言描述如下: s1: sum = 1;s1: sum = 1; s2: i = 2; s2: i = 2; s3: s3: 若若 i=100i=100,重复步骤,重复步骤s4s5s4s5,否则转去执行,否则转去执行s6;s6; s4: sum = sum + i; s4: sum = sum + i;
8、 s5: i = i + 1; s5: i = i + 1; s6: s6: 输出输出sumsum的值。的值。 上述算法是一个上述算法是一个循环算法循环算法:S3S3到到S5S5组成一个循环,在组成一个循环,在实现算法时要反复多次执行实现算法时要反复多次执行S3S3,S4S4,S5S5等步骤,直到某等步骤,直到某一时刻,执行一时刻,执行S5S5步骤时经过判断,加数步骤时经过判断,加数i i已超过规定的数已超过规定的数值而不返回值而不返回S3S3步骤为止。此时算法结束,变量步骤为止。此时算法结束,变量sumsum的值的值就是所求结果。就是所求结果。93.1.2 3.1.2 算法的表示算法的表示2
9、.2.用传统流程图表示算法用传统流程图表示算法 传统流程图采用一组规定的图形符号、流程线和文字说传统流程图采用一组规定的图形符号、流程线和文字说明来表示各种操作算法。美国国家标准化协会明来表示各种操作算法。美国国家标准化协会ANSI(American ANSI(American National Standard Institute)National Standard Institute)规定了一些常用的流程图符号,规定了一些常用的流程图符号,已为世界各国程序工作者普遍采用,如表已为世界各国程序工作者普遍采用,如表3-13-1所示。所示。 【案例【案例3.23.2】 用传统流程图描述【案例用传
10、统流程图描述【案例3.13.1】的算法,如图】的算法,如图3-13-1所示。所示。 用传统流程图表示算法直观形象,易于理解,能够比较用传统流程图表示算法直观形象,易于理解,能够比较清晰地表达各种处理之间的逻辑关系,是表示算法的较好的清晰地表达各种处理之间的逻辑关系,是表示算法的较好的工具。但由于对流程线的使用没有严格限制,易造成流程的工具。但由于对流程线的使用没有严格限制,易造成流程的随意转移,不能保证是结构化的,从而难以阅读和修改。随意转移,不能保证是结构化的,从而难以阅读和修改。103.1.2 3.1.2 算法的表示算法的表示符号名称用途起止框起止框用于描述控制流程的开始和结束:开始框内用
11、于描述控制流程的开始和结束:开始框内标注标注“开始开始”字样,结束框内标注字样,结束框内标注“结束结束”字样字样输入输出输入输出框框用于表示数据的输入和输出:框内标明输入用于表示数据的输入和输出:框内标明输入输出的变量输出的变量处理框处理框用于描述数据加工和处理:常采用文字加符用于描述数据加工和处理:常采用文字加符号来表示计算公式和赋值操作号来表示计算公式和赋值操作判断框判断框用于描述条件判断和转移关系:框内描述条用于描述条件判断和转移关系:框内描述条件关系,两个流出边分别标注件关系,两个流出边分别标注 Yes/NoYes/No、Y/NY/N、True/FalseTrue/False或或“真真
12、/ /假假”,表示条件成立或,表示条件成立或不成立时的转移关系不成立时的转移关系调用框调用框用于描述过程调用或模块调用:框内标注函用于描述过程调用或模块调用:框内标注函数或模块名数或模块名流程线流程线用于连接两个图形框:箭头描述处理过程的用于连接两个图形框:箭头描述处理过程的转移方向转移方向连接框连接框用于描述多张流程图的连接:应附加文字标用于描述多张流程图的连接:应附加文字标识连接关系识连接关系开开 始始su m = 0i= 1i = 100NYsu m = su m + ii= i+ 1输输 出出 su m 的的 值值结结 束束图图 3-1 例例 3-2算算 法法 描描 述述表表3-1 3
13、-1 传统流程图常用的图形符号传统流程图常用的图形符号113.1.2 3.1.2 算法的表示算法的表示3.3.用用NNS S流程图表示算法流程图表示算法 针对传统流程图存在的问题,针对传统流程图存在的问题,19731973年美国学者年美国学者I.NassiI.Nassi和和B.ShneidermanB.Shneiderman提出了一种新的结构化流程图形式。在这种流程提出了一种新的结构化流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本在该框内还可以包含
14、其它的从属于它的框,或者说,由一些基本的框组成一个大的框。该矩形框以三种基本结构(顺序、选择、的框组成一个大的框。该矩形框以三种基本结构(顺序、选择、循环)描述符号为基础复合而成,这种流程图又称循环)描述符号为基础复合而成,这种流程图又称NNS S结构化流结构化流程图。程图。 【案例【案例3.33.3】 用用NSNS流程图描述【案例流程图描述【案例3.13.1】的算法,如图】的算法,如图3-23-2所示。所示。 用用NNS S流程图表示算法比自然语言描述直观、形象、易于理流程图表示算法比自然语言描述直观、形象、易于理解,又比传统流程图紧凑易画。用解,又比传统流程图紧凑易画。用NNS S图表示的
15、算法都是结构化图表示的算法都是结构化的算法。的算法。123.1.2 3.1.2 算法的表示算法的表示 4.4.用伪代码表示算法用伪代码表示算法 伪代码是指介于自然语言和计算机语言之间的一种代码,是帮伪代码是指介于自然语言和计算机语言之间的一种代码,是帮助程序员制定算法的智能化语言。助程序员制定算法的智能化语言。 【案例【案例3.43.4】 用伪代码描述【案例用伪代码描述【案例3.13.1】的算法。】的算法。 begin begin sum0; sum0; i1; i1; while i100 while i100 sumsum+i; sumsum+i; ii+1 ii+1 print sum
16、print sum end end133.1.2 3.1.2 算法的表示算法的表示5.5.用计算机语言表示算法用计算机语言表示算法计算机是无法识别流程图和伪代码的。只有用计算机计算机是无法识别流程图和伪代码的。只有用计算机语言编写的程序,经编译成目标程序后,才能被计算机执语言编写的程序,经编译成目标程序后,才能被计算机执行。行。【案例【案例3.53.5】 用用C C语言描述【案例语言描述【案例3.13.1】的算法。】的算法。#include #include main()main() int i=1, sum=0; int i=1, sum=0; while (i=100) while (i=
17、100) sum=sum+i; sum=sum+i; i+; i+; printf(sum=%d, sum); printf(sum=%d, sum); u3.1 3.1 程序灵魂程序灵魂:算法算法u3.2 3.2 流水作业流水作业:顺序结构顺序结构u3.3 3.3 择优录取择优录取:选择结构选择结构u3.5 3.5 本章小结本章小结u3.4 3.4 周而复始周而复始:循环结构循环结构第第3 3章章 程序的控制结构程序的控制结构153.2 3.2 流水作业流水作业:顺序结构顺序结构前面设计好的算法在计算机中主要是通过各种语言所提供前面设计好的算法在计算机中主要是通过各种语言所提供的语句来实现。
18、和其它高级语言一样,的语句来实现。和其它高级语言一样,C C语言的语言的语句语句用来向计用来向计算机系统发出操作指令。一个语句经编译后产生若干条机器指算机系统发出操作指令。一个语句经编译后产生若干条机器指令。一个为实现特定目的的程序应当包含若干条语句。令。一个为实现特定目的的程序应当包含若干条语句。 C C语言中的语句可以分为以下五类:语言中的语句可以分为以下五类: 1. 1.函数调用语句函数调用语句 由函数名、实际参数加上分号由函数名、实际参数加上分号“;”组成。其一般形式为:组成。其一般形式为: 函数名函数名( (实际参数表实际参数表) ); 执行函数语句就是调用函数体并把实际参数赋予函数
19、定义执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值中的形式参数,然后执行被调函数体中的语句,求取函数值 ( (在后面函数中再详细介绍在后面函数中再详细介绍) ) 。 例如:例如:printf(Hello!);printf(Hello!); 调用库函数,输出字符串。调用库函数,输出字符串。16 2. 2.表达式语句表达式语句 表达式语句由表达式加上分号表达式语句由表达式加上分号“;”组成。其一般形式为:组成。其一般形式为:表达式;表达式; 执行表达式语句就是计算表达式的值。例如:执行表达式语句就是计算表达式的值。例如: x=y+z; x=y
20、+z; 赋值语句。赋值语句。 i+; i+; 自增自增1 1语句,语句,i i值增值增1 1。 其中赋值语句是程序中使用最多的语句之一。表达式能构成语句其中赋值语句是程序中使用最多的语句之一。表达式能构成语句是是C C语言的一个特色。语言的一个特色。 3. 3.控制语句控制语句 控制语句用于控制程序的流程,以实现程序的各种结构方式。控制语句用于控制程序的流程,以实现程序的各种结构方式。语言有九种控制语句,可以分成以下三类:语言有九种控制语句,可以分成以下三类: 条件判断语句:条件判断语句:if if语句、语句、switchswitch语句。语句。 循环执行语句:循环执行语句:whilewhil
21、e语句、语句、do whiledo while语句、语句、forfor语句。语句。 转向语句:转向语句:breakbreak语句、语句、continuecontinue语句、语句、gotogoto语句、语句、returnreturn语句。语句。3.2 3.2 流水作业流水作业:顺序结构顺序结构174.4.复合语句复合语句 把多个逻辑相关的语句用括号把多个逻辑相关的语句用括号 括起来组成一条复合语句。括起来组成一条复合语句。复合语句在逻辑上形成一个整体,在程序中应把它看成是单条复合语句在逻辑上形成一个整体,在程序中应把它看成是单条语句,而不是多条语句。语句,而不是多条语句。 例如:例如: x=y
22、+z; a=b+c; printf( x=y+z; a=b+c; printf(“ “%d%d%d%d” ”,x x,a)a); 是一条复合语句。是一条复合语句。 5. 5.空语句空语句 只有分号只有分号“;”组成的语句称为空语句。空语句是什么也组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句经常被用来作空循环体。不执行的语句。在程序中空语句经常被用来作空循环体。例如例如: : while(getchar()!=while(getchar()!= nn ) ) ; 本语句的功能是,只要从键盘输入的字符不是本语句的功能是,只要从键盘输入的字符不是执行回车操执行回车操作命令作命令则
23、重新输入。则重新输入。 3.2 3.2 流水作业流水作业:顺序结构顺序结构18 在结构化程序中最简单、最在结构化程序中最简单、最常用的结构是顺序结构。常用的结构是顺序结构。顺序结顺序结构的特点构的特点是完全按照语句出现的是完全按照语句出现的先后次序执行程序。其传统流程先后次序执行程序。其传统流程图和图和NNS S流程图如图流程图如图3-33-3所示。所示。 从程序的整体来看,程序的从程序的整体来看,程序的语句是按顺序执行的,构成了顺语句是按顺序执行的,构成了顺序结构序结构,尽管在局部(即某些程,尽管在局部(即某些程序段)并不按顺序执行语句,这序段)并不按顺序执行语句,这个过程称为个过程称为“控
24、制的转移控制的转移”,它,它涉及了另外两类程序的控制结构,涉及了另外两类程序的控制结构,即选择(分支)结构和循环结构。即选择(分支)结构和循环结构。由此可见,顺序结构也是一种最由此可见,顺序结构也是一种最基本的结构。基本的结构。AB图图 3-3 顺顺序序结结构构AB3.2 3.2 流水作业流水作业:顺序结构顺序结构19【案例【案例3.63.6】输入三角形的三边长,求三角形面积。为简单起见,输入三角形的三边长,求三角形面积。为简单起见,设输入的三条线段能构成三角形的三条边。设输入的三条线段能构成三角形的三条边。源程序如下:源程序如下:#include #include #include /#in
25、clude /* *包含使用数学库函数所对应的头文件包含使用数学库函数所对应的头文件* */ /main()main() float a, b, c, s, area; float a, b, c, s, area; printf(Please input a, b, c:); printf(Please input a, b, c:); scanf(%f, %f, %f,&a, &b, &c); scanf(%f, %f, %f,&a, &b, &c); s=1.0/2 s=1.0/2* *(a+b+c);(a+b+c); area=sqrt(s area=sqrt(s* *(s-a)(s-
26、a)* *(s-b)(s-b)* *(s-c);(s-c); printf(“a=%7.2f, b=%7.2f, c=%7.2f, s=%7.2f n, a, b, c, s); printf(“a=%7.2f, b=%7.2f, c=%7.2f, s=%7.2f n, a, b, c, s); printf(area=%7.2fn, area); printf(area=%7.2fn, area); 思考:若语句思考:若语句s=1.0/2s=1.0/2* *(a+b+c); (a+b+c); 中的中的1.01.0改成改成1 1可以吗?为什么?可以吗?为什么?3.2 3.2 流水作业流水作业:
27、顺序结构顺序结构u3.1 3.1 程序灵魂程序灵魂:算法算法u3.2 3.2 流水作业流水作业:顺序结构顺序结构u3.3 3.3 择优录取择优录取:选择结构选择结构u3.5 3.5 本章小结本章小结u3.4 3.4 周而复始周而复始:循环结构循环结构第第3 3章章 程序的控制结构程序的控制结构213.3 3.3 择优录取择优录取:选择结构选择结构在许多实际问题的程序设计中,根据输入数据和中在许多实际问题的程序设计中,根据输入数据和中间结果的不同情况需要选择不同的语句组执行。在这种间结果的不同情况需要选择不同的语句组执行。在这种情况下,必须根据某个变量或表达式的值作出判断,以情况下,必须根据某个
28、变量或表达式的值作出判断,以决定执行哪些语句和跳过哪些语句不执行,这就是决定执行哪些语句和跳过哪些语句不执行,这就是选择选择结构(分支结构)。结构(分支结构)。选择结构中主要用到以下两个语句:选择结构中主要用到以下两个语句: 条件语句:条件语句:根据给定的条件(逻辑值)进行判断,根据给定的条件(逻辑值)进行判断,决定执行某个分支和程序段。决定执行某个分支和程序段。 开关分支语句:开关分支语句:根据给定表达式的值进行判断,然根据给定表达式的值进行判断,然后决定执行多路分支中的一支。后决定执行多路分支中的一支。 执行执行条件语句条件语句时要进行时要进行判断判断,经常需要使用到,经常需要使用到关系关
29、系运算符和逻辑运算符以及相应的表达式运算符和逻辑运算符以及相应的表达式。对于简单的判。对于简单的判断条件可用关系表达式来表示,对于较为复杂的条件可断条件可用关系表达式来表示,对于较为复杂的条件可用逻辑表达式来表示。用逻辑表达式来表示。 对于对于一个条件判断的结果只能有两种可能:一个条件判断的结果只能有两种可能:“真真”(对应条件成立)或者(对应条件成立)或者“假假”(对应条件不成立)(对应条件不成立)。而。而标准标准C C(C89C89)没有布尔数据类型,那么用)没有布尔数据类型,那么用非非0 0值值表示表示“真真”,用,用0 0值值来表示来表示“假假”。223.3.13.3.1 关系运算符和
30、关系表达式关系运算符和关系表达式优先级优先级运算符运算符名称或含义名称或含义使用形式使用形式结合方向结合方向说明说明6 6 大于大于表达式表达式 表达式表达式左到右左到右双目运算符双目运算符=大于等于大于等于表达式表达式=表达式表达式双目运算符双目运算符 小于小于表达式表达式 表达式表达式双目运算符双目运算符=小于等于小于等于表达式表达式=表达式表达式双目运算符双目运算符7 7=等于等于表达式表达式=表达式表达式左到右左到右双目运算符双目运算符!=!=不等于不等于表达式表达式!=!=表达式表达式双目运算符双目运算符3.3.13.3.1关系运算符和关系表达式关系运算符和关系表达式 C C语言提供
31、的语言提供的6 6种关系运算符在所有运算符中的优先级等种关系运算符在所有运算符中的优先级等情况如表情况如表3-23-2所示。所示。 表表3-2 3-2 关系运算符关系运算符233.3.13.3.1 关系运算符和关系表达式关系运算符和关系表达式【案例【案例3.73.7】关系运算符和表达式示例关系运算符和表达式示例#include #include int main( )int main( ) char c=k; char c=k; int i=0,j=1,k=2,m=3; int i=0,j=1,k=2,m=3; float x=0.2,y=0.3; float x=0.2,y=0.3; pri
32、ntf( printf((1 1)%dn,a+5c);%dn,a+5c); printf( printf((2 2)%dn,m=kj);%dn,m=kj); printf( printf((3 3)%dn, k=j=i+5);%dn, k=j=i+5); printf( printf((4 4)%dn,x%dn,x* *y=0.06);y=0.06); printf( printf((5 5)%dn,-1=i=1);%dn,-1=i=1); return 0; return 0; 243.3.23.3.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式3.3.2 3.3.2 逻辑运算符和逻辑表达
33、式逻辑运算符和逻辑表达式 C C语言提供的语言提供的3 3种逻辑运算符在所有运算符中的优先级等情种逻辑运算符在所有运算符中的优先级等情况如表况如表3-33-3所示。所示。 表表3-3 3-3 逻辑运算符逻辑运算符优先级优先级 运算符运算符名称或含义名称或含义使用形式使用形式结合方向结合方向说明说明2 2! !逻辑非运算符逻辑非运算符! !表达式表达式右到左右到左单目运算符单目运算符1111&逻辑与逻辑与表达式表达式&表达式表达式左到右左到右双目运算符双目运算符1212|逻辑或逻辑或表达式表达式|表达式表达式左到右左到右双目运算符双目运算符253.3.23.3.2 逻辑运算符和逻辑表达式逻辑运算
34、符和逻辑表达式a ab b! ! a aa a & & b ba a | b| b非非0 0(真)(真)非非0 0(真)(真)0 01 11 1非非0 0(真)(真)0 0 (假)(假)0 00 01 10 0 (假)(假)非非0 0(真)(真)1 10 01 10 0 (假)(假)0 0 (假)(假)1 10 00 0 逻辑运算符的运算规则是:逻辑运算符的运算规则是: 逻辑非逻辑非真变假,假变真。真变假,假变真。 逻辑与逻辑与两者都为真,结果才为真。两者都为真,结果才为真。 逻辑或逻辑或只要一个为真,结果就为真。只要一个为真,结果就为真。 用逻辑运算符连接操作数组成的表达式称为逻辑表达式。逻
35、辑表达式用逻辑运算符连接操作数组成的表达式称为逻辑表达式。逻辑表达式的值与关系表达式的值一样有两个:的值与关系表达式的值一样有两个:“真真”和和“假假”,用,用“1”1”和和“0”0”表表示。但是在需要判断一个表达式的值是否为真时并不局限于示。但是在需要判断一个表达式的值是否为真时并不局限于“1”1”,只要非,只要非0 0值就为真;而值就为真;而“0”0”仍为假。于是对两个表达式仍为假。于是对两个表达式a a和和b b,它们逻辑运算的,它们逻辑运算的“真值表真值表”如表如表3-43-4所示。所示。 表表3-4 3-4 逻辑运算的逻辑运算的“真值表真值表”26【案例【案例3.83.8】逻辑运算符
36、和表达式示例】逻辑运算符和表达式示例#include #include int main()int main() char ch=A; char ch=A; int i=0,j=1,k=2,year=2016; int i=0,j=1,k=2,year=2016; float x=0.2; float x=0.2; printf( printf((1 1)%d,%dn,i&j+|!k,j);%d,%dn,i&j+|!k,j); printf( printf((2 2)%d,%dn,(x|i+)&j=2,i);%d,%dn,(x|i+)&j=2,i); printf( printf((3 3)%
37、d,%dn, a=ch=a & ch=z);%d,%dn, a=ch=a & chy) max=x;if(xy) max=x; else max=y else max=y; 说明:(说明:(1 1)if if和和elseelse都属于同一个都属于同一个if if语句。语句。elseelse子句不能作为语句单独使用,它必须是子句不能作为语句单独使用,它必须是if if语句语句的一部分,与的一部分,与if if配对使用。配对使用。 (2 2)在)在if if和和elseelse后面可以只含一个内嵌的操作后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用语句(如上例),也可以有多
38、个操作语句,此时用花括号花括号“ ” ”将几个语句括起来成为一个复合语句。将几个语句括起来成为一个复合语句。如:如: if (ab) t=a; a=b; b=t; if (ab) t=a; a=b; b=t; (3) (3) 在在if if和和elseelse后面若是跟单条语句时,注意别后面若是跟单条语句时,注意别忘记写分号忘记写分号“;”,;”,若是复合语句时,若是复合语句时,“ ” ”后面不后面不必另加必另加“;”;”。表表 达达 式式语语 句句 1真真 ( 非非 0)假假 ( 0)图图 3-5( a) 双双 分分 支支 if语语 句句语语 句句 23.3.3 3.3.3 条件语句(条件语
39、句(if if 语句)语句)29 【案例【案例3.93.9】 输入三角形的三边长,求三输入三角形的三边长,求三角形面积。角形面积。 分析:与【案例分析:与【案例3.63.6】相比,】相比,此例去掉假此例去掉假设前提:设前提:“设输入的三条线段能构成三角形的设输入的三条线段能构成三角形的三条边三条边”,因此本题在输入三条线段后要加入,因此本题在输入三条线段后要加入条件判断其能否构成三角形的三条边,若可以条件判断其能否构成三角形的三条边,若可以则计算并输出面积,否则输出提示信息。则计算并输出面积,否则输出提示信息。思考:思考:if if后的后的“ ” ”能否去能否去掉?若去掉,掉?若去掉,表示什么
40、意思?表示什么意思?#include #include #include #include main( ) main( ) float a, b, c, s, area; float a, b, c, s, area; printf(Please input a, b, c:); printf(Please input a, b, c:); scanf(%f, %f, %f, &a, &b, &c); scanf(%f, %f, %f, &a, &b, &c); if (a+bc & a+cb & b+ca) / if (a+bc & a+cb & b+ca) /* *判断三条线段能判断三条线
41、段能 否构成三角形的三条边否构成三角形的三条边* */ / s=1.0/2 s=1.0/2* *(a+b+c);(a+b+c); area=sqrt(s area=sqrt(s* *(s-a)(s-a)* *(s-b)(s-b)* *(s-c);(s-c); printf(area=%7.2fn, area); printf(area=%7.2fn, area); else printf(it is not a trilateraln); else printf(it is not a trilateraln); 3.3.3 3.3.3 条件语句(条件语句(if if 语句)语句)30 3.3
42、.条件运算符与条件表达式条件运算符与条件表达式 条件运算符是条件运算符是C C语言中语言中唯一的一个三目运算符唯一的一个三目运算符,其在,其在所有运算符中的优先级等情况如表所有运算符中的优先级等情况如表3-53-5所示。所示。 表表3-5 3-5 条件运算符条件运算符 3.3.3 3.3.3 条件语句(条件语句(if if 语句)语句) 其其求值规则求值规则为:为:如果表达式如果表达式1 1的值为真,则以表达式的值为真,则以表达式2 2的值的值作为条件表达式的值,否则以表达式作为条件表达式的值,否则以表达式3 3的值作为整个条件表达式的值作为整个条件表达式的值。的值。例如:例如: max=(a
43、b)?a:b; max=(ab)?a:b; 执行该语句的语义是:如执行该语句的语义是:如abab为真,则把为真,则把a a赋予赋予maxmax,否则,否则把把b b 赋予赋予maxmax。它可以用来替换以下双分支的条件语句,更为简。它可以用来替换以下双分支的条件语句,更为简单、直观。单、直观。 if (ab) max=a; if (ab) max=a; else max=b; else max=b; 优先级优先级 运算符运算符 名称或含义名称或含义使用形式使用形式结合方向结合方向说明说明1313? :? :条件运算符条件运算符表达式表达式1? 1? 表达式表达式2: 2: 表达式表达式3 3右
44、到左右到左三目运算符三目运算符31 4.if4.if语句的嵌套形式(多分支情况语句的嵌套形式(多分支情况) 在在if if语句中又包含一个或多个语句中又包含一个或多个if if语句称为语句称为if if语句的嵌套。语句的嵌套。这种情况主要用来解决多分支情况,这种情况主要用来解决多分支情况,if if语句的嵌套有多种的语句的嵌套有多种的表现形式:表现形式: (1 1)下列形式为比较常用的一种:)下列形式为比较常用的一种: if if (表达式(表达式1 1) 语句语句1 1 else if else if (表达式(表达式2 2) 语句语句2 2 else if else if (表达式(表达式
45、3 3) 语句语句3 3 else if else if (表达式(表达式mm) 语句语句mm else else 语句语句n n 3.3.3 3.3.3 条件语句(条件语句(if if 语句)语句)32 【案例案例3.103.10】已知学生的百分制成绩,编写程序按已知学生的百分制成绩,编写程序按百分制分数进行分段评定,给出相应的等级:分数大于百分制分数进行分段评定,给出相应的等级:分数大于等于等于9090,则评定为,则评定为AA;分数在;分数在80808989之间,则评之间,则评定为定为BB;分数在;分数在70707979之间,则评定为之间,则评定为CC;分;分数在数在60606969之间,
46、则评定为之间,则评定为DD;分数小于;分数小于6060,则,则评定为评定为EE; 分析:这是一个根据百分制分数进行分段定级的多分分析:这是一个根据百分制分数进行分段定级的多分支选择问题,可利用上面介绍的支选择问题,可利用上面介绍的if if语句的嵌套来解决。语句的嵌套来解决。#include #include main( )main( ) float score;float score;char grade;char grade;printf(Please enter scores:);printf(Please enter scores:);scanf(%f, &score);scanf(%
47、f, &score);if(score100) /if(score100) /* *对输入数据的合法性进行检查对输入数据的合法性进行检查* */ / printf(Input error!n); printf(Input error!n);elseelse if(score=90) grade=A; if(score=90) grade=A; else if(score=80) grade=B; else if(score=80) grade=B; else if(score=70) grade=C; else if(score=70) grade=C; else if(score=60) g
48、rade=D; else if(score=60) grade=D; else grade=E; else grade=E; printf(%5.1f-%cn, score, grade); printf(%5.1f-%cn, score, grade); 3.3.3 3.3.3 条件语句(条件语句(if if 语句)语句)33 (2 2)其他形式:)其他形式: 在嵌套内将会出现多个在嵌套内将会出现多个if if和多个和多个elseelse重叠的情况,这时要特别注意重叠的情况,这时要特别注意if if和和elseelse的配对问题。例如:的配对问题。例如: if(if(表达式表达式1)1) i
49、f( if(表达式表达式2)2) 语句语句1 1; elseelse 语句语句2 2; 其中的其中的elseelse究竟是与哪一个究竟是与哪一个if if配对呢配对呢? ?是与表达式是与表达式2 2前还是与表达式前还是与表达式1 1前的前的if if配对配对? ?语言规定,从最内层开始,语言规定,从最内层开始,elseelse总是与它上面最近的总是与它上面最近的(未曾配对的)(未曾配对的)if if配对配对, ,因此对上述例子应按前一种情况理解。如果因此对上述例子应按前一种情况理解。如果if if与与elseelse的数目不一样,为实现程序设计者的企图,可以加花括弧来确定的数目不一样,为实现程
50、序设计者的企图,可以加花括弧来确定配对关系。例如配对关系。例如: : if if( ) if if( ) 语句语句1 1 elseelse 语句语句2 23.3.3 3.3.3 条件语句(条件语句(if if 语句)语句)34 【案例案例3.113.11】求三个数的最大数。求三个数的最大数。 分析:假设所求的三个数用变量分析:假设所求的三个数用变量x, y, zx, y, z表示表示, ,三个数的最大数三个数的最大数用变量用变量mm表示。本题有很多种的求法与写法,下面列出其中几种,表示。本题有很多种的求法与写法,下面列出其中几种,请读者进行比较理解:请读者进行比较理解: 方法方法1 1:用单分