C程序设计(第四版)第3章程序结构.ppt
《C程序设计(第四版)第3章程序结构.ppt》由会员分享,可在线阅读,更多相关《C程序设计(第四版)第3章程序结构.ppt(94页珍藏版)》请在三一办公上搜索。
1、第3章 程序结构,1.1 算 法1.2 顺序结构程序设计1.3 选择结构程序设计1.4 循环结构程序设计,3.1 算 法 怎样编写一个程序呢?一个程序应包括两个方面的内容:(1)对数据的描述。在程序中要指定数据的逻辑结构和存储结构,即数据结构。在C语言中,数据结构是以数据类型的形式体现的。(2)对操作的描述,即操作步骤,也就是算法。算法是为解决一个问题而采取的步骤和方法,是程序的灵魂。数据是操作的对象,操作的目的是对数据进行加工处理,以得到预期的结果。进行程序设计必须认真考虑和设计数据结构和算法,为此,著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式:数据结构+算法=程序 实
2、际上,一个程序除了数据结构和算法外,还必须使用一种计算机语言,并采用结构化程序设计方法来表示。因此,可以这样表示:程序=算法+数据结构+程序设计方法+语言工具和环境 鉴于算法对程序设计的重要性,本书对算法的概念和特性、算法的表示做一简单介绍。,3.1.1 算法的概念解决一个问题的步骤和方法称作算法。做任何事情都有一定的步骤和方法。例如,要上大学,先要报名、交报名费,按时参加考试,成绩合格收到录取通知书,到学校报到注册。这些步骤都是按顺序进行的,缺一不可,次序也不能颠倒。实际上做任何事情都必须先想好执行的步骤,然后按部就班地进行,才能避免错误。要完成一件任务,方法和步骤不一定是惟一的,乘火车从西
3、安到上海,可以乘直达车;也可以从西安到广州,再经杭州到上海。虽然都能到达目的地,但时间、费用有很大的差别。可见,算法有优劣之分。本书关心的只限于计算机算法,即计算机能执行的算法。例如求1+2+3+100,可以先求1+2,再加3,再加4,一直加到100,得到5050。也可以用简单一点的方法做:100+(99+1)+(98+2)+(51+49)+50=100+49*100+50=5050。计算机算法也有优劣之分,一般希望用简单的和步骤少的方法。为了有效地进行解题,不仅要保证算法正确,还要考虑算法的质量,选择合适的算法。,计算机算法可以分为两大类:数值运算算法和非数值运算算法。数值运算的目的是求解数
4、值,例如求方程式的根,求一个函数的定积分等。非数值运算包括的面十分广泛,最常见的是用于事务管理领域,例如图书检索,人事管理,科研项目管理等。由于数值运算有现成的模型,可以运用数值分析方法,因此对其算法研究比较深入和成熟。目前计算机在非数值运算方面的应用远远超过数值运算方面的应用。非数值运算种类繁多,罗列各种算法是不可能的,本书只对一些典型非数值运算算法(如排序)作较详细介绍,通过分析,理出思路,举一反三,在实际应用中提高。,如何设计一个算法呢?下面用几个例题简单说明。例3-1:计算1+2+3+4首先想到的是逐个相加:第一步:求出1+2得到3。第二步:将第一步得到的3加上3,得到6。第三步:将6
5、加上4,得到10。这是计算结果。这样的算法是正确的,但太繁琐。如果要求1+2+3+100,则要写99个步骤,显然是不可取的。能否找到一种通用的表示方法呢?可以设两个变量,一个变量代表和(m),一个变量代表加数(i),用循环算法表示如下:S1:初始和为0,令m=0。(S1代表第一步,S2代表第二步,下同)S2:加数为,令i=1。S3:和数加上加数,结果仍放在m中:m=m+i。S4:使加数加上1:i=i+1。S5:如果i不大于4,返回S3,继续执行S3,S4,S5;否则执行S6。S6:输出结果。现在改成计算1+2+3+100,只需修改S5:S5:如果i100,返回S3;否则执行S6。如果要计算1+
6、3+5+7+101,只需修改S4,S5:S4:i=i+2。S5:若i101,返回S3;否则执行S6。,可见,后一种方法表示算法,用计算机计算起来十分简单,具有通用性和灵活性。算法中S3到S5组成一个循环,实现算法时多次执行S3到S5,S5经过判断满足要求才返回S3,执行下一步输出结果。C语言有实现循环功能的语句,加上计算机的高速运算,实现这一算法是轻而易举的。,例3-2:判断一个正整数是不是素数。所谓素数是指除了1和该数本身之外,不能被其他任何整数整除的数,例如23是素数,因为它不能被2,3,4,21,22整除。判断素数的方法很简单,例如判断n(n1)是不是素数,只需将n作为被除数,将2到(n
7、-1)各个整数轮流作除数做除法运算,如果都不能被整除(余数不为0),则n是素数。算法表示如下:S1:输入n的值。S2:i作除数,i=2。S3:n除以i,得余数r。S4:如果r=0,表示n能被i整除,则打印n不是素数,转S7;否则执行S5。S5:i=i+1。S6:如果in-1,返回S3;否则打印n是素数,转S7。S7:结束。实际上,除数只需为2到n/2或者2到 2 间的整数即可。S6的条件改变一下,程序执行时间会大大缩短。,3.1.3 算法的特性通常算法有以下5个特性:1有穷性有穷性是指一个算法的操作步骤必须是有限的和合理的,即在合理的范围之内结束算法。例如求整数累加和的算法,由于整数本身是个无
8、限集合,如果不限定其范围,导致求解步骤是无限的。2确定性确定性是指算法中的每个操作步骤都应当是明确的,而不是含糊的、模棱两可的。在计算机算法中最忌讳的是歧义性,所谓“歧义性”是指可以被理解为两种或多种可能的含义。因为计算机没有主动思维的能力,如果给定条件不确定,计算机就无法执行。例如,“计算8月1日是一年中的第几天”,这个问题是不确定的,因为没有指明哪一年,不知道是不是闰年,闰年和平年2月份的天数不一样,所以无法执行。,3 有零个或多个输入执行算法时需要从外界获得必要信息的操作称为输入。输入的数据个数根据算法确定。例如计算1-100累加和的算法不需要输入;计算n!的算法需要输入n的值;计算m和
9、n的最大公约数和最小公倍数则需要输入m和n两个数的值。4 有一个或多个输出执行算法得到的结果就是算法的输出,没有输出的算法是没有意义的。最常见的输出形式是屏幕显示或打印机输出,但并非惟一的形式(后续章介绍文件操作时的文件输出)。执行算法的目的就是为了求解,“解”就是输出。5 有效性算法中的每一个步骤都应当有效地执行,并得到确定的结果.例如当b=0时,a/b是不能有效执行的。又例如,在C语言中,“a%b”中的a和b都必须是整型数据,否则也不能有效执行。,算法的表示设计算法时需要通过一定的方式方法来表示。常用的表示方法有自然语言描述、流程图、N-S图、伪代码和PAD图等。用自然语言表示算法自然语言
10、就是人们日常使用的语言,可以是汉语或英语。在前面介绍的算法就是用自然语言表示的。用自然语言表示算法通俗易懂,但文字冗长,逻辑上不严格,容易出现“歧义性”。例如“请同学们去买一本参考书”,这句话就很不严格,买什么样的参考书?作者是谁?条件都是不确定的。因此,除了很简单的问题外,一般不用自然语言描述算法。,2用流程图表示算法流程图是用一组框图符号表示各种操作,也称框图。用流程图表示算法直观形象,易于理解。美国国家标准化协会ANSI(American National Standard Institute)规定的一些常用流程图符号,已为各国程序工作者普遍采用,如图1-5所示。,起止框 输入输出框 判
11、断框 处理框 流程线 连接点,图3-1 常用流程图符号例3-3:1+2+3+4+100的流程图,见图3-2。例3-4:判断一个正整数是不是素数的流程图,见图3-3。例3-5:判定2000年至2800年中每一年是不是闰年的流程图,见图3-4。,图3-2 求1-100累加和的流程图 图3-3 判断素数的流程图,流程图是表示算法的好工具。一个流程图包括:表示相应操作的框;带箭头流程线;框内外必要的文字说明。用流程图表示算法直观、形象,比较清楚地显示出各个框之间的逻辑关系。但是这种表示方法占用篇幅较大,画起来也比较麻烦,难以阅读,难以修改。在1966年提出的结构化程序设计方法对传统流程图做了改进,后来
12、又提出了结构化程序设计的N-S图表示方法。3.用N-S图表示算法N-S图是美国学者I.Nassi和B.Shneiderman提出的一种新的流程图形式(N和S是两位学者的英文姓名的首字母)。在N-S图中完全去掉了流程线,全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,即由一些基本框组成一个大框。,图3-4 判断2000年-2800年中每一年是不是闰年的流程图,A B,条件成立 不成立A B,当条件成立,直到条件不成立,N-S图用图3-5所示的符号表示三种基本结构:,(A)顺序结构(B)选择结构(C)当型循环结构(D)直到型循环结构,图3-5 三种基本结构的N-S图符号,(1)图3
13、-5的(A)中,A和B两个框组成一个顺序结构。两个框是两个程序段,先执行完A框,再顺序执行B框。(2)图3-5的(B)是选择结构,当条件成立时执行A框内的操作;否则执行B框内的操作(B框内的操作可以为空)。注意:选择结构是一个整体,在一次执行过程中,只执行A框或B框中的一个,即要么执行A框,要么执行B框,不能一次执行A、B两个框。(3)循环结构分为当型循环和直到型循环两种:图3-5(C)为当型循环结构,当条件成立时反复执行A框内的操作(称为循环体),条件不成立时退出循环,向下执行。图3-5(D)为直到型循环结构,反复执行A框中的操作,直到条件不成立时结束(即条件成立时执行循环体)。,用上三种N
14、-S图的基本框,可以组成复杂的N-S图表示算法。应当说明,图3-5(A)中的A框或B框,可以是一个简单的操作(例如输入数据或打印输出),也可以是三个基本结构之一。例如统计一个班30名学生中及格人数的算法,可以用图3-6表示,下面的循环框可以看作顺序框的一部分。,前面【例3-3】计算1到100累加和,【例3-5】判断2000年到2800年间闰年的算法如图3-7,图3-8所示。用N-S图表示算法的优点。它比文字描述直观、形象、便于理解;比传统流程图紧凑易画,尤其是它废除了流程线,整个算法是由各个基本结构按顺序组成的。N-S图的上下顺序就是执行时的顺序,写算法和看算法都是从上到下,十分方便。用N-S
15、图表示的算法都是结构化算法,它由几种基本结构顺序组成,基本结构之间不存在跳转,流程的转移只存在于一个基本结构范围之内(如循环中流程的跳转)。4用伪代码表示算法用传统的流程图和N-S图表示算法直观、易懂,但画起来比较费事,修改起来更麻烦。所以这两种表示方法比较适合已设计好算法的情况,在设计算法时不很理想。为了设计算法时方便,常用一种称为伪代码(pseudo code)的方法。,图3-8 判断闰年的流程图,伪代码是用一种介于自然语言和计算机语言之间的文字和符号来描述算法。它如同写一篇文章,自上而下地每一行或几行表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑,比较好懂,便于向计算机语言算法
16、(即程序)过渡。例如,“打印x的绝对值”的算法用伪代码表示如下:如果x为正 打印x否则 打印-x或者用英文表示:IF x is positive THEN print xELSE print x也可以中英文混用:IF x 为正print xELSE print x,除以上几种算法表示外,还有PAD图表示法等。可以根据个人的爱好、习惯选用其中一种,对其他方法也应有所了解,便于阅读其他书刊时的理解。设计算法的目的是实现算法,要用计算机实现算法,必须是用计算机语言编写的程序。用计算机语言编写程序就是程序设计。C语言是结构化程序设计语言,编写C语言程序,要采用结构化程序设计方法。,3.2 顺序结构程序
17、设计 什么是结构化程序设计。什么是顺序结构。结构化程序是用高级语言表示的结构化算法。用三种基本结构组成的程序必然是结构化的程序,这种程序便于编写、阅读、修改和维护,保证程序的质量。顺序结构就是程序按照自顶向下的顺序执行语句。它是C语言的基本程序结构。一个结构化程序应符合以下标准:(1)程序由顺序结构、选择结构和循环结构等三种基本结构组成;(2)每种结构都只有一个入口和一个出口;(3)程序中没有死循环(不能结束的循环叫死循环)和死语句(程序中永远执行不到的语句叫死语句)。为了设计出一个结构化的程序,一般采用以下方法:(1)自顶向下,逐步求精;(2)模块化设计;(3)结构化编程。,所谓“自顶向下,
18、逐步求精”,就是拿到一个任务后,将问题的求解由抽象逐步具体化。就如同写文章一样,开始笼统而抽象,经过初步考虑,确定要说明几个问题,这就比开始具体了一些,确定文章大纲,还要再细分每个问题有几个论点,一步一步地细化,直到可以直接写出为止。这种方法便于检查算法的正确性,在上一层正确的情况下向下细分,如果每层都没有问题,整个算法就是正确的。由于每层细化时都相对比较简单,能保证算法的正确性。检查时也是由上向下逐层进行,思路清晰,既严谨又方便。所谓“模块化设计”是在接到一个任务后,根据要求和功能,采用自顶向下的方法,划分成若干个子模块,每个子模块完成单一功能。程序中的子模块,在C语言中通常用函数实现,每个
19、函数完成一个特定功能。例如高考录取程序中,可以把数据录入、求总成绩、分类排序等分别由不同函数实现。,3.2.1 C语言语句概述 前面已经介绍,一个程序包括数据描述(由说明部分实现)和数据操作。说明部分的内容一般不称为语句。例如:int a;习惯上称为说明语句,实际上是对变量进行定义,不产生机器操作。数据操作由语句实现,C语言的语句向计算机发出操作指令。语句不仅表达程序设计者所要达到的目标,也确定了达到这个目标所要经过的路径,就是程序执行的流向。C语言是面向过程的程序设计语言,只有掌握了控制流向,才能掌握程序运行的过程。从理论上讲,只要有顺序、选择和循环三种基本结构,就可以构成任意程序并完成相应
20、的工作。但是对于具体实现来说,无论是选择还是重复都要提供多种语句,其目的是方便用户的使用。在C语言中,选择主要是两种语句:if和switch,循环有三种语句:while,for和do-while。表3-1列出了C语言中所有的语句,表3-1 C语言的语句,3.2.2 赋值语句赋值语句是由赋值表达式加上分号构成的表达式语句,它的功能和特点都与赋值表达式相同,但形式不同。赋值语句一般形式为:变量=表达式;例如:Student_number=50;其含义是把数值50赋值给变量Student_number。使用赋值语句需要注意以下几点:(1)由于在赋值运算符“=”右边的表达式可以是一个赋值表达式,因此,
21、下述形式:变量=(变量=表达式);是成立的,从而形成嵌套赋值。按照赋值运算符的右结合性,展开之后的一般形式为:变量=变量=表达式;例如:a=b=c=5;等效于:c=5;b=c;a=b;,(2)注意赋值表达式和赋值语句的区别赋值表达式可以出现在任何允许表达式出现的地方,而赋值语句是一个语句(带分号),不等同于表达式。x=3+4 是赋值表达式。x=3+4;是赋值语句。给变量赋初值可以是变量定义的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。例如:int a=5,b=6,c=7;定义整型变量a,b,c,同时初始化。Int a,b,c;a=5;b=6;c=
22、7;先定义整型变量a,b,c,再用三个赋值语句对它们赋值。赋值表达式可以包括在其他表达式中,但是赋值语句不能出现在表达式中。例如:if(a=b)70)c=4.5;if语句的判断条件是表达式,这是正确的。如果写成:if(a=b;)70)c=4.5;是错误的。,(3)在定义变量时,不允许连续给多个变量赋初值。如下述说明是错误的:Int a=b=c=5;必须写为:a=5,b=5,c=5;赋值语句允许连续赋值:int a,b,c;a=b=c=5;,3.2.3 格式化输入/输出函数 所谓输入/输出是以内存为主体而言的。程序需要与用户进行交互,以便进行数据交流。每一种语言都有完备的输入、输出功能,语言没有
23、提供专门的输入/输出语句,所有的输入输出都是由调用库函数完成的,因此都是函数调用语句。不同的C编译系统以及C编译系统不同版本提供的C函数库不完全相同,因此其提供的输入/输出函数也不完全相同(包括函数名和函数调用参数)。不过一般都提供像printf和scanf等类标准函数,使用方法大体相同。在使用语言库函数中的输入、输出函数时,要用编译预处理的文件包含命令:#include“stdio.h”或#include 将有关的“头文件”stdio.h包含到用户源程序中。有关文件包含命令将在预处理章节介绍。,一、printf函数 程序运行结果一般用输出语句(函数调用语句)实现。printf函数称为格式化输
24、出函数,其功能是按用户指定的格式,把指定的数据输出到系统默认的输出设备上。1、printf函数的一般格式printf函数的一般格式为:printf(”格式字符串”,输出项1,输出项2,);在printf函数调用之后加上分号,就构成了输出语句。其中,格式字符串由普通字符、转义字符或输出格式说明构成,格式字符串要用双引号括起来。格式说明必须由“%”开头,后面跟一个类型字符。输出项可以是常量、变量、表达式或函数。看下面例题:,例3-7:格式输出示例。#include”stdio.h”main()int a=88,b=89;printf(”%d%dn”,a,b);printf(”%d,%dn”,a,b
25、);printf(”%c,%cn”,a,b);printf(”a=%d,b=%d”,a,b);,程序运行结果:88 8988,89X,Ya=88,b=89,本例中四次输出a,b的值,由于格式字符串不同,输出结果的形式也不相同。第四行的输出语句格式字符串中,格式说明%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式字符串中加入的是非格式字符逗号“,”作为普通字符,因此输出的a,b值之间加了一个逗号。第六行的格式串要求按字符型输出 a,b值。第七行为了提示输出结果又增加了非格式字符串“a=”和“b=”。2、printf函数中的格式说明 每个格式说明
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 第四 章程 结构
链接地址:https://www.31ppt.com/p-6503584.html