《【教学课件】第4章控制结构程序设计.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第4章控制结构程序设计.ppt(156页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章章控制结构程序设计控制结构程序设计2023/1/92023/1/91 1现实问题总是复杂的,面对各种需要解决现实问题总是复杂的,面对各种需要解决的问题,人们必须首先对各类问题进行分的问题,人们必须首先对各类问题进行分析,确定解决问题的方法和步骤即算法,析,确定解决问题的方法和步骤即算法,再借助具体编程语言编制好一组让计算机再借助具体编程语言编制好一组让计算机执行的指令(即程序),让计算机按人们执行的指令(即程序),让计算机按人们指定的步骤有效地工作。指定的步骤有效地工作。2023/1/92023/1/92 2根据算法,依据某种编程语言的语法规则根据算法,依据某种编程语言的语法规则编写计
2、算机执行的命令序列,就是程序设编写计算机执行的命令序列,就是程序设计。计。著名计算机科学家沃思(著名计算机科学家沃思(NikiklausWirth)提出了一个公式:)提出了一个公式:“数据结构算数据结构算法程序法程序”,即程序设计包括算法设计和数,即程序设计包括算法设计和数据存储。除此之外,还有结构化程序设计据存储。除此之外,还有结构化程序设计方法和计算机语言。方法和计算机语言。2023/1/92023/1/93 3问题的提出问题的提出闰年问题:闰年问题:一年一年12个月,共个月,共365天,这是我天,这是我们说得最多的。但事实上,每年不完全是们说得最多的。但事实上,每年不完全是365天。在中
3、国农历中有闰月的说法,而公天。在中国农历中有闰月的说法,而公历也有闰年的说法。一般情况下,历也有闰年的说法。一般情况下,2月是月是28天,而闰年时是天,而闰年时是29天,何年的天,何年的2月是月是29天呢,天呢,这就是闰年问题。编程判断一个年份是否这就是闰年问题。编程判断一个年份是否为闰年。为闰年。求根问题:编程求解一元二次方程的根。求根问题:编程求解一元二次方程的根。2023/1/92023/1/94 4本章内容本章内容l算法的基础知识算法的基础知识l大小写字母转换问题大小写字母转换问题顺序结构程序的概念顺序结构程序的概念字符数据的输入输出字符数据的输入输出l闰年问题闰年问题选择结构程序的概
4、念选择结构程序的概念if语句语句switch语句语句l统计多名学生成绩问题统计多名学生成绩问题循环结构程序的概念循环结构程序的概念自增自减运算符与逗号表达式自增自减运算符与逗号表达式while循环循环dowhile循环循环for循环循环嵌套循环嵌套循环l应用实例应用实例2023/1/92023/1/95 54.1算法的基础知识算法的基础知识算法是灵魂,是问题求解过程中的精确描算法是灵魂,是问题求解过程中的精确描述;数据结构是加工对象;语言是工具;述;数据结构是加工对象;语言是工具;编程需要采用合适的方法。编程需要采用合适的方法。算法:是对特定问题求解步骤的一种描述。算法:是对特定问题求解步骤的
5、一种描述。程序:是用具体的计算机语言来描述算法程序:是用具体的计算机语言来描述算法的代码,可以输入计算机并产生结果。的代码,可以输入计算机并产生结果。2023/1/92023/1/96 6常用算法常用算法 递推化算法递推化算法(牛顿迭代法、二分法、梯形法、穷举法等牛顿迭代法、二分法、梯形法、穷举法等);排序算法排序算法(选择法、冒泡法选择法、冒泡法);查找算法查找算法(顺序查找、折半查找顺序查找、折半查找);有序数列的插入、删除操作;有序数列的插入、删除操作;存储区的动态分配与释放,单向线性链表的建立、查找、存储区的动态分配与释放,单向线性链表的建立、查找、插入、删除操作;插入、删除操作;初等
6、数论问题求解的有关算法初等数论问题求解的有关算法(最大公约数、最小公倍数、最大公约数、最小公倍数、素数等素数等);递归算法递归算法(求最大公约数、阶乘等求最大公约数、阶乘等);字符串的处理字符串的处理(字符和字符串的插入、删除、字符串的连字符和字符串的插入、删除、字符串的连接、比较等接、比较等)。2023/1/92023/1/97 7算法的五个特性算法的五个特性 有穷性:对任何合法的输入值,算法中每个步骤由计算有穷性:对任何合法的输入值,算法中每个步骤由计算机执行的次数及时间都是有限的。机执行的次数及时间都是有限的。确定性:算法中每个步骤含义明确,无二义性。在任何确定性:算法中每个步骤含义明确
7、,无二义性。在任何条件下,相同的输入,必有相同的输出。条件下,相同的输入,必有相同的输出。可行性:算法中描述的操作都可通过有限次的基本运算可行性:算法中描述的操作都可通过有限次的基本运算来实现。来实现。输入:一个算法应具有零个或多个输入。输入:一个算法应具有零个或多个输入。(无输入情况:如求:无输入情况:如求:1*2*3*4*5)。输出:一个算法应具有一个或多个输入。输出:一个算法应具有一个或多个输入。2023/1/92023/1/98 8算法的设计目标算法的设计目标正确性:设计的算法应当满足具有输入、输出和加工处理等明确的无歧义正确性:设计的算法应当满足具有输入、输出和加工处理等明确的无歧义
8、 性的描述的具体问题的需求。验证正确性通常有性的描述的具体问题的需求。验证正确性通常有4 4个层次:个层次:程序不含语法错误;程序不含语法错误;程序对于几组输入数据能够得出满足规格说明要求的结果;程序对于几组输入数据能够得出满足规格说明要求的结果;程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据 能够得出满足规格说明要求的结果;能够得出满足规格说明要求的结果;程序对于一切合法的输入数据能够得出满足规格说明要求的结程序对于一切合法的输入数据能够得出满足规格说明要求的结 果。果。一般情况至少通过第一般情况至少通过第层的验证。层的验证。可读
9、性:算法主要是为了阅读与交流,其次才是机器执行。可读性好有助可读性:算法主要是为了阅读与交流,其次才是机器执行。可读性好有助 于人对算法的理解;难懂的程序易于隐藏较多错误,难以调试和于人对算法的理解;难懂的程序易于隐藏较多错误,难以调试和 修改。修改。健状性:当输入非法数据时,算法也能适当地做出反应或进行处理,而不健状性:当输入非法数据时,算法也能适当地做出反应或进行处理,而不 会产生莫名其妙的输出结果。会产生莫名其妙的输出结果。效率与低存储量的需求:主要指算法执行时的最长时间与所需的最大存储效率与低存储量的需求:主要指算法执行时的最长时间与所需的最大存储 空间。空间。2023/1/92023
10、/1/99 9算法的描述方法算法的描述方法自然语言自然语言流程图流程图N-S图图PAD图图伪代码伪代码2023/1/92023/1/91010用自然语言表示算法用自然语言表示算法自然语言就是人们日常使用的语言,可以自然语言就是人们日常使用的语言,可以是汉语、英语或其他语言。用自然语言表是汉语、英语或其他语言。用自然语言表示通俗易懂,但文字冗长,容易出现示通俗易懂,但文字冗长,容易出现“歧歧义性义性”。除了简单问题外,一般不用自然。除了简单问题外,一般不用自然语言描述算法。例如:语言描述算法。例如:2023/1/92023/1/91111【例【例4-1】输入三个数,然后输出其中最大】输入三个数,
11、然后输出其中最大的数。的数。(1)输入输入A,B,C。(2)若若AB,则,则MAX=A;否则;否则MAX=B。(3)若若CMAX,则,则MAX=C。(4)输出输出MAX,MAX即为最大数。即为最大数。2023/1/92023/1/91212例:用自然语言写出求例:用自然语言写出求 1-1/2+1/3-1/4+1/99-1/100的算法。的算法。(1 1)sign=1 /*sign=1 /*数值的符号数值的符号*/(2 2)sum=1 /*sum=1 /*累加和累加和*/(3 3)deno=2 /*deno=2 /*分母值分母值*/(4 4)sign=(-1)*signsign=(-1)*sig
12、n(5 5)term=sign*(1/deno)/*term=sign*(1/deno)/*某一项的值某一项的值*/(6 6)sum=sum+termsum=sum+term(7 7)deno=deno+1denojij输出输出maxmaxkmaxkmaxmax=imax=imax=jmax=jmax=kmax=k结束结束Y YN NY YN N2023/1/92023/1/92121流程图举例流程图举例用流程图表示出求用流程图表示出求用流程图表示出求用流程图表示出求的算法。的算法。开始1 =sign1 =sum2 =denoadeno+1 =deno(-1)*sign =signsign*(
13、1/deno)=termsum+term =sumdeno100NYab结束打印打印sumb2023/1/92023/1/92222算法的描述算法的描述N-S图图 既然用基本结构的顺序组合可以表示任何复杂的算法结构,那么,基本既然用基本结构的顺序组合可以表示任何复杂的算法结构,那么,基本结构之间的流程线就属多余的了。结构之间的流程线就属多余的了。19731973年美国两学者年美国两学者I.NassiI.Nassi和和B.ShneidermanB.Shneiderman提出了一种新的流程图形式,并以他们的名字命名为提出了一种新的流程图形式,并以他们的名字命名为NSNS结构结构化流程图。这种流程图
14、完全去掉了带箭头的流程线,全部算法写在一个矩形化流程图。这种流程图完全去掉了带箭头的流程线,全部算法写在一个矩形框内,在该框内还可以包括其他的从属于它的框,即由一些基本的框组成一框内,在该框内还可以包括其他的从属于它的框,即由一些基本的框组成一个大框。这种个大框。这种NSNS流程图十分适合结构化程序设计,因而很受欢迎。流程图十分适合结构化程序设计,因而很受欢迎。三种基本结构对应的三种基本结构对应的NSNS图符号图符号:A B当当p成立成立A直到直到p成立成立AAB成立成立不成立不成立p顺序结构顺序结构 选择结构选择结构 当当(while)型循环结构型循环结构 直到直到(until)型循环结构型
15、循环结构2023/1/92023/1/92323输入输入i i、j j、k k输出输出maxmaxY YY YN NN Nijijkmaxkmaxmax=imax=imax=jmax=jmax=kmax=k2023/1/92023/1/92424例例4-4用用NS图表示求素数的算法图表示求素数的算法 素数是指除了素数是指除了1和该数本身和该数本身之外,不能被其他任何整数整之外,不能被其他任何整数整除的数。除的数。实际上,若要判断一个正整实际上,若要判断一个正整数数m是否为素数,只要将是否为素数,只要将2到到 间的每一个整数去除间的每一个整数去除m,若有一,若有一个能整除个能整除m,则,则m不是
16、素数,若不是素数,若其间的所有整数都不能整除其间的所有整数都不能整除m,则则m为素数。为素数。读入读入mk=mi=2当当i km被被i整除整除真真假假用用break结束循环结束循环i=i+1i k+1真真假假输出输出:m”是素数是素数”输出输出:m”不不是素数是素数”m2023/1/92023/1/92525算法的描述算法的描述PAD图图AB顺序结构的PADWHILEAa)b)UNTILA循环结构的PAD选择结构的PADc)ABCDi1i2i3i4I=b)PABa)PAPADPAD(Problem Analysis DiagramProblem Analysis Diagram),是近年来在软
17、件开发中被广泛使用的),是近年来在软件开发中被广泛使用的一种算法的图形表示法,与前面介绍的流程图、一种算法的图形表示法,与前面介绍的流程图、N-SN-S图相比,流程图、图相比,流程图、N-SN-S图都是自上而下的顺序描述,而图都是自上而下的顺序描述,而PADPAD图除了自上而下以外,还有自左向右的图除了自上而下以外,还有自左向右的展开,所以,如果说流程图、展开,所以,如果说流程图、N-SN-S图是一维的算法描述的话,则图是一维的算法描述的话,则PADPAD图就是图就是二维的,它能展现算法的层次结构,更直观易懂。二维的,它能展现算法的层次结构,更直观易懂。PADPAD图表示的三种基本结构如下所示
18、:图表示的三种基本结构如下所示:2023/1/92023/1/92626例:求三个数的最大值的例:求三个数的最大值的PAD图图max=imax=imax=jmax=jmax=kmax=k输入输入i i、j j、k k输出输出maxmaxijijkmaxkmax2023/1/92023/1/92727算法的描述算法的描述伪代码伪代码 用流程图、用流程图、N-SN-S图、图、PADPAD图等描述算法,直观易懂,但绘制比较麻烦,在图等描述算法,直观易懂,但绘制比较麻烦,在设计一个算法时,可能要反复修改,而修改流程图是比较麻烦的,因此,流设计一个算法时,可能要反复修改,而修改流程图是比较麻烦的,因此,
19、流程图适合表示算法,但在设计算法过程中使用不是很理想。为了设计算法方程图适合表示算法,但在设计算法过程中使用不是很理想。为了设计算法方便,常使用伪代码工具。便,常使用伪代码工具。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。伪代码不用图形符号,书写方便,格式紧凑,便于向计算机语言算法过渡。伪代码不用图形符号,书写方便,格式紧凑,便于向计算机语言算法过渡。因此,实际中常用伪代码描述算法。因此,实际中常用伪代码描述算法。例:求三个数的最大值的伪代码算法描述如下:例:求三个数的最大值的伪代码算法描述如下:l定义三个变量定义
20、三个变量i i、j j、k k,用来存放三个数,定义变量,用来存放三个数,定义变量maxmax存放最大值;存放最大值;l输入三个变量的值;输入三个变量的值;lmax=imax=ij?i:jj?i:j;lmax=max=maxmax k?max:kk?max:k;l输出输出maxmax。2023/1/92023/1/92828例:用自然语言写出求例:用自然语言写出求 1-1/2+1/3-1/4+1/99-1/100的算法。的算法。(1 1)sign=1 /*sign=1 /*数值的符号数值的符号*/(2 2)sum=1 /*sum=1 /*累加和累加和*/(3 3)deno=2 /*deno=2
21、 /*分母值分母值*/(4 4)sign=(-1)*signsign=(-1)*sign(5 5)term=sign*(1/deno)/*term=sign*(1/deno)/*某一项的值某一项的值*/(6 6)sum=sum+termsum=sum+term(7 7)deno=deno+1deno=deno+1(8 8)若)若deno100deno100返回第返回第(4)(4)步,否则转第步,否则转第(9)(9)步步(9 9)输出)输出sumsum2023/1/92023/1/92929算法的描述算法的描述计算机语言计算机语言 用计算机语言表示算法实际上就是计算机程序。用计算机语言表示算法用
22、计算机语言表示算法实际上就是计算机程序。用计算机语言表示算法必须严格遵守所使用的语言的语法规则。必须严格遵守所使用的语言的语法规则。例:用例:用C C语言表示求三个数的最大值的算法如下:语言表示求三个数的最大值的算法如下:#include#include void main()void main()int i,j,k,max;/*int i,j,k,max;/*定义变量定义变量*/printf(i,j,k=?n);/*printf(i,j,k=?n);/*提示信息提示信息*/scanf(%4d%4d%4d,&i,&j,&k);/*scanf(%4d%4d%4d,&i,&j,&k);/*输入函数
23、输入函数*/max=ij?i:j;/*max=ij?i:j;/*求两数的最大值求两数的最大值*/max=maxk?max:k;max=maxk?max:k;printf(The maxmum value of the 3 data is%dn,max);/*printf(The maxmum value of the 3 data is%dn,max);/*输出输出*/2023/1/92023/1/93030在计算机中,有时不区分大小写字母,而在计算机中,有时不区分大小写字母,而且很多高级语言也不区分大小写字母,但且很多高级语言也不区分大小写字母,但是在程序中,如果需要判断字母是否一致是在程序
24、中,如果需要判断字母是否一致时,则必须使用一种标准,这时就必须将时,则必须使用一种标准,这时就必须将大写字母转换成小写字母,或将小写字母大写字母转换成小写字母,或将小写字母转换成大写字母。转换成大写字母。2023/1/92023/1/93131问题的提出问题的提出从键盘输入一个小写字母,要求在屏幕上从键盘输入一个小写字母,要求在屏幕上输出对应的大写字母。输出对应的大写字母。2023/1/92023/1/93232问题的分析问题的分析首先输入一个字母(可能是大写字母,也首先输入一个字母(可能是大写字母,也可能是小写字母);然后将输入的字母转可能是小写字母);然后将输入的字母转换成大写字母,从字母
25、的换成大写字母,从字母的ASCII码可知,大码可知,大写字母的写字母的ASCII码值比小写字母码值比小写字母ASCII码值码值小小32,因此,小写字母,因此,小写字母ASCII码值减码值减32就是就是大写字母;最后输出大写字母即可。大写字母;最后输出大写字母即可。这里涉及到字符数据的输入输出问题。这里涉及到字符数据的输入输出问题。2023/1/92023/1/93333回顾回顾#includevoidmain()chara,b;a=x;b=y;a=a-32;/*char与与int数据间可进行算术运算数据间可进行算术运算*/b=b-32;printf(%c,%cn%d,%dn,a,b,a,b);
26、2023/1/92023/1/93434如何从键盘输入字符呢如何从键盘输入字符呢?2023/1/92023/1/93535标准字符输出函数标准字符输出函数 格式:格式:putchar(c)putchar(c)、putch(c)putch(c)参数:参数参数:参数c c为字符常量、字符或整型变量、表达式为字符常量、字符或整型变量、表达式 功能:功能:把字符把字符c c输出到输出到标准输出设备标准输出设备(即即显示器显示器)上上 返回值:返回值:正常返回,为显示字符的代码值;若出错,返回为正常返回,为显示字符的代码值;若出错,返回为EOF(EOF(即即-1)-1)说明:说明:此函数只能输出单个字符
27、数据。此函数只能输出单个字符数据。参数参数c c可以是字符常量、转义字符、字符变量、整型常量、可以是字符常量、转义字符、字符变量、整型常量、整型变量。整型变量。从功能角度来看,从功能角度来看,printf()printf()函数使用函数使用%c%c完全可以代替完全可以代替putcharputchar()()函数和函数和putch()putch()函数。函数。putchar()putchar()函数和函数和putch()putch()函数的功能完全一样。函数的功能完全一样。该函数在该函数在stdio.hstdio.h中声明。中声明。2023/1/92023/1/93636标准字符输入函数标准字符
28、输入函数 格式:格式:getchar()、getch()、getche()功能:从标准的输入设备(如键盘)读一个字符功能:从标准的输入设备(如键盘)读一个字符 返回值:返回值:正常,返回读取的字符代码值;若出错,返回为正常,返回读取的字符代码值;若出错,返回为EOF(EOF(即即-1)-1)说明:说明:getchar()getchar()函数、函数、getch()getch()函数、函数、getche()getche()函数,都只能接受一个字符。函数,都只能接受一个字符。getchar()getchar()函数在输入一个或若干个字符后,必须以回车键结束,否则字函数在输入一个或若干个字符后,必须
29、以回车键结束,否则字符不被输入。但只有第一个字符被接受。并且在屏幕上回显全部输入的字符。符不被输入。但只有第一个字符被接受。并且在屏幕上回显全部输入的字符。getch()getch()和和getche()getche()函数在输入一个字符后,立即被函数接受,不用回车函数在输入一个字符后,立即被函数接受,不用回车键。使用键。使用getch()getch()接受字符时,屏幕上不回显原输入的字符。使用接受字符时,屏幕上不回显原输入的字符。使用getche()getche()接接受字符时,要显示原输入的字符。受字符时,要显示原输入的字符。利用回显和不回显的特点利用回显和不回显的特点,getch(),g
30、etch()和和getche()getche()这两个函数经常用于交互这两个函数经常用于交互输入的过程中完成暂停等功能。输入的过程中完成暂停等功能。从功能角度来看,从功能角度来看,scanf()scanf()函数使用函数使用%c%c完全可以代替完全可以代替getchar()getchar()、getch()getch()和和getche()getche()函数。函数。该函数在该函数在stdio.hstdio.h中声明。中声明。2023/1/92023/1/93737例例4-5问题的实现问题的实现/*LI4_5.c*/*LI4_5.c*/#include#include void main()v
31、oid main()char c1,c2;char c1,c2;c1=getchar();/*c1=getchar();/*输入小写字母输入小写字母*/printf(%c,%dn,c1,c1);printf(%c,%dn,c1,c1);c2=c1-32;/*c2=c1-32;/*转变为大写字母转变为大写字母*/printf(%c,%dn,c2,c2);/*printf(%c,%dn,c2,c2);/*输出输出*/输入字输入字符符不同数据之不同数据之间的运算间的运算同一数据不同一数据不同的输出方同的输出方式式2023/1/92023/1/93838顺序结构程序顺序结构程序通常的计算机程序总是由若
32、干条语句组成,通常的计算机程序总是由若干条语句组成,从执行方式上看,从第一条语句到最后一从执行方式上看,从第一条语句到最后一条语句完全按顺序执行,就是简单的顺序条语句完全按顺序执行,就是简单的顺序结构。前面我们所编写的程序都是顺序结结构。前面我们所编写的程序都是顺序结构程序。构程序。2023/1/92023/1/93939举一反三举一反三例例4-74-7:鸡兔同笼问题。已知鸡兔总头数为:鸡兔同笼问题。已知鸡兔总头数为H H,总脚数为,总脚数为F F,求鸡兔,求鸡兔各有多少只?各有多少只?【分析分析】设鸡有设鸡有x x只,兔有只,兔有y y只,则有方程成立:只,则有方程成立:x+y=H (1)x
33、+y=H (1)2x+4y=F (2)2x+4y=F (2)解上述解上述(1)(2)(1)(2)式方程组有解:式方程组有解:x=(4H-F)/2 x=(4H-F)/2 y=(F-2H)/2y=(F-2H)/2本例只需要输入总脚数本例只需要输入总脚数F F、总头数、总头数H H即可求出。需要用到即可求出。需要用到scanf()scanf()和和printfprintf()()库函数。库函数。2023/1/92023/1/94040例例4-74-7程序程序/*LI4_7.c*/*LI4_7.c*/#include#include void main(void)void main(void)int
34、H,F,x,y;int H,F,x,y;scanf(%d,%d,&H,&F);/*scanf(%d,%d,&H,&F);/*输入鸡兔总头数输入鸡兔总头数H H,总脚数,总脚数F*/F*/x=(4*H-F)/2;/*x=(4*H-F)/2;/*计算鸡的只数计算鸡的只数*/y=(F-2*H)/2;/*y=(F-2*H)/2;/*计算兔的只数计算兔的只数*/printf(chicken=%d,rabbit=%dn,x,y);/*printf(chicken=%d,rabbit=%dn,x,y);/*输出鸡兔只数输出鸡兔只数*/为什么没有用显示转换数为什么没有用显示转换数据,或据,或x=(4*H-F)
35、/2.0的形式?的形式?2023/1/92023/1/94141例例4-9:求:求ax2+bx+c=0方程的根方程的根x1=p+q x1=p+q,x2=p-qx2=p-q,x1=x1=-b+b-b+b2 2-4ac-4ac2a2ax2=x2=-b-b-b-b2 2-4ac-4ac2a2a令令2a2ap=p=-b-bb b2 2-4ac-4ac2a2aq=q=【分析分析】只要保证只要保证b*b-4*a*c大于等于大于等于0,该方程就有实根。,该方程就有实根。2023/1/92023/1/94242例4-9程序/*LI4_9.c*/#include#include void main()float
36、 a,b,c,disc,p,q,x1,x2;printf(Please enter the coefficients a,b,c:);scanf(%f%f%f,&a,&b,&c);/*输入输入a,b,c*/disc=b*b-4*a*c;/*计算判别式计算判别式*/p=-b/(2*a);q=sqrt(disc)/(2*a);x1=p+q;x2=p-q;/*计算方程的计算方程的2个根个根*/printf(x1=%fnx2=%fn,x1,x2);/*输出输出x1和和x2*/问题:如果问题:如果discdiscb*b-4*a*cb*b-4*a*c的值小于的值小于0 0呢?呢?2023/1/92023/
37、1/94343以上都是顺序结构程序。以上都是顺序结构程序。问题:问题:如果如果discb*b-4*a*c的值小于的值小于0呢?呢?如果要判断,那么要用到选择结构程序。如果要判断,那么要用到选择结构程序。2023/1/92023/1/94444选择结构程序选择结构程序若在程序执行过程当中,根据用户的输入若在程序执行过程当中,根据用户的输入或中间结果去执行若干不同的任务则为选或中间结果去执行若干不同的任务则为选择结构程序。择结构程序。C提供了一系列的分支语句来实现选择结构提供了一系列的分支语句来实现选择结构程序设计。程序设计。2023/1/92023/1/94545分支语句分支语句if语句语句if
38、-else语句语句if-elseif语句语句switch语句语句2023/1/92023/1/94646if语句语句“if(表达式表达式)语句语句”形式形式 语句格式的一般形式为:语句格式的一般形式为:if (表达式表达式)语句语句;注意:注意:ifif后面的后面的“表达式表达式”一般用于表示一个条一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等。达式、字符型表达式等。格式中的格式中的“语句语句”,可以只包含一个简单语句,也可以是复合语句。可以只包含一个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号如果是复
39、合语句,必须用一对花括号将语句括将语句括起来。如果只有一条语句,则可不用起来。如果只有一条语句,则可不用括起来。括起来。例:例:if(xy)printf(“%d”,x);语句语句表达式表达式ab真真(非非0)假假(0)语句语句真真假假表达式表达式语句功能:执行此语句时,先求表达语句功能:执行此语句时,先求表达式的值,若其值为式的值,若其值为“真真”,则执行语句;若,则执行语句;若其值为其值为“假假”,则在,则在ifif结构体内什么也不执结构体内什么也不执行。而程序直接去执行行。而程序直接去执行ifif语句后面的语句。语句后面的语句。2023/1/92023/1/94747例例4-9程序程序/*
40、LI4_9_1.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%f%f,&a,&b,&c);disc=b*b-4*a*c;if(disc=0)p=-b/(2*a);q=sqrt(disc)/(2*a);x1=p+q;x2=p-q;printf(x1=%fnx2=%fn,x1,x2);2023/1/92023/1/94848if()else语句语句语句格式的一般形式为:语句格式的一般形式为:if (表达式表达式)语句语句1;else 语句语句2;注意:注意:ifif后面的后面的“表达式表达式”一般用于表示一个条
41、一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等。达式、字符型表达式等。格式中的格式中的“语句语句”,可以只包含一个简单语句,也可以是复合语句。可以只包含一个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号如果是复合语句,必须用一对花括号将语句括将语句括起来。如果只有一条语句,则可不用起来。如果只有一条语句,则可不用括起来。括起来。语句语句1 语句语句2真真假假表达式表达式语句语句1语句语句2表达式表达式b真真(非非0)假假(0)语句功能:执行此语句时,先求表达式语句功能:执行此语句时,先求表达式的值,若其值
42、为的值,若其值为“真真”,则执行语句,则执行语句1 1;若其;若其值为值为“假假”,则执行语句,则执行语句2 2。最后程序跳出。最后程序跳出ifif语句执行后面的语句。语句执行后面的语句。例:例:if(xy)max=x;else max=y;2023/1/92023/1/94949例例4-9程序程序/*LI4_9_2.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%f%f,&a,&b,&c);disc=b*b-4*a*c;if(disc=0)p=-b/(2*a);q=sqrt(disc)/(2*a);x1=p
43、+q;x2=p-q;printf(x1=%fnx2=%fn,x1,x2);else printf(“no real root!”);2023/1/92023/1/95050if(表达式表达式)语句语句1;else语句语句2;由于语句由于语句1或语句或语句2可以是各种形式的语句,可以是各种形式的语句,当然也可以是分支语句,因此分支语句可当然也可以是分支语句,因此分支语句可以嵌套。以嵌套。2023/1/92023/1/95151例例4-9程序程序/*LI4_9_3.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%
44、f%f,&a,&b,&c);if(a!=0)disc=b*b-4*a*c;if(disc=0)p=-b/(2*a);q=sqrt(disc)/(2*a);if(disc=0)printf(“x1=x2=%fn”,x1=x2=p);else printf(x1=%fnx2=%fn,x1=p+q,x2=p-q);else printf(“no real root!”);else printf(“error.”);在语句在语句1嵌套嵌套2023/1/92023/1/95252例例4-9程序程序/*LI4_9_4.c*/#include#include void main()float a,b,c,d
45、isc,p,q,x1,x2;scanf(%f%f%f,&a,&b,&c);if(a=0)printf(“error.”);else disc=b*b-4*a*c;if(disc20|x-10)if(yx)printf(Good);elseprintf(Bad);对于上述情况,对于上述情况,C编译系统规定:编译系统规定:else语句语句与最近的一个与最近的一个if语句匹配。语句匹配。2023/1/92023/1/95454if()elseif语句语句 语句格式的一般语句格式的一般形式为:形式为:if (表达式表达式1)语句语句1;else if(表达式表达式2)语句语句2;else if(表达式
46、表达式3)语句语句3;else if(表达式表达式n)语句语句n;else 语句语句n+1;表达式表达式1表达式表达式2表达式表达式3表达式表达式n语句语句1语句语句2语句语句3语句语句n语句语句n+1 真真(非非0)假假(0)真真(非非0)假假(0)假假(0)假假(0)真真(非非0)真真(非非0)例:if(profit1000)index=0.4;else if(profit 800)index=0.3;else if(profit 600)index=0.2;else if(profit 400)index=0.1;else index=0;2023/1/92023/1/95555例例4-
47、9程序程序/*LI4_9_5.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%f%f,&a,&b,&c);if(a=0)printf(“error.”);else disc=b*b-4*a*c;if(disc0)printf(“no real root!”);else if(disc=0)printf(“x1=x2=%fn”,x1=x2=-b/(2*a);else p=-b/(2*a);q=sqrt(disc)/(2*a);printf(x1=%fnx2=%fn,x1=p+q,x2=p-q);2023/1/9
48、2023/1/95656if语句的嵌套语句的嵌套if(expr1)if(expr2)statement1 else statement2内嵌内嵌ifif(expr1)statement1else if(expr3)statement3 else statement4内嵌内嵌ifif(expr1)if(expr2)statement1else statement3 内嵌内嵌ifif(expr1)if(expr2)statement1 else statement2else if(expr3)statement3 else statement4内嵌内嵌if内嵌内嵌if 2023/1/92023/1
49、/95757if语句强调说明语句强调说明如:if(a=b&x=y)printf(“a=b,x=y”);if(3)printf(“OK”);if(a)printf(“%d”,a);uifif后面的表达式类型任意后面的表达式类型任意uif(!x)if(x=0)if(x)if(x!=0)u语句可以是复合语句语句可以是复合语句 例例 考虑下面程序的输出结果考虑下面程序的输出结果:#include void main()int x,y;scanf(“%d,%d”,&x,&y);if(xy)x=y;y=x;else x=x+1;y=y+1;printf(“%d,%dn”,x,y);Compile Erro
50、r!OK!2023/1/92023/1/958584.3闰年问题闰年问题一年一年1212个月,共个月,共365365天,这是我们说得最多的。但事实上,每年不完全是天,这是我们说得最多的。但事实上,每年不完全是365365天。在中国农历中有闰月的说法,而公历也有闰年的说法。一般情况下,天。在中国农历中有闰月的说法,而公历也有闰年的说法。一般情况下,2 2月月是是2828天,而闰年时是天,而闰年时是2929天,何年的天,何年的2 2月是月是2929天呢,这就是闰年问题。天呢,这就是闰年问题。例例4-104-10:编程判断一个年份是否为闰年。:编程判断一个年份是否为闰年。【分析分析】判断闰年的条件是