您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > C语言大学实用教程第2章讲稿
第2章程序灵魂—算法2.1算法的概念2.2简单算法举例2.3算法的特性2.4算法的表示2.5结构化程序设计方法程序:是计算机执行的一组有限操作序列的集合(描述)。一个程序应包括两个方面的内容:•对数据的描述:数据结构(datastructure)•对操作的描述:算法(algorithm)著名计算机科学家沃思提出一个公式:数据结构+算法=程序完整的程序设计应该是:数据结构+算法+程序设计方法+语言工具2.1算法的概念从事各种工作和活动,都必须事先想好进行的步骤,然后按部就班地进行,才能避免产生错乱。不要认为只有“计算”的问题才有算法。广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。对同一个问题,可以有不同的解题方法和步骤。方法有优劣之分。有的方法只需进行很少的步骤,而有些方法则需要较多的步骤。一般说,希望采用简单的和运算步骤少的方法。因此,为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。例1:求1×2×3×4×5。最原始的方法是:–步骤1:先求1×2,得到结果2。–步骤2:将步骤1得到的结果乘以3,得到结果6。–步骤3:将6乘以4,得24。–步骤4:将24乘以5,得120。这就是最后的结果。这样的算法虽然是正确的,但太繁琐。如果要求1×2×…×1000,则要写999个步骤,显然是不可取的。而且每次都直接使用上一步骤的数值结果,也不方便。应当找到一种通用的表示方法。2.2简单算法举例可以设两个变量,一个变量代表被乘数,一个变量代表乘数。不另设变量存放乘积结果,而直接将每一步骤的乘积放在被乘数变量中。今设p为被乘数,i为乘数。用循环算法来求结果。可以将算法改写如下:–S1:使p=1–S2:使i=2–S3:使p×i,乘积仍放在变量p中,可表示为p×i=p–S4:使i的值加1,即i+1=i–S5:如果i不大于5,返回重新执行步骤S3以及其后的步骤S4和S5;否则,算法结束。最后得到p的值就是5!的值。上面的S1,S2…代表步骤1,步骤2……S是step(步)的缩写。这是写算法的习惯用法。仔细分析这个算法,能得到预期的结果。显然这个算法比前面列出的算法简练。如果题目改为求1×3×5×7×9×11。算法只需作很少的改动即可:–S1:1=p–S2:3=i–S3:p×i=p–S4:i+2=i–S5:若i≤11,返回S3;否则,结束。例2:有50个学生,要求将他们之中成绩在80分以上者打印出来。用n表示学生学号,n1代表第一个学生学号,ni代表第i个学生学号。用g代表学生成绩,gi代表第i个学生成绩,算法可表示如下。–S1:1=I–S2:如果gi≥80,则打印ni和gi,否则不打印–S3:i+1=I–S4:如果i≤50,转S2,继续执行;否则,算法结束。本例中,变量i作为下标,用它来控制序号(第几个学生,第几个成绩)。当i超过50时,表示已对50个学生的成绩处理完毕,算法结束。例3:求1-1/2+1/3-1/4+…+1/99-1/100。算法可以表示如下:–S1:1=sign–S2:1=sum–S3:2=deno–S4:(-1)×sign=sign–S5:sign×(1/deno)=term–S6:sum+term=sum–S7:deno+1=deno–S8:若deno≤100返回S4;否则算法结束。算法(Algorithm):是对特定问题求解方法(步骤)的一种描述。一个算法应该具有以下特点:1有穷性一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。事实上,“有穷性”往往指“在合理的范围之内”。2确定性算法中的每一个步骤都应当是确定的(有确切的含义),而不应当是含糊的、模棱两可的(没有二义性)。2.3算法的特性3可行性一个算法是能行的。即算法描述的操作都可以通过已经实现的基本运算执行有限次来实现。4输入所谓输入是指在执行算法时需要从外界取得必要的信息。一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。一个算法也可以没有输入。5输出一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。算法的目的是为了求解,“解”就是输出。没有输出的算法是没有意义的。算法和程序是两个不同的概念。一个计算机程序是对一个算法使用某种程序设计语言的具体实现。算法必须可终止意味着不是所有的计算机程序都是算法。可以用不同的方法表示一个算法。常用的有自然语言、传统流程图、结构化流程图、伪代码、PAD图等。2.4.1用自然语言表示算法在2.2节中介绍的算法是用自然语言表示的。自然语言表示算法的特点:–用自然语言表示通俗易懂;–文字冗长,容易出现“歧义性”;–描述包含分支和循环的算法,不很方便。除很简单的问题外,一般不用自然语言描述算法。2.4算法的表示1基本流程图符号流程图是用一些图框表示各种操作。用图形表示算法,直观形象,易于理解。美国国家标准化协会ANSI(AmericanNationalStandardInstitute)规定了一些常用的流程图符号,如图2.1所示。2.4.2用流程图表示算法:开始或结束:输入或输出:处理框:连接点:流程线图2.1程序流程图的基本符号:判断框–在开始或结束框中分别写上开始(start)或结束(end),表明程序由此开始或结束;–在输入或输出框中写上要输入或输出的内容;–处理框中给出处理的内容;–棱形框用于对一个给定的条件进行判断,根据条件是否成立来决定如何执行以后的操作,通常是一个入口两个出口。用流程图表示的程序结构如图2.2所示。2程序基本结构的流程图⑴顺序结构:如图2.2(a)所示。⑵选择结构或称分支结构:如图2.2(b)、(c)所示。ABBYPNABPNY(a)顺序结构(b)简单分支结构(c)选择分支结构(d)当型循环APYNAPYN(e)直到型循环图2.2基本的程序流程图⑶循环结构。有两类循环结构:①当型(while型)循环结构如图2.2(d)。执行过程:当给定的条件p成立时,执行A框操作,执行完A后再判断条件p是否成立,如果仍然成立,再执行A框,如此反复,直到某一次p条件不成立为止,此时不执行A框,循环结束。②直到型(Until型)循环如图2.2(e)。执行过程:先执行A框操作,然后判断给定的条件p是否成立?如果条件p不成立,则再执行A,然后再对条件p作判断,如果p条件仍然不成立,又执行A……如此反复执行A,直到给定的条件p成立为止,此时不再执行A,循环结束。图2.3开始1=sun,sign2=deno(-1)*sign=signsign*(1/deno)=termsum+term=sumdeno+1=denodeno100YN结束例4:求1-1/2+1/3-1/4+…+1/99-1/100的程序框图如右图2.3所示。三种基本结构的共同特点是:①只有一个入口。②只有一个出口。注意,菱形判断框有两个出口,而选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。③结构内的每一部分都有机会被执行。对每一个框来说,都应有一条从入口到出口的路径通过它。④结构内不存在“死循环”(无终止的循环)。已经证明,由以上三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。实际上,基本结构不一定只限于上面三种,只要具有上述4个特点的都可以作为基本结构,P26的图2-22和图2-23可以看成是由三种基本结构派生的。人们可以自己定义基本结构,并由这些基本结构组成结构化程序。1973年,I.Nassi和B.Shneiderman提出了一种新的流程图形式。这种流程图中完全去掉了传统流程图中的箭头,全部算法写在一个矩形框中,该框中还可以包含有其它的从属框。用N-S图表示的程序结构如图2.4所示。2.4.3用N-S图表示算法AB(a)顺序结构(b)选择分支结构(c)当型循环(d)直到型循环P成立不成立ABA当P成立A直到P成立图2.4N-S图的基本图形例5:求1-1/2+1/3-1/4+…+1/99-1/100的N-S图如下图2.5所示。例6:判断一个正整数是否是素数的N-S图如右图2.6所示。图2.5N-S图1=sun,sign2=deno(-1)×sign=signsign*(1/deno)=termsum+term=sumdeno+1=denodeno100输出sum图2.6N-S图输入正整数n0=w,2=in/i的余数=r是r=0否1=wi+1=i直到isqrt(n)或w≠0是w=0否n是素数n不是素数用传统的流程图和N-S图表示算法,直观易懂,但画起来比较费事。因此,流程图适宜表示一个算法,但在设计算法过程中使用不是很理想。为了设计算法时方便,常用一种称为伪代码(pseudocode)的工具。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。它如同一篇文章,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑,也比较好懂,便于向计算机语言算法(即程序)过渡。2.4.4用伪代码表示算法例如,“打印x的绝对值”的算法用伪代码表示如下:IFxispositiveTHENprintxELSEprint–x也可以用汉字伪代码,如:若x为正打印x否则打印–x也可以中英文混用,如:IFx为正printxELSEprint–x即计算机语言中具有的语句关键字用英文表示,其他的可用汉字表示。总之,以便于书写和阅读为原则。用伪代码写算法并无固定的、严格的语法规则,只要把意思表达清楚,并且书写的格式要写成清晰易读的形式。一个结构化程序:用高级语言表示的结构化算法。用三种基本结构组成的程序必然是结构化的程序。–这种程序便于编写、便于阅读、便于修改和维护。–结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。用这种方法逐步分解,直到作者认为可以直接将各小段表达为文字语句为止。这种方法就叫做“自顶向下,逐步细化”。2.5结构化程序设计方法自顶向下,逐步细化方法的优点:–考虑周全,结构清晰,层次分明。作者容易写,读者容易看。–易于修改。如果发现某一部分中有一段内容不妥,需要修改,只需找出该部分修改有关段落即可,与其它部分无关。我们提倡用这种方法设计程序。这就是用工程的方法设计程序。模块设计的方法:模块化设计的思想实际上是一种“分而治之”的思想,把一个大任务分为若干个子任务,每一个子任务就相对简单了。–在拿到一个程序模块以后,根据程序模块的功能将它划分为若干个子模块,如果这些子模块的规模还嫌大,还再可以划分为更小的模块。这个过程采用自顶向下方法来实现。–子模块一般不超过50行。–划分子模块时应注意模块的独立性,即:使一个模块完成一项功能,耦合性愈少愈好。
本文标题:C语言大学实用教程第2章讲稿
链接地址:https://www.777doc.com/doc-3203217 .html