c程序第2章-算法.ppt
《c程序第2章-算法.ppt》由会员分享,可在线阅读,更多相关《c程序第2章-算法.ppt(92页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2.1算法的概念算法的概念2.2简单算法举例简单算法举例2.3算法的特性算法的特性2.4怎样表示一个算法怎样表示一个算法2.5结构化程序设计方法结构化程序设计方法习题习题第2章 程序的灵魂算法一个程序应包括以下两方面内容一个程序应包括以下两方面内容:(1)对数据的描述。在程序中要指定数据的类型和数对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构据的组织形式,即数据结构(data structure)。(2)对操作的描述。即操作步骤,对操作的描述。即操作步骤,也就是算法也就是算法(algorithm)。数据是操作的对象,操作的目的是对数据进行加工数据是操作的对象,操作的目的是对
2、数据进行加工处理,以得到期望的结果。作为程序设计人员,必处理,以得到期望的结果。作为程序设计人员,必须认真考虑和设计数据结构和操作步骤须认真考虑和设计数据结构和操作步骤(即算法即算法)。因此,著名计算机科学家沃思因此,著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式提出一个公式数据结构数据结构+算法算法=程序程序实际上,一个程序除了以上两个主要要素之外,还实际上,一个程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。因此,可以这样表示:用某一种计算机语言表示。因此,可以这样表示:程序
3、程序=算法算法+数据结构数据结构+程序设计方法程序设计方法+语言工具语言工具和环境和环境也就是说,以上也就是说,以上4个方面是一个程序设计人员所应具个方面是一个程序设计人员所应具备的知识。在设计一个程序时要综合运用这几方面备的知识。在设计一个程序时要综合运用这几方面的知识。在这的知识。在这4个方面中,算法是灵魂,数据结构个方面中,算法是灵魂,数据结构是加工对象,语言是工具,编程需要采用合适的方是加工对象,语言是工具,编程需要采用合适的方法。算法是解决法。算法是解决“做什么做什么”和和“怎么做怎么做”的问题。的问题。程序中的操作语句,实际上就是算法的体现。显然,程序中的操作语句,实际上就是算法的
4、体现。显然,不了解算法就谈不上程序设计。不了解算法就谈不上程序设计。我们的目的是使读者通过学习本书,能够知道怎样我们的目的是使读者通过学习本书,能够知道怎样编写一个编写一个C程序,并且能够编写出不太复杂的程序,并且能够编写出不太复杂的C程程序。书中将通过一些实例把以上序。书中将通过一些实例把以上4个方面的知识结个方面的知识结合起来,介绍如何编写一个合起来,介绍如何编写一个C程序。程序。由于算法的重要性,在本章中先介绍有关算法的初由于算法的重要性,在本章中先介绍有关算法的初步知识,以便为后面各章的学习建立一定的基础。步知识,以便为后面各章的学习建立一定的基础。2.1 算算 法法 的的 概概 念念
5、从事各种工作和活动,都必须事先想好进行的步骤,从事各种工作和活动,都必须事先想好进行的步骤,然后按部就班地进行,才能避免产生错乱。然后按部就班地进行,才能避免产生错乱。不要认为只有不要认为只有“计算计算”的问题才有算法。广义地说,的问题才有算法。广义地说,为解决一个问题而采取的方法和步骤,就称为为解决一个问题而采取的方法和步骤,就称为“算算法法”。对同一个问题,可以有不同的解题方法和步骤。方对同一个问题,可以有不同的解题方法和步骤。方法有优劣之分。有的方法只需进行很少的步骤,而法有优劣之分。有的方法只需进行很少的步骤,而有些方法则需要较多的步骤。一般说,希望采用简有些方法则需要较多的步骤。一般
6、说,希望采用简单的和运算步骤少的方法。因此单的和运算步骤少的方法。因此,为了有效地进,为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。质量,选择合适的算法。本书所关心的当然只限于计算机算法,即计算机能本书所关心的当然只限于计算机算法,即计算机能执行的算法。执行的算法。计算机算法可分为两大类别:数值算法和非数值算计算机算法可分为两大类别:数值算法和非数值算法。数值运算的目的是求数值解法。数值运算的目的是求数值解。非数值运算包。非数值运算包括的面十分广泛,最常见的是用于事务管理领域。括的面十分广泛,最常见的是用于事务管理领域
7、。目前,计算机在非数值运算方面的应用远远超过了目前,计算机在非数值运算方面的应用远远超过了在数值运算方面的应用。由于数值运算有现成的模在数值运算方面的应用。由于数值运算有现成的模型,可以运用数值分析方法,因此对数值运算的算型,可以运用数值分析方法,因此对数值运算的算法研究比较深入,算法比较成熟。对各种数值运算法研究比较深入,算法比较成熟。对各种数值运算都有比较成熟的算法可供选用。人们常常把这些算都有比较成熟的算法可供选用。人们常常把这些算法汇编成册法汇编成册(写成程序形式写成程序形式),或者将这些程序存放,或者将这些程序存放在磁盘或磁带上,供用户调用。在磁盘或磁带上,供用户调用。而非数值运算的
8、种类繁多,要求各异,难以规范化,而非数值运算的种类繁多,要求各异,难以规范化,因此只对一些典型的非数值运算算法因此只对一些典型的非数值运算算法(例如排序算例如排序算法法)作比较深入的研究。其他的非数值运算问题,作比较深入的研究。其他的非数值运算问题,往往需要使用者参考已有的类似算法重新设计解决往往需要使用者参考已有的类似算法重新设计解决特定问题的专门算法。特定问题的专门算法。本书不可能罗列所有算法,只是想通过一些典型算本书不可能罗列所有算法,只是想通过一些典型算法的介绍,帮助读者了解如何设计一个算法,推动法的介绍,帮助读者了解如何设计一个算法,推动读者举一反三。希望读者通过本章介绍的例子了解读
9、者举一反三。希望读者通过本章介绍的例子了解怎样提出问题,怎样思考问题,怎样表示一个算法。怎样提出问题,怎样思考问题,怎样表示一个算法。2.2 简单算法举例简单算法举例例例2.1 求求12345。可以用最原始的方法进行。可以用最原始的方法进行。步骤步骤1:先求先求12,得到结果,得到结果2。步骤步骤2:将步骤将步骤1得到的乘积得到的乘积2再乘以再乘以3,得到结果,得到结果6。步骤步骤3:将将6再乘以再乘以4,得,得24。步骤步骤4:将将24再乘以再乘以5,得,得120。这就是最后的结果。这就是最后的结果。这样的算法虽然是正确的,但太繁琐。如果要求这样的算法虽然是正确的,但太繁琐。如果要求1210
10、00,则要写,则要写999个步骤,显然是不可取个步骤,显然是不可取的。而且每次都直接使用上一步骤的数值结果的。而且每次都直接使用上一步骤的数值结果(如如2,6,24等等),也不方便。应当找到一种通用的表示,也不方便。应当找到一种通用的表示方法。方法。可以设两个变量,一个变量代表被乘数,一个变量可以设两个变量,一个变量代表被乘数,一个变量代表乘数。不另设变量存放乘积结果,而直接将每代表乘数。不另设变量存放乘积结果,而直接将每一步骤的乘积放在被乘数变量中。今设一步骤的乘积放在被乘数变量中。今设p为被乘数,为被乘数,i为乘数。用循环算法来求结果。可以将算法改写为乘数。用循环算法来求结果。可以将算法改
11、写如下:如下:S1:使使p=1S2:使使i=2S3:使使pi,乘积仍放在变量,乘积仍放在变量p中,可表示为中,可表示为pi=pS4:使使i的值加的值加1,即,即i+1=iS5:如果如果i不大于不大于5,返回重新执行步骤,返回重新执行步骤S3以及其后以及其后的步骤的步骤S4和和S5;否则,算法结束。最后得到;否则,算法结束。最后得到p的值的值就是就是5!的值。的值。上面的上面的S1,S2代表步骤代表步骤1,步骤,步骤2S是是step(步步)的缩写。这是写算法的习惯用法。的缩写。这是写算法的习惯用法。请读者仔细分析这个算法,能否得到预期的结果。请读者仔细分析这个算法,能否得到预期的结果。显然这个算
12、法比前面列出的算法简练。显然这个算法比前面列出的算法简练。如果题目改为求如果题目改为求1357911。算法只需作很少的改动即可:算法只需作很少的改动即可:S1:1=pS2:3=iS3:pi=pS4:i+2=iS5:若若i11,返回,返回S3;否则,结束。否则,结束。可以看出,用这种方法表示的算法具有通用性、灵可以看出,用这种方法表示的算法具有通用性、灵活性。活性。S3到到S5组成一个循环,在实现算法时,要组成一个循环,在实现算法时,要反复多次执行反复多次执行S3、S4、S5等步骤,直到某一时刻,等步骤,直到某一时刻,执行执行S5步骤时经过判断,乘数步骤时经过判断,乘数i已超过规定的数值已超过规
13、定的数值而不返回而不返回S3步骤为止。此时算法结束,变量步骤为止。此时算法结束,变量p的值的值就是所求结果。就是所求结果。由于计算机是高速进行运算的自动机器,实现循环由于计算机是高速进行运算的自动机器,实现循环是轻而易举的,所有计算机高级语言中都有实现循是轻而易举的,所有计算机高级语言中都有实现循环的语句。因此,上述算法不仅是正确的,而且是环的语句。因此,上述算法不仅是正确的,而且是计算机能实现的较好的算法。计算机能实现的较好的算法。请读者仔细分析循环结束的条件,即请读者仔细分析循环结束的条件,即S5步骤。如果步骤。如果在求在求1211时,将时,将S5步骤写成步骤写成S5:若若i11,返回,返
14、回S3。这样会有什么问题这样会有什么问题?会得到什么结果会得到什么结果?例例2.2 有有50个学生,要求将他们之中成绩在个学生,要求将他们之中成绩在80分以上分以上者打印出来。用者打印出来。用n表示学生学号,表示学生学号,n1代表第一个学代表第一个学生学号,生学号,ni代表第代表第i个学生学号。用个学生学号。用g代表学生成绩,代表学生成绩,gi代表第代表第i个学生成绩,算法可表示如下。个学生成绩,算法可表示如下。S1:1=iS2:如果:如果gi80,则打印,则打印ni和和gi,否则不打印,否则不打印S3:i+1=iS4:如果:如果i50,返回,返回S2,继续执行;否则,算法结,继续执行;否则,
15、算法结束。束。本例中,变量本例中,变量i作为下标,用它来控制序号作为下标,用它来控制序号(第几个学第几个学生,第几个成绩生,第几个成绩)。当。当i超过超过50时,表示已对时,表示已对50个学个学生的成绩处理完毕,算法结束。生的成绩处理完毕,算法结束。例例2.3 判定判定20002500年中的每一年是否闰年,将结年中的每一年是否闰年,将结果输出。果输出。闰年的条件是:闰年的条件是:能被能被4整除,但不能被整除,但不能被100整除的整除的年份都是闰年,如年份都是闰年,如1996年,年,2004年是闰年;年是闰年;能被能被100整除,又能被整除,又能被400整除的年份是闰年。如整除的年份是闰年。如1
16、600年、年、2000年是闰年。不符合这两个条件的年份不是闰年。年是闰年。不符合这两个条件的年份不是闰年。算法可表示如下:算法可表示如下:设设y 为被检测的年份。可采取以下步骤:为被检测的年份。可采取以下步骤:S1:2000=yS2:y不能被不能被4整除,则输出整除,则输出y“不是闰年不是闰年”。然后转。然后转到到S6S3:若:若y能被能被4整除,不能被整除,不能被100整除,则输出整除,则输出y“是闰是闰年年”。然后转到。然后转到S6S4:若:若y能被能被100整除,又能被整除,又能被400整除,输出整除,输出y“是闰是闰年年”;否则输出;否则输出“不是闰年不是闰年”。然后转到然后转到S6S
17、5:输出:输出y“不是闰年不是闰年”S6:y+1=yS7:当:当y2500时,转时,转S2继续执行,如继续执行,如y2500,算法,算法停止。停止。在这个算法中,采取了多次判断。先判断在这个算法中,采取了多次判断。先判断y能否被能否被4整除,如不能,则整除,如不能,则y必然不是闰年。如必然不是闰年。如y 能被能被4整除,整除,并不能马上决定它是否闰年,还要看它能否被并不能马上决定它是否闰年,还要看它能否被100整除。如不能被整除。如不能被100整除,则肯定是闰年整除,则肯定是闰年(例如例如1996年年)。如能被。如能被100整除,还不能判断它是否闰年,还整除,还不能判断它是否闰年,还要被要被4
18、00整除,如果能被整除,如果能被400整除,则它是闰年,否整除,则它是闰年,否则不是闰年。则不是闰年。在这个算法中,每做一步,都分别分离出一些范围在这个算法中,每做一步,都分别分离出一些范围(巳能判定为闰年或非闰年巳能判定为闰年或非闰年),逐步缩小范围,使被,逐步缩小范围,使被判断的范围愈来愈小,直至执行判断的范围愈来愈小,直至执行S5时,只可能是时,只可能是非闰年。见图非闰年。见图2.1示意。示意。图图 2.1从图从图2.1可以看出:可以看出:“其他其他”这一部分,包括能被这一部分,包括能被4整整除,又能被除,又能被100整除,而不能被整除,而不能被400整除的那些年份整除的那些年份(如如1
19、900年年),是非闰年。,是非闰年。在考虑算法时,应当仔细分析所需判断的条件,如在考虑算法时,应当仔细分析所需判断的条件,如何一步一步缩小被判断的范围。有的问题,判断的何一步一步缩小被判断的范围。有的问题,判断的先后次序是无所谓的,而有的问题,判断条件的先先后次序是无所谓的,而有的问题,判断条件的先后次序是不能任意颠倒的,读者可根据具体问题决后次序是不能任意颠倒的,读者可根据具体问题决定其逻辑。定其逻辑。例例2.4 求求1-1/2+1/3-1/4+1/99-1/100。算法可以表示如下:算法可以表示如下:S1:1=signS2:1=sumS3:2=denoS4:(-1)sign=signS5:
20、sign(1/deno)=termS6:sum+term=sumS7:deno+1=denoS8:若:若deno100返回返回S4;否则算法结束。;否则算法结束。在步骤在步骤S1中先预设中先预设sign(代表级数中各项的符号,它(代表级数中各项的符号,它的值为的值为1或或-1)。在步骤)。在步骤S2中使中使sum等于等于1,相当,相当于已将级数中的第一项放到了于已将级数中的第一项放到了sum中。在步骤中。在步骤S3中中使分母的值为使分母的值为2。在步骤。在步骤S4中使中使sign的值变为的值变为-1。在步骤在步骤S5中求出级数中第中求出级数中第2项的值项的值-1/2。在步骤。在步骤S6中将刚才
21、求出的第二项的值中将刚才求出的第二项的值-1/2累加到累加到sum中。至中。至此,此,sum的值是的值是1-1/2。在步骤。在步骤S7中使分母中使分母deno的值的值加加1(变成(变成3)。执行)。执行S8步骤,由于步骤,由于deno100,故,故返回返回S4步骤,步骤,sign的值改为的值改为1,在,在S5中求出中求出term的的值为值为1/3,在,在S6中将中将1/3累加到累加到sum中。然后中。然后S7再使再使分母变为分母变为4。按此规律反复执行。按此规律反复执行S4到到S8步骤,直到步骤,直到分母大于分母大于100为止。一共执行了为止。一共执行了99次循环,向次循环,向sum累加入了累
22、加入了99个分数。个分数。sum最后的值就是级数的值。最后的值就是级数的值。例例2.5 对一个大于或等于对一个大于或等于3的正整数,判断它是不是的正整数,判断它是不是一个素数。一个素数。所谓素数,是指除了所谓素数,是指除了1和该数本身之外,不能被其他和该数本身之外,不能被其他任何整数整除的数。例如,任何整数整除的数。例如,13是素数,因为它不能是素数,因为它不能被被2,3,4,12整除。整除。判断一个数判断一个数n(n3)是否素数的方法是很简单的:将是否素数的方法是很简单的:将n作为被除数,将作为被除数,将2到到(n-1)各个整数轮流作为除数,各个整数轮流作为除数,如果都不能被整除,则如果都不
23、能被整除,则n为素数。为素数。算法可以表示如下:算法可以表示如下:S1:输入:输入n的值的值S2:2=i(i作为除数)作为除数)S3:n被被i除,得余数除,得余数rS4:如果:如果r=0,表示,表示n能被能被i整除,则打印整除,则打印n“不是素数不是素数”,算法结束;否则执行,算法结束;否则执行S5S5:i+1=iS6:如果:如果in-1,返回,返回S3;否则打印;否则打印 n“是素数是素数”,然后结束。然后结束。实际上实际上n不必被不必被2到到(n-1)的整数除,只需被的整数除,只需被2到到n的开的开方间整数除即可,甚至只需被方间整数除即可,甚至只需被2到到n之间的整数除之间的整数除即可。例
24、如,判断即可。例如,判断13是否素数,只需将是否素数,只需将13被被2、3除除即可,如都除不尽,即可,如都除不尽,n 必为素数。必为素数。S6步骤可改为:步骤可改为:S6:如果:如果in,返回,返回S2;否则算法结束。;否则算法结束。通过以上几个例子,可以初步了解怎样设计一个算通过以上几个例子,可以初步了解怎样设计一个算法。法。2.3 算法的特性算法的特性一个算法应该具有以下特点:一个算法应该具有以下特点:1.有穷性有穷性一个算法应包含有限的操作步骤,而不能是无限的。一个算法应包含有限的操作步骤,而不能是无限的。事实上,事实上,“有穷性有穷性”往往指往往指“在合理的范围之内在合理的范围之内”。
25、究竟什么算究竟什么算“合理限度合理限度”,并无严格标准,由人们,并无严格标准,由人们的常识和需要而定。的常识和需要而定。2.确定性确定性算法中的每一个步骤都应当是确定的,而不应当是算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。含糊的、模棱两可的。3.有零个或多个输入有零个或多个输入所谓输入是指在执行算法时需要从外界取得必要的所谓输入是指在执行算法时需要从外界取得必要的信息。一个算法也可以没有输入。信息。一个算法也可以没有输入。4.有一个或多个输出有一个或多个输出算法的目的是为了求解,算法的目的是为了求解,“解解”就是输出。没有输就是输出。没有输出的算法是没有意义的。出的算法是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 算法
限制150内