【教学课件】第4章控制结构程序设计.ppt

上传人:小飞机 文档编号:5658807 上传时间:2023-08-06 格式:PPT 页数:156 大小:887KB
返回 下载 相关 举报
【教学课件】第4章控制结构程序设计.ppt_第1页
第1页 / 共156页
【教学课件】第4章控制结构程序设计.ppt_第2页
第2页 / 共156页
【教学课件】第4章控制结构程序设计.ppt_第3页
第3页 / 共156页
【教学课件】第4章控制结构程序设计.ppt_第4页
第4页 / 共156页
【教学课件】第4章控制结构程序设计.ppt_第5页
第5页 / 共156页
点击查看更多>>
资源描述

《【教学课件】第4章控制结构程序设计.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第4章控制结构程序设计.ppt(156页珍藏版)》请在三一办公上搜索。

1、第4章 控制结构程序设计,2023/8/6,2,现实问题总是复杂的,面对各种需要解决的问题,人们必须首先对各类问题进行分析,确定解决问题的方法和步骤即算法,再借助具体编程语言编制好一组让计算机执行的指令(即程序),让计算机按人们指定的步骤有效地工作。,2023/8/6,3,根据算法,依据某种编程语言的语法规则编写计算机执行的命令序列,就是程序设计。著名计算机科学家沃思(Nikiklaus Wirth)提出了一个公式:“数据结构算法程序”,即程序设计包括算法设计和数据存储。除此之外,还有结构化程序设计方法和计算机语言。,2023/8/6,4,问题的提出,闰年问题:一年12个月,共365天,这是我

2、们说得最多的。但事实上,每年不完全是365天。在中国农历中有闰月的说法,而公历也有闰年的说法。一般情况下,2月是28天,而闰年时是29天,何年的2月是29天呢,这就是闰年问题。编程判断一个年份是否为闰年。求根问题:编程求解一元二次方程的根。,2023/8/6,5,本章内容,算法的基础知识 大小写字母转换问题 顺序结构程序的概念 字符数据的输入输出闰年问题 选择结构程序的概念 if语句switch语句 统计多名学生成绩问题 循环结构程序的概念 自增自减运算符与逗号表达式while循环 dowhile循环 for循环 嵌套循环 应用实例,2023/8/6,6,4.1 算法的基础知识,算法是灵魂,是

3、问题求解过程中的精确描述;数据结构是加工对象;语言是工具;编程需要采用合适的方法。算法:是对特定问题求解步骤的一种描述。程序:是用具体的计算机语言来描述算法的代码,可以输入计算机并产生结果。,2023/8/6,7,常用算法,递推化算法(牛顿迭代法、二分法、梯形法、穷举法等);排序算法(选择法、冒泡法);查找算法(顺序查找、折半查找);有序数列的插入、删除操作;存储区的动态分配与释放,单向线性链表的建立、查找、插入、删除操作;初等数论问题求解的有关算法(最大公约数、最小公倍数、素数等);递归算法(求最大公约数、阶乘等);字符串的处理(字符和字符串的插入、删除、字符串的连接、比较等)。,2023/

4、8/6,8,算法的五个特性,有穷性:对任何合法的输入值,算法中每个步骤由计算机执行的次数及时间都是有限的。确定性:算法中每个步骤含义明确,无二义性。在任何条件下,相同的输入,必有相同的输出。可行性:算法中描述的操作都可通过有限次的基本运算来实现。输入:一个算法应具有零个或多个输入。(无输入情况:如求:1*2*3*4*5)。输出:一个算法应具有一个或多个输入。,2023/8/6,9,算法的设计目标,正确性:设计的算法应当满足具有输入、输出和加工处理等明确的无歧义 性的描述的具体问题的需求。验证正确性通常有4个层次:程序不含语法错误;程序对于几组输入数据能够得出满足规格说明要求的结果;程序对于精心

