文档详情

[计算机软件及应用]第三章 算法与数据结构.ppt

发布:2018-05-19约4.48万字共194页下载文档
文本预览下载声明
第三章 算法与数据结构 程序为什么能解题?就是它能把输入的数据,经过表达式计算、赋值、置换转移等一系列计算步骤,最后得到输出。编制程序就是要设计数据(输入的、输出的、中间的),然后针对这些数据一一安排计算步骤,即所谓计算法。所以,很早就有人说,程序计算的本质是: 程序 = 算法 + 数据结构 算法和数据结构讨论的是抽象的计算逻辑,与具体的表示法无关,可以用图形、伪代码和汇编语言、高级程序设计语言表达它们,一般讨论中采用近似于高级语言的伪代码(不能上机运行,可以方便地转成编程语言代码)表达。 本章讨论编程最重要的两个基础,即算法与数据结构。 3.1 算 法 算法是什么?就字面而言是计算解题的办法,是解题策略具体化为计算机的动作。即计算机在什么情况下应该怎么做的一系列步骤,实施了这些步骤问题得到解决。例如,辗转相除法是求两个整数的最大公约数的数学算法。它的解题策略是:以小数除大数,得余数,如果余数不为零,则小数成被除数,余数成除数,除后得新余数。若余数为零,则此除数即为最大公约数,否则继续辗转除。不妨先拿两个正整数试一试: 544和119。544/119的余数是68,119/68的余数是51,68/51的余数是17,51/17的余数是0。所以544和119的最大公约数是17。 如何写出计算机算法呢?计算机怎么进行辗转相除呢?显然只能用计算机容许的动作,写出的算法才是可行的。 计算机容许的动作是: ? 为变量赋值(包括初值); ? 计算表达式(在变量上做四则或逻辑运算); ? 计算过程的选择、循环、转移控制; ? 调用函数/子程序。 再看如何写出计算机的辗转相除法。 令变量x为被除数,y为除数,z为余数。计算机中有求余函数mod,则: z = x mod y 然后x←y, y←z就换过来了,x依然是被除数,y是除数。于是写出GCD(Greatest Common Divisor最大公约数)算法: 1.设定x, y, z 2.输入x, y 3.if yx then z←y; y←x; x←z fi 4.while y?0 do A.z←y B.y←x mod y; C.x←z od 5.输出z,即最大公约数□ 其中,if…then…fi、while do…od是分支和循环控制,‘fi’和‘od’是编程语言Endif和Endwhile的简写。‘←’是赋值符号。其中的序号按1,2,3…和A,B,C…字母数字相间表示嵌套,第5步这一行最后的□表示算法结束。这种表示法是算法文献上学者们约定的表示法。 3.1.1 算法的表示 从GCD算法的例子看到它的表达比较自由,不过是自然语言加上编程语言的基本特征(控制结构、赋值、调用)而已。很自然地,读者就会问到“算法描述语言和编程语言有什么关系?”。事实上,早期的编程语言ALGOL就叫算法语言。后来发现,用编程语言描述算法往往使人们陷于表示的细节,因为编程语言的形式化(即正规性)过于严格,而在设计程序的早期,人们关心的是程序逻辑能否解题,而不是立即上机运行。于是先用伪代码写设计,再用编程语言编码实现这个设计(编码)。 算法描述的是程序的计算逻辑,编程语言表达的是程序本体(源代码)。更形象地说,一个是灵魂,一个是包含有灵魂的肉体。设计过程也是人们对这个问题更深入了解的过程,反复修改是必然的,何不先设计、修改好了一次翻译(编码)成功呢?于是“先设计,后编码!”是早期软件行业不成文的行规。直到现在,软件开发依然强调设计和编程是两个不同阶段。只是由于开发工具的完善,伪代码越来越近似于最后实现的编程语言。甚至有些简单编程直接用编程语言,如VB、VC在窗口上进行。伪代码始终没有统一的标准。 类C、类Pascal、类VB之类的伪代码,也不尽相同,但程序员必须记住“用伪代码写算法,编程语言写程序”还是应该遵循的! 本书约定的算法描述语言是VC语言的变体,称为类VC语言。 这里还需要说一说流程图(Flow Chart)。因为它在历史上有过巨大的影响,在20世纪50—70年代结构化编程语言尚未风行时,流程图一直是表达算法的设计工具。美国国家标准协会(ANSI)还把它定为标准。为了帮助读者阅读历史的软件文档,这里做一点简单说明。 如图3.1所示,其中: ? 带圆弧的框是起止框,表示算法的起始、终止。框内填写文字。 ? 圆圈一般是连接框,连接多个流向箭头。大圈中写文字标号,无文字时是句号大小的圈。 ? 平行四边形的输入输出框表示输入数据和输出计算结果。框内应填写需要输入或输出的量。有的标准将输出画成打印纸形状。 ? 菱形的判断框根据条件判断执行的走向。框内应填上条件。 ? 矩形的处理框表示执行计算表达式和赋
显示全部
相似文档