- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图 1-6 网络模型
考虑到网络模型的直观性、形象性,本问题也可归结为网络模型,
然后利用网络算法求解(图 1-6):
2. 选定算法,用适当的工具描述算法
(1)算法的概念
广义地说所谓算法就是解决问题的方法和步骤,任何计算问题的答案都是按指定的顺序执行一系列动
作的结果,按照执行动作和动作执行的顺序解决问题的过程称为算法。程序设计依赖于算法,而算法是不
如微积分、运筹学、图论、高等代数等都是不同的基本数学模型,要善于把客观世界的问题归结到某种基
本模型上,同时要在不同情况下利用不同的基本模型。
例如,计算 y=x2-2x+3 的值这个例题中,数学模型是一个很简单的公式,相比较来说,有些问题要用
较多的数学表达式且每个表达式间关系较复杂,或者根本没有现成的数学表达式,需要设计者综合数学知 识、专门知识和经验构造出模型来。
1.2.1 结构化程序设计基本思想 结构化程序设计 (面向过程程序设计)支持自顶向下、逐步细化和模块化的结构化分析方法。 在求解一个问题时一般不能立即写出详细的算法或程序,但可以很容易写出一级算法,即求问题解的 轮廓,然后对一级算法逐步求精,把它的某些步骤扩展成更详细的步骤。细化过程中,一方面加入详细算 法,一方面明确数据,直到根据这个算法可以写出程序为止。 自顶向下、逐步求精的方法符合人类解 决复杂问题的思维方式,用先全局后局部、先整体后细节、先抽象后具体的逐步求精过程开发出的程序层 次结构清晰,容易阅读、理解和测试。 程序设计中还常采用模块化的设计方法,当任务比较复杂,往往按问题的需要,将其分解为若干个子 任务,这些子任务还可以划分为更小、更简单的子任务。这样,对于大程序将其化整为零编写,由多个人 共同进行程序的开发,或者是对那些重复使用的程序段,将其进行独立设计,使其达到计算机可以重复执 行,而设计人员又不必重复去编写的目的,避免重复设计,消除因交叉设计而产生的错误。这样划分的程 序段落被称为程序模块。这种程序设计的方式被称为模块化程序设计。以这种方式设计的程序,可以使其 达到层次分明、结构简洁而又严谨的目的,从而提高程序设计的速度和质量。 程序中的子模块在 C 语言中通常用函数来实现。一个子模块用一个函数实现,完成一个功能。每个子 模块的大小要适度。 1.2.2 三种基本结构 结构化程序设计用三种基本结构,通过组合和嵌套就能实现任何单入口单出口的程序。这三种基本结 构是顺序结构、选择结构和循环结构。 1. 顺序结构 按照顺序依次执行 A,B 程序块。顺序结构是最简单的一种基本结构。见图 1-1。 2. 选择结构 又称分支结构,见图 1-2,根据给定的条件 P 进行判断,由判断的结果决定执行两个分支中的一个分支。 当 P 为真时执行 A 程序块,否则执行 B 程序块。无论条件 P 是否成立,A 和 B 程序块只能有一个被执行到, 执行之后就离开了该选择结构。当 B 为空时,条件 P 为假时不执行任何操作。 3. 循环结构 又称为重复结构,给定条件成立时反复执行某一程序段。在图 1-3 中,当 P 为真时反复执行 A 程序块, 每执行一次测试一次 P,直到 P 为假,跳出循环结构。 虽然从理论上讲只用上述三种基本控制结构就可以实现任何单入口、单出口的程序,但是为了实际使 用方便起见,常常还允许使用"直到型"循环和多分支结构:
例如,有三辆卡车,需指派到三个不同的目的地,各种指派的成本见表 1-1,试求能使总成本最低的最 优指派。表中 Ai(i=1,2,3)代表三辆卡车,Bj(j=1,2,3)代表三个目的地。
表 1-1 运输指派成本表 注:"~"表示不能指派
显然这个问题无现成公式可用。通过分析,我们把这个现实问题归
结为线性规划模型:
图 1-4 直到型循环结构
图 1-5 多分枝选择结构
1.2.3 结构化程序设计的过程 对于一个不太复杂的问题,设计一个程序实际要经过以下几个步骤:
· 建立数学模型 ·选定算法,用适当工具描述算法 ·编程 ·测试及调试 1. 建立数学模型 提起数学模型,很多人认为就是一个数学公式。其实数学公式只是数学模型的一种,一张关系图、一
Min Z=CijXij ——总费用最小
∑Xij=1 i=1,2,3 ——一个目的地只能指派一辆车
∑Xij=1 j=1,2,3 ——一辆车只能去一个目的地
Xij=0 或 1
其中 Cij 代表第 i 辆卡车到第 j 个目的地的费用 Xij 代表第 i 辆卡车是否指派到第 j 个目的地,取值为 0 或 1
图 1-1 顺序结构
图 1-2 选择结构
图 1-3 循环结构
4."直到型"循环结构
先执行 A 程序块,执行完 A 程序块后再判断 P,如果条件 P 为真,则反复执行 A 程序块,直到 P 不成
立则跳出循环。见图 1-4。
5. 多分枝结构
根据 I 的取值决定执行 A1 或 A2,...或 An。见图 1-5。
张二维数据表也都是数学模型,因为它们规定了数据间准确的关系。
建立数学模型是程序设计中最复杂、最困难的一步,好的数学模型本身就是一个定律,例如惯性系统
中力和运动间的关系有 Newton 定律:
F = ma 它要通过大量观察、分析、推理、验证等工作,还要加上人的天才才可以得到,我们往往不可能每个
Biblioteka Baidu
人都去发现定律,在进行程序设计时一般是利用已有的基本数学模型去构造出本问题的模型。各种数学,
在程序设计发展过程中,特别是在 70 年代初期,各种大型、复杂的软件系统陆续问世,随着软件系统 规模的扩大和复杂性的增加,软件的开销(编写程序耗费的大量的人力、财力)惊人地增加,而产品的可 靠性和可维护性却明显地降低了,人们把程序设计的这种困境叫做"软件危机"。
上述问题促使人们开始对程序设计方法进行研究,1969 年 Dijkstra 首先提出了结构化程序设计的思想与 概念,强调从程序结构上来研究与改变传统的设计方法,经计算机科学工作者的实践,结构化程序设计得 到了普遍应用,程序设计也逐步走向规范化和工程化。面向对象程序设计是在结构化程序设计基础上发展 起来的一种新的程序设计方法。在本章中主要介绍结构化程序设计方法,面向对象程序设计将在第 9-12 章 进行讲解。