5、选择的典型、苛刻而带有刁难性的几组输入数据 能够得出满足规格说明要求的结果;程序对于一切合法的输入数据能够得出满足规格说明要求的结 果。一般情况至少通过第层的验证。可读性:算法主要是为了阅读与交流,其次才是机器执行。可读性好有助 于人对算法的理解;难懂的程序易于隐藏较多错误,难以调试和 修改。健状性:当输入非法数据时,算法也能适当地做出反应或进行处理,而不 会产生莫名其妙的输出结果。效率与低存储量的需求:主要指算法执行时的最长时间与所需的最大存储 空间。,2023/8/6,10,算法的描述方法,自然语言流程图N-S图PAD图伪代码,2023/8/6,11,用自然语言表示算法,自然语言就是人们日

6、常使用的语言,可以是汉语、英语或其他语言。用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性”。除了简单问题外,一般不用自然语言描述算法。例如:,2023/8/6,12,【例4-1】输入三个数,然后输出其中最大的数。(1)输入A,B,C。(2)若A B,则MAX=A;否则MAX=B。(3)若C MAX,则MAX=C。(4)输出MAX,MAX即为最大数。,2023/8/6,13,例:用自然语言写出求 1-1/2+1/3-1/4+1/99-1/100 的算法。,(1)sign=1/*数值的符号*/(2)sum=1/*累加和*/(3)deno=2/*分母值*/(4)sign=(-1)*sign(5

7、)term=sign*(1/deno)/*某一项的值*/(6)sum=sum+term(7)deno=deno+1(8)若deno100返回第(4)步,否则转第(9)步(9)输出sum,2023/8/6,14,算法的描述流程图,用流程图表示算法,形象直观,比较清楚地显示出各个框之间的逻辑关系,易于理解。但流程图占用篇幅较多,当算法较复杂时,画流程图既费时,又不方便。但必须掌握。美国国家标准化协会ANSI规定了一些常用的流程图符号,并已被世界各国程序工作者采用:,三种基本结构:,为了解决程序设计混乱的问题,1966年提出了三种基本结构:顺序结构、选择结构、循环结构,然后由这些基本结构按一定规律组

8、成一个算法结构,整个算法结构是由上而下将各个基本结构顺序排列起来的。使用这三种基本结构顺序组成的算法结构,可以解决任何复杂的问题,并且是“结构化”的算法。,2023/8/6,15,流程图顺序结构,顺序结构是程序设计中最简单的一种基本结构。如右图所示,形象地描述了一个最简单的顺序结构:图中虚线框内是一个顺序结构。其中A和B两个框是顺序执行的,即在执行完A框所指定的操作后,必然接着执行B框所指定的操作。,2023/8/6,16,流程图选择结构,选择结构(或称选取结构,或称分支结构):,如下图所示,虚线框内是一个选择结构。此结构必包括一个判断框,根据给定的条件p是否成立,而选择执行A框或B框。注意:

9、无论条件p是否成立,只能执行A框或B框之一,不可能既执行A框又执行B框。A或B两个框中可以有一个是空的,即该空框不执行任何操作。,2023/8/6,17,流程图当型循环结构,循环结构(或称重复结构):,循环结构即反复执行某一部分的操作,分为当型(while型)循环结构和直到型(until型)循环结构两类。,当型(while型)循环结构:如右图所示,虚线框内是一个while型结构。它的功能是当给定的条件p成立时,执行A框操作,执行完A后再判断条件p是否成立,如果仍然成立,再执行A框,如此反复执行A框,直到某一次p条件不成立为止,此时不执行A框,而是从b点脱离循环结构。,2023/8/6,18,流

10、程图直到型循环结构,直到型(until型)循环结构,如右图所示,虚线框内是一个until型结构。它的功能是先执行A框,然后判断给定的条件p是否成立,如果条件p成立,再执行A框,然后再对条件p作判断,如果条件p仍然成立,又执行A框,如此反复执行A框,直到某一次p条件不成立为止,此时不执行A框,而是从b点脱离本循环结构。,2023/8/6,19,三种基本结构的共同特点,只有一个入口只有一个出口结构内的每一部分都有机会执行到结构内不存在“死循环”(无终止的循环),2023/8/6,20,流程图其他结构,事实上,基本结构不一定只限于上面三种,只要具有上述基本结构的4个特点的结构都可以作为基本结构。人们

