21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题市公开课一等奖省赛课获奖课件_第1页
21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题市公开课一等奖省赛课获奖课件_第2页
21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题市公开课一等奖省赛课获奖课件_第3页
21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题市公开课一等奖省赛课获奖课件_第4页
21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题市公开课一等奖省赛课获奖课件_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2.1算法概念2.2简单算法举例2.3算法特征2.4怎样表示一个算法2.5结构化程序设计方法习题第2章程序灵魂——算法21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第1页一个程序应包含以下两方面内容:(1)对数据描述。在程序中要指定数据类型和数据组织形式,即数据结构(datastructure)。(2)对操作描述。即操作步骤,也就是算法(algorithm)。数据是操作对象,操作目标是对数据进行加工处理,以得到期望结果。作为程序设计人员,必须认真考虑和设计数据结构和操作步骤(即算法)。所以,著名计算机科学家沃思(NikiklausWirth)提出一个公式数据结构+算法=程序21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第2页实际上,一个程序除了以上两个主要要素之外,还应该采取结构化程序设计方法进行程序设计,而且用某一个计算机语言表示。所以,能够这么表示:程序=算法+数据结构+程序设计方法+语言工具和环境也就是说,以上4个方面是一个程序设计人员所应具备知识。在设计一个程序时要综合利用这几方面知识。在这4个方面中,算法是灵魂,数据结构是加工对象,语言是工具,编程需要采取适当方法。算法是处理“做什么”和“怎么做”问题。程序中操作语句,实际上就是算法表达。显然,不了解算法就谈不上程序设计。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第3页我们目标是使读者经过学习本书,能够知道怎样编写一个C程序,而且能够编写出不太复杂C程序。书中将经过一些实例把以上4个方面知识结合起来,介绍怎样编写一个C程序。因为算法主要性,在本章中先介绍相关算法初步知识,方便为后面各章学习建立一定基础。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第4页2.1算法概念从事各种工作和活动,都必须事先想好进行步骤,然后按部就班地进行,才能防止产生错乱。不要认为只有“计算”问题才有算法。广义地说,为处理一个问题而采取方法和步骤,就称为“算法”。对同一个问题,能够有不一样解题方法和步骤。方法有优劣之分。有方法只需进行极少步骤,而有些方法则需要较多步骤。普通说,希望采取简单和运算步骤少方法。所以,为了有效地进行解题,不但需要确保算法正确,还要考虑算法质量,选择适当算法。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第5页本书所关心当然只限于计算机算法,即计算机能执行算法。计算机算法可分为两大类别:数值算法和非数值算法。数值运算目标是求数值解。非数值运算包含面十分广泛,最常见是用于事务管理领域。当前,计算机在非数值运算方面应用远远超出了在数值运算方面应用。因为数值运算有现成模型,能够利用数值分析方法,所以对数值运算算法研究比较深入,算法比较成熟。对各种数值运算都有比较成熟算法可供选取。人们经常把这些算法汇编成册(写成程序形式),或者将这些程序存放在磁盘或磁带上,供用户调用。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第6页而非数值运算种类繁多,要求各异,难以规范化,所以只对一些经典非数值运算算法(比如排序算法)作比较深入研究。其它非数值运算问题,往往需要使用者参考已经有类似算法重新设计处理特定问题专门算法。本书不可能罗列全部算法,只是想经过一些经典算法介绍,帮助读者了解怎样设计一个算法,推进读者举一反三。希望读者经过本章介绍例子了解怎样提出问题,怎样思索问题,怎样表示一个算法。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第7页2.2简单算法举例例2.1求1×2×3×4×5。能够用最原始方法进行。步骤1:先求1×2,得到结果2。步骤2:将步骤1得到乘积2再乘以3,得到结果6。步骤3:将6再乘以4,得24。步骤4:将24再乘以5,得120。这就是最终结果。这么算法即使是正确,但太繁琐。假如要求1×2×…×1000,则要写999个步骤,显然是不可取。而且每次都直接使用上一步骤数值结果(如2,6,24等),也不方便。应该找到一个通用表示方法。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第8页能够设两个变量,一个变量代表被乘数,一个变量代表乘数。不另设变量存放乘积结果,而直接将每一步骤乘积放在被乘数变量中。今设p为被乘数,i为乘数。用循环算法来求结果。能够将算法改写以下:S1:使p=1S2:使i=2S3:使p×i,乘积仍放在变量p中,可表示为p×i=>pS4:使i值加1,即i+1=>iS5:假如i小于5,返回重新执行步骤S3以及其后步骤S4和S5;不然,算法结束。最终得到p值就是5!值。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第9页上面S1,S2…代表步骤1,步骤2……S是step(步)缩写。这是写算法习惯使用方法。请读者仔细分析这个算法,能否得到预期结果。显然这个算法比前面列出算法简练。假如题目改为求1×3×5×7×9×11。算法只需作极少改动即可:S1:1=>pS2:3=>iS3:p×i=>pS4:i+2=>iS5:若i≤11,返回S3;不然,结束。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第10页能够看出,用这种方法表示算法含有通用性、灵活性。S3到S5组成一个循环,在实现算法时,要重复屡次执行S3、S4、S5等步骤,直到某一时刻,执行S5步骤时经过判断,乘数i已超出要求数值而不返回S3步骤为止。此时算法结束,变量p值就是所求结果。因为计算机是高速进行运算自动机器,实现循环是轻而易举,全部计算机高级语言中都有实现循环语句。所以,上述算法不但是正确,而且是计算机能实现很好算法。请读者仔细分析循环结束条件,即S5步骤。假如在求1×2×…×11时,将S5步骤写成S5:若i<11,返回S3。这么会有什么问题?会得到什么结果?21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第11页例2.2有50个学生,要求将他们之中成绩在80分以上者打印出来。用n表示学生学号,n1代表第一个学生学号,ni代表第i个学生学号。用g代表学生成绩,gi代表第i个学生成绩,算法可表示以下。S1:1=>iS2:假如gi≥80,则打印ni和gi,不然不打印S3:i+1=>iS4:假如i≤50,返回S2,继续执行;不然,算法结束。本例中,变量i作为下标,用它来控制序号(第几个学生,第几个成绩)。当i超出50时,表示已对50个学生成绩处理完成,算法结束。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第12页例2.3判定2000—25中每一年是否闰年,将结果输出。闰年条件是:①能被4整除,但不能被100整除年份都是闰年,如1996年,年是闰年;②能被100整除,又能被400整除年份是闰年。如16、是闰年。不符合这两个条件年份不是闰年。算法可表示以下:设y为被检测年份。可采取以下步骤:S1:2000=>yS2:y不能被4整除,则输出y“不是闰年”。然后转到S621算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第13页S3:若y能被4整除,不能被100整除,则输出y“是闰年”。然后转到S6S4:若y能被100整除,又能被400整除,输出y“是闰年”;不然输出“不是闰年”。然后转到S6S5:输出y“不是闰年”S6:y+1=>yS7:当y≤2500时,转S2继续执行,如y>2500,算法停顿。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第14页在这个算法中,采取了屡次判断。先判断y能否被4整除,如不能,则y必定不是闰年。如y能被4整除,并不能马上决定它是否闰年,还要看它能否被100整除。如不能被100整除,则必定是闰年(比如1996年)。如能被100整除,还不能判断它是否闰年,还要被400整除,假如能被400整除,则它是闰年,不然不是闰年。在这个算法中,每做一步,都分别分离出一些范围(巳能判定为闰年或非闰年),逐步缩小范围,使被判断范围愈来愈小,直至执行S5时,只可能是非闰年。见图2.1示意。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第15页图2.121算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第16页从图2.1能够看出:“其它”这一部分,包含能被4整除,又能被100整除,而不能被400整除那些年份(如19),是非闰年。在考虑算法时,应该仔细分析所需判断条件,怎样一步一步缩小被判断范围。有问题,判断先后次序是无所谓,而有问题,判断条件先后次序是不能任意颠倒,读者可依据详细问题决定其逻辑。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第17页例2.4求1-1/2+1/3-1/4+…+1/99-1/100。算法能够表示以下:S1:1=>signS2:1=>sumS3:2=>denoS4:(-1)×sign=>signS5:sign×(1/deno)=>termS6:sum+term=>sumS7:deno+1=>denoS8:若deno≤100返回S4;不然算法结束。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第18页在步骤S1中先预设sign(代表级数中各项符号,它值为1或-1)。在步骤S2中使sum等于1,相当于已将级数中第一项放到了sum中。在步骤S3中使分母值为2。在步骤S4中使sign值变为-1。在步骤S5中求出级数中第2项值-1/2。在步骤S6中将刚才求出第二项值-1/2累加到sum中。至此,sum值是1-1/2。在步骤S7中使分母deno值加1(变成3)。执行S8步骤,因为deno≤100,故返回S4步骤,sign值改为1,在S5中求出term值为1/3,在S6中将1/3累加到sum中。然后S7再使分母变为4。按此规律重复执行S4到S8步骤,直到分母大于100为止。一共执行了99次循环,向sum累加入了99个分数。sum最终值就是级数值。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第19页例2.5对一个大于或等于3正整数,判断它是不是一个素数。所谓素数,是指除了1和该数本身之外,不能被其它任何整数整除数。比如,13是素数,因为它不能被2,3,4,…,12整除。判断一个数n(n≥3)是否素数方法是很简单:将n作为被除数,将2到(n-1)各个整数轮番作为除数,假如都不能被整除,则n为素数。算法能够表示以下:S1:输入n值S2:2=>i(i作为除数)S3:n被i除,得余数r21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第20页S4:假如r=0,表示n能被i整除,则打印n“不是素数”,算法结束;不然执行S5S5:i+1=>iS6:假如i≤n-1,返回S3;不然打印n“是素数”,然后结束。实际上n无须被2到(n-1)整数除,只需被2到n开方间整数除即可,甚至只需被2到n之间整数除即可。比如,判断13是否素数,只需将13被2、3除即可,如都除不尽,n必为素数。S6步骤可改为:S6:假如i≤n,返回S2;不然算法结束。经过以上几个例子,能够初步了解怎样设计一个算法。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第21页2.3算法特征一个算法应该含有以下特点:1.有穷性一个算法应包含有限操作步骤,而不能是无限。实际上,“有穷性”往往指“在合理范围之内”。终究什么算“合理程度”,并无严格标准,由人们常识和需要而定。2.确定性算法中每一个步骤都应该是确定,而不应该是含糊、模棱两可。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第22页3.有零个或多个输入所谓输入是指在执行算法时需要从外界取得必要信息。一个算法也能够没有输入。4.有一个或多个输出算法目标是为了求解,“解”就是输出。没有输出算法是没有意义。5.有效性算法中每一个步骤都应该能有效地执行,并得到确定结果。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第23页对于不熟悉计算机程序设计人来说,他们能够只使用他人已设计好现成算法,只需依据算法要求给以必要输入,就能得到输出结果。对他们来说,算法如同一个“黑箱子”一样,他们能够不了解“黑箱子”中结构,只是从外部特征上了解算法作用,即可方便地使用算法。比如,对一个“输入3个数,求其中最大值”算法,能够用图2.2表示,只要输入a,b,c3个数,执行算法后就能得到其中最大数。但对于程序设计人员来说,必须会设计算法,而且依据算法编写程序。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第24页图2.221算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第25页2.4怎样表示一个算法为了表示一个算法,能够用不一样方法。惯用有自然语言、传统流程图、结构化流程图、伪代码、PAD图等。2.4.1用自然语言表示算法在2.2节中介绍算法是用自然语言表示。用自然语言表示通俗易懂,但文字冗长,轻易出现“歧义性”。自然语言表示含义往往不太严格,要依据上下文才能判断其正确含义。另外,用自然语言描述包含分支和循环算法,不很方便(如例2.5算法)。所以,除了很简单问题以外,普通不用自然语言描述算法。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第26页2.4.2用流程图表示算法流程图是用一些图框表示各种操作。用图形表示算法,直观形象,易于了解。美国国家标准化协会ANSI(AmericanNationalStandardInstitute)要求了一些惯用流程图符号(见图2.3)。图2.3中菱形框作用是对一个给定条件进行判断,依据给定条件是否成立来决定怎样执行其后操作。它有一个入口,两个出口。见图2.4。连接点(小圆圈)是用于将画在不一样地方流程线连接起来。如图2.5中有两个以○为标志连接点(在连接点圈中写上“1”),它表示这两个点是相互连接在一起。实际上它们是同一个点,只是画不下才分开来画。用连接点,能够防止流程线交叉或过长,使流程图清楚。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第27页图2.321算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第28页图2.4图2.521算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第29页下面对2.2节中所举几个算法例子,改用流程图表示。例2.6将例2.1求5!算法用流程图表示,流程图见图2.6。菱形框两侧“Y”和“N”代表“是”(yes)和“否”(no)。假如需要将最终结果打印出来,能够在菱形框下面再加一个输出框,见图2.7。例2.7将例2.2算法用流程图表示。将50名学生中成绩在80分以上者学号和成绩打印出来,见图2.8。在此算法中没有包含输入50个学生数据部分,假如包含这个输入数据部分,流程图如图2.9所表示。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第30页图2.6图2.7图2.821算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第31页例2.8将例2.3判定闰年算法用流程图表示。见图2.10。显然,用图2.10表示算法要比用文字描述算法逻辑清楚、易于了解。请读者考虑,假如例2.3所表示算法中,S2步骤内没有最终“转到S6”这一句话,而只是 S2:若y不能被4整除,则打印y“不是闰年”这么就意味着执行完S2步骤后,不论S2执行情况怎样都应执行S3步骤。请读者画出对应流程图。请思索这么算法在逻辑上有什么错误,从流程图上是很轻易发觉其错误。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第32页图2.9图2.1021算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第33页例2.9将例2.4算法用流程图表示。见图2.11。例2.10将例2.5判断素数算法用流程图表示,见图2.12。一个流程图包含以下几部分:①表示对应操作框;②带箭头流程线;③框内外必要文字说明。需要提醒是流程线不要忘记画箭头,因为它是反应流程执行先后次序。用流程图表示算法直观形象,比较清楚地显示出各个框之间逻辑关系。不过这种流程图占用篇幅较多,尤其当算法比较复杂时,画流程图既费时又不方便。在结构化程序设计方法推广之后,许多书刊已用N-S结构化流程图代替这种传统流程图。不过每一个程序编制人员都应该熟练掌握传统流程图。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第34页图2.11图2.1221算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第35页2.4.3三种基本结构和改进流程图1.传统流程图弊端传统流程图用流程线指出各框执行次序,对流程线使用没有严格限制。所以,使用者能够不受限制地使流程随意地转来转去,使流程图变得毫无规律。这种情况如图2.13所表示。这种算法难以阅读,也难以修改,从而使算法可靠性和可维护性难以确保。假如我们写出算法能限制流程无规律任意转向,阅读起来就很方便。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第36页图2.1321算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第37页不过,算法上难免会包含一些分支和循环,而不可能全部由一个一个框次序组成。比如图2.6到图2.12都不是由各框次序进行,都包含一些流程向前或向后非次序转向。为了处理这个问题,人们构想,要求出几个基本结构,然后由这些基本结构按一定规律组成一个算法结构(如同用一些基本预制构件来搭成房屋一样),整个算法结构是由上而下地将各个基本结构次序排列起来。假如能做到这一点,算法质量就能得到确保和提升。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第38页2.三种基本结构1966年,Bohra和Jacopini提出了以下三种基本结构,作为表示一个良好算法基本单元。(1)次序结构,如图2.14所表示,虚线框内是一个次序结构。(2)选择结构,或称选取结构,或称分支结构,如图2.15所表示。请注意,不论p条件是否成立,只能执行A框或B框之一,不可能既执行A框又执行B框。不论走哪一条路径,在执行完A或B之后,都经过b点,然后脱离本选择结构。A或B两个框中能够有一个是空,即不执行任何操作,如图2.16所表示。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第39页图2.14图2.15图2.1621算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第40页(3)循环结构,它又称重复结构。有两类循环结构:①当型(While型)循环结构见图2.17(a)。它功效是当给定条件p1成立时,执行A框操作,执行完A后,再判断条件p1是否成立,假如依然成立,再执行A框,如此重复执行A框,直到某一次p1条件不成立为止,此时不执行A框,而从b点脱离循环结构。②直到型(Until型)循环见图2.17(b)。它功效是先执行A框,然后判断给定p2条件是否成立,假如p2条件不成立,则再执行A,然后再对p2条件作判断,假如p2条件依然不成立,又执行A……如此重复执行A,直到给定p2条件成立为止,此时不再执行A,从b点脱离本循环结构。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第41页图2.18是当型循环应用例子,图2.19是直到型循环应用例子。图2.17图2.18图2.1921算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第42页图2.18和图2.19作用都是打印5个数:1,2,3,4,5。能够看到,对同一个问题既能够用当型循环来处理,也能够用直到型循环来处理。以上三种基本结构,有以下共同特点:(1)只有一个入口。(2)只有一个出口。请注意,一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框出口和选择结构出口混同。(3)结构内每一部分都有机会被执行到。对每一个框来说,都应有一条从入口到出口路径经过它。图2.20中没有一条从入口到出口路径经过A框。(4)结构内不存在“死循环”(无终止循环)。图2.21就是一个死循环。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第43页图2.20图2.21已经证实,由以上三种基本结构次序组成算法结构,能够处理任何复杂问题。由基本结构所组成算法属于“结构化”算法,它不存在无规律转向,只在本基本结构内才允许存在分支和向前或向后跳转。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第44页其实,基本结构不一定只限于上面三种,只要含有上述4个特点都能够作为基本结构。人们能够自己定义基本结构,并由这些基本结构组成结构化程序。比如,能够将图2.22和图2.23这么结构定义为基本结构。图2.23所表示是一个多分支选择结构,依据给定表示式值决定执行哪一个框。图2.22和图2.23虚线框内结构也是一个入口和一个出口,而且有上述全部4个特点。由它们组成算法结构也是结构化算法。不过,能够认为像图2.22和图2.23那样结构是由三种基本结构派生出来。所以,人们都普遍认为最基本是本节介绍三种基本结构。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第45页图2.22图2.2321算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第46页2.4.4用N-S流程图表示算法既然用基本结构次序组合能够表示任何复杂算法结构,那么基本结构之间流程线就属多出了。1973年美国学者I.Nassi和B.Shneiderman提出了一个新流程图形式。在这种流程图中,完全去掉了带箭头流程线。全部算法写在一个矩形框内,在该框内还能够包含其它隶属于它框,或者说,由一些基本框组成一个大框。这种流程图又称N-S结构化流程图。这种流程图适于结构化程序设计,因而很受欢迎。N-S流程图用以下流程图符号:(1)次序结构:用图2.24形式表示。A和B两个框组成一个次序结构。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第47页(2)选择结构:用图2.25表示。它与图2.15对应。当p条件成立时执行A操作,p不成立则执行B操作。请注意图2.25是一个整体,代表一个基本结构。图2.24图2.2521算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第48页(3)循环结构:当型循环结构用图2.26形式表示。图2.26表示当p1条件成立时重复执行A操作,直到p1条件不成立为止。直到型循环结构用图2.27形式表示。用以上3种N-S流程图中基本框,能够组成复杂N-S流程图,以表示算法。应该说明,在图2.24、图2.25、图2.26、图2.27中A框或B框,能够是一个简单操作(如读入数据或打印输出等),也能够是3个基本结构之一。比如,图2.24所表示次序结构,其中A框能够又是一个选择结构,B框能够又是一个循环结构。如图2.28所表示那样,由A和B这两个基本结构组成一个次序结构。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第49页图2.26图2.27图2.2821算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第50页经过下面几个例子,读者能够了解怎样用N-S流程图表示算法。例2.11将例2.1求5!算法用N-S图表示。见图2.29,它和图2.7对应。例2.12将例2.2算法用N-S图表示。将50名学生中成绩高于80分学号和成绩打印出来。见图2.30和图2.31,它们与图2.8和图2.9对应。例2.13将例2.3判定闰年算法用N-S图表示。见图2.32,它和图2.10对应。例2.14将例2.4算法用N-S图表示。见图2.33,它和图2.11对应,只是最终加了一个“打印sum”框。例2.15将例2.5判别素数算法用N-S流程图表示。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第51页图2.29图2.30图2.3121算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第52页图2.32图2.3321算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第53页由图2.12能够看出,这个流程图不是由三种基本结构组成。图中间那个循环部分,有两个出口(一个从第二个菱形框下面出口,另一个在第一个菱形框右边出口),不符合基本结构特点。因为不能分解为三种基本结构,就无法直接用N-S流程图三种基本结构符号来表示。所以,应该先对图2.12做必要变换。要将第一个菱形框(“r=0”)两个出口汇合在一点,以处理两个出口问题。当r=0时不直接输出n“不是素数”,而只设一个标志值(变量w),它初始状态为w=0。当r=0时(表示n为非素数)使w变成1。假如r≠0则保持w=0。w作用如同一个开关,有两个工作情况:w=0和w=1。w=1表示n为非素数。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第54页假如最终w=0,则表示n为素数。然后将“1=>w”框出口线改为指向第二个菱形框,同时将第二个菱形框中条件改为“i≤n和w=0”,即只有当“i≤n”和“w=0”两个条件都满足时才继续执行循环。假如出现i>n或w≠0之一,都不会继续执行循环(见图2.34)。假如在某一次r=0,则应执行1=>w,然后,由第二个菱形框判断为“条件不成立”,接着执行图下部选择结构。此时,w≠0,表示n不是素数,应打印出n不是素数信息。假如w=0,则表示在上面每次循环中,n都不能被每一个i整除,所以n是素数,故输出n是素数信息。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第55页图2.34已由三种基本结构组成,能够用N-S图表示此算法,见图2.35。注意图2.34直到型循环判断条件为:“直到i>n或w≠0”,即只要“i>n或w≠0”之一成立,就不再继续执行循环。对此务请读者搞清楚。经过以上例子,能够看出用N-S图表示算法优点。它比文字描述直观、形象、易于了解;比传统流程图紧凑易画,尤其是它废除了流程线,整个算法结构是由各个基本结构按次序组成。N-S流程图中上下次序就是执行时次序,即图中位置在上面先执行,位置在下面后执行。写算法和看算法只需从上到下进行就能够了,十分方便。用N-S图表示算法都是结构化算法(它不可能出现流程无规律跳转,而只能自上而下地次序执行)。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第56页图2.34图2.3521算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第57页归纳起来可知,一个结构化算法是由一些基本结构次序组成;每个基本结构又能够包含其它基本结构;在基本结构之间不存在向前或向后跳转,流程转移只存在于一个基本结构范围之内(如循环中流程跳转);一个非结构化算法(如图2.12)能够用一个等价结构化算法(如图2.35)代替,其功效不变。假如一个算法不能分解为若干个基本结构,则它必定不是一个结构化算法。N-S图如同一个多层盒子,又称盒图(boxdiagram)。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第58页2.4.5用伪代码表示算法用传统流程图和N-S图表示算法,直观易懂,但画起来比较费事。所以,流程图适宜表示一个算法,但在设计算法过程中使用不是很理想。为了设计算法时方便,惯用一个称为伪代码(pseudocode)工具。伪代码是用介于自然语言和计算机语言之间文字和符号来描述算法。它如同一篇文章,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,所以书写方便、格式紧凑,也比很好懂,便于向计算机语言算法(即程序)过渡。比如,“打印x绝对值”算法能够用伪代码表示以下:21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第59页IFxispositiveTHEN printxELSE print–x它像一个英语句子一样好懂,在国外用得比较普遍。也能够用汉字伪代码,如:若x为正 打印x不然 打印–x也能够中英文混用,如:IFx为正 printxELSE print–x21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第60页即计算机语言中含有语句关键字用英文表示,其它可用汉字表示。总之,方便于书写和阅读为标准。用伪代码写算法并无固定、严格语法规则,只要把意思表示清楚,而且书写格式要写成清楚易读形式。将例2.1到例2.5算法用伪代码表示以下。例2.16求5!。用伪代码表示算法以下:开始 置t初值为1 置i初值为2 当i<=5,执行下面操作: 使t=t×i 使i=i+1 (循环体到此结束)21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第61页 打印t值结束也能够写成以下形式:BEGIN(算法开始) 1=>t 2=>i whilei<=5 {t×i=>t i+1=>i} printtEND(算法结束)在本算法中采取当型循环(第3行到笫5行是一个当型循环)。while意思为“当”,它表示当i<=5时执行循环体(大括弧中两行)操作。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第62页例2.17打印出50个学生中成绩高于80分者学号和成绩。用伪代码表示算法以下:BEGIN(算法开始) 1=>i whilei<=50 {inputniandgi i+1=>i} 1=>i whilei<=50 {ifgi≥80printniandgi i+1=>i}END(算法结束)例2.18打印2000—25中每一年是否闰年。用伪代码表示算法以下:21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第63页BEGIN(算法开始)=>ywhiley<=2500{ify被4整除ify不被100整除 printy;“是闰年” else ify被400整除 printy;“闰年” else printy;“非闰年”endifendifelseprinty;“非闰年”endify+1=>y}END(算法结束)21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第64页例2.19求1-1/2+1/3-1/4+…+1/99-1/100。用伪代码表示算法以下:BEGIN(算法开始) 1=>sum 2=>deno 1=>sign whiledeno<=100 {(-1)×sign=>sign sign×1/deno=>term sum+term=>sum deno+1=>deno } printsumEND(算法结束)21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第65页从以上例子能够看到:伪代码书写格式比较自由,轻易表示出设计者思想。同时,用伪代码写算法很轻易修改。用伪代码很轻易写出结构化算法。比如上面几个例子都是结构化算法。不过用伪代码写算法不如流程图直观,可能会出现逻辑上错误(比如循环或选择结构范围搞错等)。以上介绍了惯用表示算法几个方法,在程序设计中读者能够依据需要和习惯任意选取。软件专业人员普通习惯使用伪代码,考虑到国内广大初学人员情况,为便于了解,本书在以后各章中主要采取形象化N-S图表示算法。不过,读者对其它方法也应有所了解,方便在阅读其它书刊时不致发生困难。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第66页2.4.6用计算机语言表示算法要完成一件工作,包含设计算法和实现算法两个部分。设计算法目标是为了实现算法。所以,不但要考虑怎样设计一个算法,也要考虑怎样实现一个算法。至今为止,我们只是描述算法,即用不一样形式表示操作步骤。而要得到运算结果,就必须实现算法。在例2.1、例2.6、例2.11和例2.16中用不一样形式表示了求5!算法,不过并没有真正求出5!值。实现算法方式可能不止一个。比如对例2.1表示算法能够用人工心算方式实现而得到结果,也能够用笔算或算盘、计算器求出结果,这就是实现算法。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第67页我们任务是用计算机解题,也就是要用计算机实现算法。计算机是无法识别流程图和伪代码。只有用计算机语言编写程序才能被计算机执行(当然还要经过编译成目标程序才能被计算机识别和执行)。所以,在用流程图或伪代码描述出一个算法后,还要将它转换成计算机语言程序。用计算机语言表示算法必须严格遵照所用语言语法规则,这是和伪代码不一样。我们将前面介绍过算法用C语言表示。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第68页例2.20将例2.16表示算法(求5!)用C语言表示。main(){inti,t;t=1;i=2;while(i<=5) {t=t*i; i=i+1; }printf("%d",t);}21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第69页例2.21将例2.19表示算法(求级数值)用C语言表示。main(){intsign=1;floatdeno=2.0,sum=1.0,term;while(deno<=100) {sign=-sign; term=sign/deno; sum=sum+term; deno=deno+1; }printf("%f",sum);}21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第70页在这里,不打算仔细介绍以上程序细节,读者只需大致看懂它即可。在以后各章中会详细介绍C语言相关使用规则。应该强调说明是,写出了C程序,依然只是描述了算法,并未实现算法,只有运行程序才是实现算法。应该说,用计算机语言表示算法是计算机能够执行算法。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第71页2.5结构化程序设计方法前面介绍了结构化算法和三种基本结构。一个结构化程序就是用高级语言表示结构化算法。用三种基本结构组成程序必定是结构化程序,这种程序便于编写、阅读、修改和维护。这就降低了程序犯错机会,提升了程序可靠性。结构化程序设计强调程序设计格调和程序结构规范化,提倡清楚结构。假如面临一个复杂问题,是难以一下子写出一个层次分明、结构清楚、算法正确程序。结构化程序设计方法基本思绪是,把一个复杂问题求解过程分阶段进行,每个阶段处理问题都控制在人们轻易了解和处理范围内。详细说,采取以下方法确保得到结构化程序。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第72页(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码。在接收一个任务后应怎样着手进行呢?有两种不一样方法:一个是自顶向下,逐步细化;一个是自下而上,逐步积累。以写文章为例来说明这个问题。有人胸有全局,先构想好整个文章分成哪几个部分,然后再深入考虑每一部分分成哪几节,每一节分成哪几段,每一段应包含什么内容,如图2.36示意。用这种方法逐步分解,直到作者认为能够直接将各小段表示为文字语句为止。这种方法就叫做“自顶向下,逐步细化”。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第73页图2.3621算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第74页另有些人写文章时不拟提要,如同写信一样提起笔就写,想到哪里就写到哪里,直到他认为把想写内容都写出来了为止。这种方法叫做“自下而上,逐步积累”。显然,用第一个方法考虑周全,结构清楚,层次分明,作者轻易写,读者轻易看。假如发觉某一部分中有一段内容不妥,需要修改,只需找出该部分,修改相关段落即可,与其它部分无关。我们提倡用这种方法设计程序。这就是用工程方法设计程序。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第75页我们应该掌握自顶向下、逐步细化设计方法。这种设计方法过程是将问题求解由抽象逐步详细化过程。比如图2.36所表示。用这种方法便于验证算法正确性,在向下一层展开之前应仔细检验本层设计是否正确,只有上一层是正确才能向下细化。假如每一层设计都没有问题,则整个算法就是正确。因为每一层向下细化时都不太复杂,所以轻易确保整个算法正确性。检验时也是由上而下逐层检验,这么做,思绪清楚,有条不紊地一步一步进行,既严谨又方便。举一个例子来说明这种方法应用。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第76页例2.22将1到1000之间素数打印出来。我们已在本章中讨论过判别素数方法,现在采取“筛法”来求素数表。所谓“筛法”指是“埃拉托色尼(Eratosthenes)筛法”。他是古希腊著名数学家。他采取方法是,在一张纸上写上1到1000全部整数,然后逐一判断它们是否素数,找出一个非素数,就把它挖掉,最终剩下就是素数,见图2.37。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950……图2.37详细做法以下:21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第77页(1)先将1挖掉(因为1不是素数)。(2)用2去除它后面各个数,把能被2整除数挖掉,即把2倍数挖掉。(3)用3去除它后面各数,把3倍数挖掉。(4)分别用4、5…各数作为除数去除这些数以后各数。这个过程一直进行到在除数后面数已全被挖掉为止。比如在图2.37中找1~50素数,要一直进行到除数为47为止。(实际上,能够简化,假如需要找1~n范围内素数表,只需进行到除数为n开方(取其整数)即可。比如对1~50,只需进行到将7(50开方)作为除数即可。)上面算法可表示为:21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第78页(1)挖去1;(2)用下一个未被挖去数p去除p后面各数,把p倍数挖掉;(3)检验p是否小于n整数部分(假如n=1000,则检验p<31?),假如是,则返回(2)继续执行,不然就结束;(4)纸上剩下数就是素数。解题基本思绪有了,但要变成计算机操作,还要做深入分析,如怎样判断一个数是否已被“挖掉”,怎样找出某一个数p倍数,怎样打印出未被挖掉数。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第79页用自顶向下逐步细化方法来处理这个问题,先进行“顶层设计”,见图2.38。也能够用流程图进行逐步细化。流程图2.39表示流程粗略情况,把要做三部分工作分别用A、B、C表示。图2.38图2.3921算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第80页这三部分还不够详细,要深入细化。A部分能够细化为图2.40。先输入n,然后将1输入给x1,2输入给x2,1000输入给x1000。B部分能够细化为图2.41。图2.40图2.4121算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第81页图2.41中B1与B2不能再分了。B1处理方法是:使x1=0,即哪个数不是素数,就使它等于0,以后把不等于零数打印出来就是所求素数表。B3中循环体内以D标志部分还要深入细化,对D细化为图2.42。图2.42中E部分还不够详细,再深入细化为图2.43。图2.43中F部分又细化为图2.44。因为首先要判断某一个xj是否已被挖掉,如已被挖掉则无须考虑被xi除。至此,已不能也不需要再分解了。再对图2.39中C部分进行细化,见图2.45。对图2.45中G部分进行细化,得图2.46。21算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第82页图2.42图2.43图2.44

图2.45图2.4621算法的概念22简单算法举例23算法的特性24怎样表示一个算法25结构化程序设计方法习题第83页至此,已将图2.39分解成为能用三种基本结构表示基本操作了。将以上这些图合起来得到总流程图,见图2.47。依据这个细化了流程图已经能够用任何高级语言编写出源程序了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论