11、可以运用三种基本结构定义自己派生的基本结构,并由这些基本结构组成结构化程序。如下两图所示。C语言就是采用的这种派生基本结构。,根据表达式的值p进行选择,a,b,A,B,N,p1,p2,pn,a,2023/8/6,21,2023/8/6,22,流程图举例,用流程图表示出求,的算法。,2023/8/6,23,算法的描述N-S图,既然用基本结构的顺序组合可以表示任何复杂的算法结构,那么,基本结构之间的流程线就属多余的了。1973年美国两学者I.Nassi和B.Shneiderman提出了一种新的流程图形式,并以他们的名字命名为NS结构化流程图。这种流程图完全去掉了带箭头的流程线,全部算法写在一个矩形

12、框内,在该框内还可以包括其他的从属于它的框,即由一些基本的框组成一个大框。这种NS流程图十分适合结构化程序设计,因而很受欢迎。,三种基本结构对应的NS图符号:,顺序结构 选择结构 当(while)型循环结构 直到(until)型循环结构,2023/8/6,24,2023/8/6,25,例4-4 用NS图表示求素数的算法,素数是指除了1和该数本身之外,不能被其他任何整数整除的数。实际上,若要判断一个正整数m是否为素数,只要将2到 间的每一个整数去除m,若有一个能整除m,则m不是素数,若其间的所有整数都不能整除m,则m为素数。,2023/8/6,26,算法的描述PAD图,PAD(Problem A

13、nalysis Diagram),是近年来在软件开发中被广泛使用的一种算法的图形表示法,与前面介绍的流程图、N-S图相比,流程图、N-S图都是自上而下的顺序描述,而PAD图除了自上而下以外,还有自左向右的展开,所以,如果说流程图、N-S图是一维的算法描述的话,则PAD图就是二维的,它能展现算法的层次结构,更直观易懂。PAD图表示的三种基本结构如下所示:,2023/8/6,27,例:求三个数的最大值的PAD图,2023/8/6,28,算法的描述伪代码,用流程图、N-S图、PAD图等描述算法,直观易懂,但绘制比较麻烦,在设计一个算法时,可能要反复修改,而修改流程图是比较麻烦的,因此,流程图适合表示

14、算法,但在设计算法过程中使用不是很理想。为了设计算法方便,常使用伪代码工具。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。伪代码不用图形符号,书写方便,格式紧凑,便于向计算机语言算法过渡。因此,实际中常用伪代码描述算法。例:求三个数的最大值的伪代码算法描述如下:定义三个变量i、j、k,用来存放三个数,定义变量max存放最大值;输入三个变量的值;max=ij?i:j;max=maxk?max:k;输出max。,2023/8/6,29,例:用自然语言写出求 1-1/2+1/3-1/4+1/99-1/100 的算法。,(1)sign=1/*数值的符号*/(2)sum=1/*累加和*/

15、(3)deno=2/*分母值*/(4)sign=(-1)*sign(5)term=sign*(1/deno)/*某一项的值*/(6)sum=sum+term(7)deno=deno+1(8)若deno100返回第(4)步,否则转第(9)步(9)输出sum,2023/8/6,30,算法的描述计算机语言,用计算机语言表示算法实际上就是计算机程序。用计算机语言表示算法必须严格遵守所使用的语言的语法规则。例:用C语言表示求三个数的最大值的算法如下:#include void main()int i,j,k,max;/*定义变量*/printf(i,j,k=?n);/*提示信息*/scanf(%4d%4

16、d%4d,/*输出*/,2023/8/6,31,在计算机中,有时不区分大小写字母,而且很多高级语言也不区分大小写字母,但是在程序中,如果需要判断字母是否一致时,则必须使用一种标准,这时就必须将大写字母转换成小写字母,或将小写字母转换成大写字母。,2023/8/6,32,问题的提出,从键盘输入一个小写字母,要求在屏幕上输出对应的大写字母。,2023/8/6,33,问题的分析,首先输入一个字母(可能是大写字母,也可能是小写字母);然后将输入的字母转换成大写字母,从字母的ASCII码可知,大写字母的ASCII码值比小写字母ASCII码值小32,因此,小写字母ASCII码值减32就是大写字母;最后输出

17、大写字母即可。这里涉及到字符数据的输入输出问题。,2023/8/6,34,回顾,#include void main()char a,b;a=x;b=y;a=a-32;/*char与int数据间可进行算术运算*/b=b-32;printf(%c,%cn%d,%dn,a,b,a,b);,2023/8/6,35,如何从键盘输入字符呢?,2023/8/6,36,标准字符输出函数,格式:putchar(c)、putch(c)参数:参数c为字符常量、字符或整型变量、表达式 功能:把字符c输出到标准输出设备(即显示器)上 返回值:正常返回,为显示字符的代码值;若出错,返回为EOF(即-1),说明:此函数只

18、能输出单个字符数据。参数c可以是字符常量、转义字符、字符变量、整型常量、整型变量。从功能角度来看,printf()函数使用%c完全可以代替putchar()函数和putch()函数。putchar()函数和putch()函数的功能完全一样。该函数在stdio.h中声明。,2023/8/6,37,标准字符输入函数,格式:getchar()、getch()、getche()功能:从标准的输入设备(如键盘)读一个字符 返回值:正常,返回读取的字符代码值;若出错,返回为EOF(即-1),说明:getchar()函数、getch()函数、getche()函数,都只能接受一个字符。getchar()函数在

19、输入一个或若干个字符后,必须以回车键结束,否则字符不被输入。但只有第一个字符被接受。并且在屏幕上回显全部输入的字符。getch()和getche()函数在输入一个字符后,立即被函数接受,不用回车键。使用getch()接受字符时,屏幕上不回显原输入的字符。使用getche()接受字符时,要显示原输入的字符。利用回显和不回显的特点,getch()和getche()这两个函数经常用于交互输入的过程中完成暂停等功能。从功能角度来看,scanf()函数使用%c完全可以代替getchar()、getch()和getche()函数。该函数在stdio.h中声明。,2023/8/6,38,例4-5 问题的实现

20、,/*LI4_5.c*/#include void main()char c1,c2;c1=getchar();/*输入小写字母*/printf(%c,%dn,c1,c1);c2=c1-32;/*转变为大写字母*/printf(%c,%dn,c2,c2);/*输出*/,输入字符,不同数据之间的运算,同一数据不同的输出方式,2023/8/6,39,顺序结构程序,通常的计算机程序总是由若干条语句组成,从执行方式上看,从第一条语句到最后一条语句完全按顺序执行,就是简单的顺序结构。前面我们所编写的程序都是顺序结构程序。,2023/8/6,40,举一反三,例4-7:鸡兔同笼问题。已知鸡兔总头数为H,总脚

21、数为F,求鸡兔各有多少只?【分析】设鸡有x只,兔有y只,则有方程成立:x+y=H(1)2x+4y=F(2)解上述(1)(2)式方程组有解:x=(4H-F)/2 y=(F-2H)/2本例只需要输入总脚数F、总头数H即可求出。需要用到scanf()和printf()库函数。,2023/8/6,41,例4-7程序,/*LI4_7.c*/#include void main(void)int H,F,x,y;scanf(%d,%d,/*输出鸡兔只数*/,为什么没有用显示转换数据,或x=(4*H-F)/2.0的形式?,2023/8/6,42,例4-9:求ax2+bx+c=0方程的根,【分析】,只要保证b

22、*b-4*a*c大于等于0,该方程就有实根。,2023/8/6,43,例4-9程序,/*LI4_9.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;printf(Please enter the coefficients a,b,c:);scanf(%f%f%f,/*输出x1和x2*/,问题:如果discb*b-4*a*c的值小于0呢?,2023/8/6,44,以上都是顺序结构程序。问题:如果discb*b-4*a*c的值小于0呢?如果要判断,那么要用到选择结构程序。,2023/8/6,45,选择结构程序,若在程序执行过程当中

23、,根据用户的输入或中间结果去执行若干不同的任务则为选择结构程序。C提供了一系列的分支语句来实现选择结构程序设计。,2023/8/6,46,分支语句,if语句if-else语句if-else if语句switch语句,2023/8/6,47,if 语句,“if(表达式)语句”形式 语句格式的一般形式为:if(表达式)语句;,注意:if后面的“表达式”一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等。格式中的“语句”,可以只包含一个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号将语句括起来。如果只有一条语句,则可不用括起来。,例:if(xy)print

24、f(“%d”,x);,2023/8/6,48,例4-9程序,/*LI4_9_1.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%f%f,2023/8/6,49,if()else 语句,语句格式的一般形式为:if(表达式)语句1;else 语句2;,注意:if后面的“表达式”一般用于表示一个条件,它可以是关系表达式、逻辑表达式、算术表达式、字符型表达式等。格式中的“语句”,可以只包含一个简单语句,也可以是复合语句。如果是复合语句,必须用一对花括号将语句括起来。如果只有一条语句,则可不用括起来。,例:if(xy)

25、max=x;else max=y;,2023/8/6,50,例4-9程序,/*LI4_9_2.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%f%f,2023/8/6,51,if(表达式)语句1;else 语句2;由于语句1或语句2可以是各种形式的语句,当然也可以是分支语句,因此分支语句可以嵌套。,2023/8/6,52,例4-9程序,/*LI4_9_3.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%f%f,在语句1嵌套,

26、2023/8/6,53,例4-9程序,/*LI4_9_4.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%f%f,在语句2嵌套,2023/8/6,54,条件嵌套语句容易出错,其原因主要是不知道哪个if对应哪个else。例如:if(x20|xx)printf(Good);else printf(Bad);对于上述情况,C编译系统规定:else语句与最近的一个if语句匹配。,2023/8/6,55,if()else if 语句,语句格式的一般形式为:if(表达式1)语句1;else if(表达式2)语句2;els

27、e if(表达式3)语句3;else if(表达式n)语句n;else 语句n+1;,例: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/8/6,56,例4-9程序,/*LI4_9_5.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;scanf(%f%f%f,2023/8/6,57,if 语句的嵌套,2023/8/6,

28、58,if 语句强调说明,如:if(a=b,if后面的表达式类型任意,if(!x)if(x=0)if(x)if(x!=0)语句可以是复合语句,例 考虑下面程序的输出结果:#include void main()int x,y;scanf(“%d,%d”,Compile Error!,OK!,2023/8/6,59,4.3 闰年问题,一年12个月,共365天,这是我们说得最多的。但事实上,每年不完全是365天。在中国农历中有闰月的说法,而公历也有闰年的说法。一般情况下,2月是28天,而闰年时是29天,何年的2月是29天呢,这就是闰年问题。例4-10:编程判断一个年份是否为闰年。【分析】判断闰年的

29、条件是:能被4整除、但不能被100整除,或者能被400整除。整除的表示:x能被y整除,则余数为0,即x%y=0。因此,该问题需要逻辑判断,涉及逻辑表达式与关系表达式、求余运算符%、选择结构等知识。,2023/8/6,60,关系运算符及其表达式,关系运算符种类:=!=结合方向:自左向右优先级别:,例 ca+b/c(a+b)ab!=c/(ab)!=c a=bc/a=(bc),关系表达式的值:是逻辑值“真”或“假”,用1和0表示,例 int a=3,b=2,c=1,d,f;ab(ab)=c b+cb f=abc,/*表达式值1*/,/*表达式值1*/,/*表达式值0*/,/*d=1*/,/*f=0*

30、/,2023/8/6,61,关系运算符注意事项,例 若a=0;b=0.5;x=0.3;则 a=x=b的值为,0,例 5278在C中是允许的,值为,0,例 int i=1,j=7,a;a=i+(j%4!=0);则a=,2,例 a0 结果为 A100 结果为,1,0,2023/8/6,62,关系运算符注意事项,例 注意区分“=”与“=”int a=0,b=1;if(a=b)printf(“a equal to b”);else printf(“a not equal to b”);,例 应避免对实数作相等或不等的判断如 1.0/3.0*3.0=1.0 结果为可改写为:fabs(1.0/3.0*3.

31、0-1.0)1e-6,0,2023/8/6,63,例4-10 问题的实现,闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。(x能被y整除,则余数为0,即x%y=0),2023/8/6,64,例4-10 程序,/*LI4_10.c*/#include void main()int year,leap;printf(Please input the year:);scanf(%d,2023/8/6,65,技巧,在程序中设置状态标志值。如程序中的leap!,2023/8/6,66,例4-10的另解,#include void main()int y;scanf(%d,#includ

32、e void main()int y;scanf(%d,程序中用到了逻辑运算符,下面介绍之:,2023/8/6,67,逻辑运算符及其表达式,逻辑运算符种类:!&|逻辑运算真值表,a,b,!a,!b,a&b,a|b,C语言中,运算量:0表示“假”,非0表示“真”,运算结果:0表示“假”,1表示“真”,2023/8/6,68,逻辑运算符,例 ab&xy a=b|x=y!a|ab,优先级:,结合方向:,/*(a=x)&(x=b)*/,/*(ab)&(xy)*/,/*(a=b)|(x=y)*/,/*(!a)|(ab)*/,2023/8/6,69,逻辑运算符,优先级:,结合方向:,例 a=4;b=5;!

33、a a&b a|b!a|b 4&0|2 53&2|84-!0 c&d,值为1,值为0,值为1,值为1,值为1,值为1,/*(53)&2|(8(4-(!0)值为1*/,2023/8/6,70,逻辑运算的短路特性,短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符,2023/8/6,71,逻辑运算的短路特性,短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符,a,b,c,非0(真),非0(真),非0(真),0(假),0(假),0(假),1(真),0(假

34、),a&b&c执行过程,a,b,c,非0(真),非0(真),非0(真),0(假),0(假),0(假),1(真),0(假),a|b|c执行过程,2023/8/6,72,例4-12 求一元二次方程的根,【分析】在【例4-9】中已求解过一元二次方程的根,但未判断b*b-4*a*c的值,这里就是要完整解决判别式b*b-4*a*c的三种情况。当0时,有两个相等的实根。当0时,有两个不相等的实根。当0时,有两个虚根。,2023/8/6,73,例4-12程序,/*LI4_12.c*/#include#include void main()float a,b,c,disc,p,q,x1,x2;printf(P

35、lease enter the coefficients a,b,c:);/*打印提示信息*/scanf(%f,%f,%f,2023/8/6,74,一个月的天数问题,例4-13:从键盘任意输入年月,要求输出该月的天数。【分析】一年12个月,除了2月份以外,每月都是固定的天数。1、3、5、7、8、10、12月都是31天,4、6、9、11都是30天,而2月份的天数与是否闰年有关。闰年2月为29天,非闰年2月为28天。本例可以使用if()else if()结构完成,但一年有12种情况,这种结构的嵌套也比较复杂,我们可以使用一种新的方式来解决,这就是switch语句。,2023/8/6,75,swit

36、ch语句,switch语句是多分支选择语句,也称为开关语句。其一般格式为:switch(表达式)case 常量表达式1:语句组1;break;case 常量表达式2:语句组2;break;case 常量表达式n:语句组n;break;default:语句组n+1;,2023/8/6,76,switch语句注意事项,ifelse if和switch都可以实现多分支选择。ifelse if应用于多条件并列测试,从中取一的情形;switch应用于单条件测试,从其多个结果取一种的情形。break是退出开关语句,它用来中途退出switch语句的执行,往往在一个case执行完成后使用break退出swit

37、ch语句。而default后则可以不要break。break语句不能用于循环语句和switch语句之外的任何其它语句之中。“case 常量表达式:”只是起语句标号作用,并不是在该处进行条件判断。多个case可共用一组执行语句。case后可包含多条执行语句,并且不必加花括号。表达式和各常量表达式的类型应一致,并且各常量表达式的值应互不相同。switch允许嵌套、default子句可以没有。,2023/8/6,77,例4-13程序,/*LI4_13.c*/#include void main()int year,month,days;printf(Input year,month=);scanf(

38、%d,%d,case 2:/*闰年判断*/if(year%4=0,2023/8/6,78,举一反三,例4-15:将百分制成绩转换成等级制:059:不及格,6069:及格,7079:中,8089:良,90100:优。【分析】该问题是一个典型的多分支选择问题。对于多分支选择问题可以使用if-else if语句来解决,也可以用switch语句来解决。,2023/8/6,79,例4-15程序(if-else if语句),#include#include void main()int score;clrscr();/*清屏函数*/printf(Please input a score:);scanf(%

39、d,注:库函数clrscr()完成清屏功能,在conio.h中声明。,2023/8/6,80,例4-15程序(switch语句),/*LI4_15_2.c*/#include void main()int score;printf(Please input a score:);scanf(%d,2023/8/6,81,例:输出整数的各位数字问题,给一个不多于5位的正整数,要求:求它是几位数;分别打印出每一位数字;按逆序打印出各位数字。如:321,输出:123。,2023/8/6,82,输出整数的各位数字程序,#include void main()long num;int n1,n2,n3,n

40、4,n5,n;printf(“Input 099999:”);scanf(“%ld”,printf(“Every figure:”);n5=num/10000;n4=(num-n5*10000)/1000;n3=(num-n5*10000-n4*1000)/100;n2=(num-n5*10000-n4*1000-n3*100)/10;n1=(num-n5*10000-n4*1000-n3*100-n2*10);switch(n)case 5:printf(“%d,%d,%d,%d,%d”,n5,n4,n3,n2,n1);printf(“nAntitone figure:”);printf(“

41、%d%d%d%d%d”,n1,n2,n3,n4,n5);break;case 4:printf(“%d,%d,%d,%d”,n4,n3,n2,n1);printf(“nAntitone figure:”);printf(“%d%d%d%d”,n1,n2,n3,n4);break;,2023/8/6,83,输出整数的各位数字程序,case 3:printf(“%d,%d,%d”,n3,n2,n1);printf(“nAntitone figure:”);printf(“%d%d%d”,n1,n2,n3);break;case 2:printf(“%d,%d”,n2,n1);printf(“nAn

42、titone figure:”);printf(“%d%d”,n1,n2);break;case 1:printf(“%d”,n1);printf(“nAntitone figure:”);printf(“%d”,n1);break;,运行结果:Input 099999:123(回车)n=3Every figure:1,2,3Antitone figure:321注:输入数据123 位数为:3 每位数字为:1,2,3 逆序数字为:321,2023/8/6,84,例4-16 计算器程序,编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:操作数1 运算符op 操作数2然后,计算表达式的

43、值,指定的运算符为加(+)、减(-)、乘(*)、除(/),2023/8/6,85,例4-16程序,#include void main()int a,b,d;char c;printf(Please input a expression:);scanf(%d%c%d,2023/8/6,86,思考题,语句 if(b=0)的必要性1998年11月科学美国人杂志,描述了美国导弹巡洋舰约克敦号上的一起事故,除零错误导致了军舰推进系统的关闭如果要求程序能进行浮点数的算术运算,语句 if(b=0)还能用于比较实型变量b和常数0的大小吗?if(fabs(b)=1e-7)如果要求输入的算术表达式中的操作数和运

44、算符之间可以加入任意多个空格符,那么程序如何修改?scanf(%d%c%d,在输入的字符串中只读取1个字符赋给op变量,取绝对值函数,2023/8/6,87,例:switch嵌套,#include void main()int a=2,b=7,c=5;clrscr();/*清屏*/switch(a0)/*a0的值为:0 或 1*/case 1:switch(b);printf(n);,运行结果:&#,若将b值初值改为:b=-7;则:运行结果:#,2023/8/6,88,提出问题,求1+2+100。输出整数的各位数字问题。求平均成绩问题。用循环结构完成!,2023/8/6,89,4.4 统计多名

45、学生成绩问题,在我们整理教学文档时,有一个很重要的指标就是计算一个班的一门课程的平均成绩,然后再计算平均成绩以下(或以上)各有多少学生。各个班级为了评选优秀学生或奖学金评定,也要计算各门课程的平均成绩,这里我们就来解决这个问题。例4-17:已知一个班的一门课程的成绩,编程求学生该门课程的平均成绩。【分析】该问题首先要输入一个学生的多门课成绩,然后求平均成绩。多个学生的输入需要用到循环结构程序,而循环结构中又要使用自增自减运算符、逗号表达式等内容。如果在程序的某处,需要根据某项条件重复地执行某项任务若干次或直到满足或不满足某条件为止,这就构成循环结构。C语言提供了三种基本的循环语句:while语

46、句、do-while和for语句。,2023/8/6,90,自增自减运算符,自增、自减运算符+-作用:使变量值加1或减1种类:前置+i,-i(先执行i+1或i-1,再使用i值)后置 i+,i-(先使用i值,再执行i+1或i-1),例 j=3;k=+j;j=3;k=j+;j=3;printf(“%d”,+j);j=3;printf(“%d”,j+);a=3;b=5;c=(+a)*b;a=3;b=5;c=(a+)*b;,/*k=4,j=4*/,/*k=3,j=4*/,/*4*/,/*3*/,/*c=20,a=4*/,/*c=15,a=4*/,2023/8/6,91,自增自减运算符说明,说明:+-不

47、能用于常量和表达式,如5+,(a+b)+-结合方向:自右向左优先级:-+-*/%-+-(2)(3)(4),例-i+-(i+)i=3;printf(“%d”,-i+);/*-3*/,例-i+i=3;printf(“%d”,-i+);,2023/8/6,92,自增自减运算符举例,#include void main()int a=1,b=2,c,d,e;c=(-a+)+(+b);d=(b-)+(+a)+a;e=(a/(+b)-(b/(-a);printf(“c=%d,d=%d,e=%dn”,c,d,e);,运行结果:c=2,d=9,e=-1,2023/8/6,93,逗号表达式,形式:表达式1,表达

48、式2,表达式n结合性:从左向右优先级:15逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例 a=3*5,a*4 a=3*5,a*4,a+5例 x=(a=3,6*3)x=a=3,6*a例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);,/*a=15,表达式值60*/,/*a=15,表达式值20*/,/*赋值表达式,表达式值18,x=18*/,/*逗号表达式,表达式值18,x=3*/,/*1,2,3*/,/*3,2,3*/,2023/8/6,94,逗号表达式举例,形式:表达式1,表达式2,表达

49、式n结合性:从左向右优先级:15逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例:#include void main()int x,y=7;float z=4;x=(y=y+6,y/z);printf(x=%d,y=%dn,x,y);,运行结果:x=3,y=13,2023/8/6,95,while循环,while语句实现当型循环结构。其一般形式为:,while(表达式)循环体语句;,2023/8/6,96,while语句说明,格式中的表达式可以为算术表达式、关系表达式、逻辑表达式等。循环体可以是单独的一个语句,也可以是复合语句。复合语句必须用括起来,否则只执行到第一个分号处。

50、不要构成死循环。循环体内应有使循环趋向于结束的语句。结构“while(1)循环体语句;”为无限循环。while循环是在满足条件时执行的。若表达式的值一开始就为0,则循环体一次也不被执行。当表达式值为0或循环体内遇break、return、goto则退出循环。在while循环体内也允许空语句。如:while(c=getche()!=X0D);,2023/8/6,97,例4-23 求1到100的和,求:1+2+100。,#include void main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“sum=%d,sum);,2023/8/6

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号