word程序设计方法包括三个根本步骤: 第一步:分析问题第二步:画出程序的根本轮廓第三步:实现该程序1) 编写程序;(2) 测试和调试程序;(3) 提供数据打印结果下面, 我们来说明每一步的具体细节 第一步: 分析问题 在这一步, 你必须: a.作为解决问题的一种方法, 确定要产生的数据(输出) 作为这一子步的一局部, 你应定义表示输出的变量 b.确定需产生输出的数据(称为输入), 作为这一子步的一局部,你应定义表示输入的变量c. 研制一种算法, 从有限步的输入中获取输出 这种算法定义为结构化的顺序操作, 以便在有限步内解决问题就数字问题而言, 这种算法包括获取输出的计算, 但对非数字问题来说, 这种算法包括许多文本和图象处理操作 第二步: 画出程序的根本轮廓 在这一步, 你要用一些句子(伪代码)来画出程序的根本轮廓每个句子对应一个简单的程序操作对一个简单的程序来说,通过列出程序顺序执行的动作, 便可直接产生伪代码然而, 对复杂一些的程序来说, 如此需要将大致过程有条理地进展组织对此, 应使用自上而下的设计方法 当使用自上而下的设计方法时, 你要把程序分割成几段来完成列出每段要实现的任务, 程序的轮廓也就有了, 这称之为主模块。
当一项任务列在主模块时, 仅用其名加以标识, 并未指出该任务将如何完成这方面的内容留给程序设计的下一阶段来讨论将程序分为几项任务只是对程序的初步设计整个程序设计归结为如下图所示的流程图1.如果把主模块的每项任务扩展成一个模块, 并根据子任务进展定义的话, 那么, 程序设计就更为详细了(见图2.)这些模块称为主模块的子模块程序中许多子模块之间的关系可象图2.中那样归结为一X图这种图称为结构图 要画出模块的轮廓, 你可不考虑细节如果这样的话, 你必须使用子模块, 将各个模块求精, 达到第三级设计继续这一过程, 直至说明程序的全部细节这一级一级的设计过程称为逐步求精法在编写程序之前, 对你的程序进展逐步求精, 对你来说, 是很好的程序设计实践, 会使你养成良好的设计习惯 我们如此才描述了程序设计中自上而下的设计方法实际上就是说, 我们设计程序是从程序的"顶部"开始一直考虑到程序的"底部"第三步: 实现该程序 程序设计的最后一步是编写源码程序 在这一步,把模块的伪代码翻译成C语句 对于源程序, 你应包含注释方式的文件编制, 以描述程序各个局部做何种工作此外, 源程序还应包含调试程序段, 以测试程序的运行情况, 并允许查找编程错误。
一旦程序运行情况良好, 可去掉调试程序段, 然而,文件编制应做为源程序的固定局部保存下来, 便于你或其他人维护和修改编写一个C程序需要这么麻烦吗?编写一个简单程序当然不需要这么麻烦,但是这是训练你解决问题的方法,如果你坚持这么做你以后会感到收益非浅,因为我们学程序设计目的是进展软件开发,而现在早已不再是求伯均、王江民软件开发个人英雄时代,而是软件开发的规模化时代,软件设计的规X化是每一个程序员应具备的根本技能摘自《Turbo C/C++ for Windows 集成实验与学习环境》的《C语言学习指导》详情请访问.jiaminsoft./CU首页 >> 读书频道 >> 分类浏览 >> C程序设计思想与方法 >> 阅读内容 C程序设计思想与方法2.3 方案设计 2.3 方案设计方案设计是根据对问题的分析和理解,确定解决问题的方法和策略,为后续的编码提供依据方案设计阶段的工作包括计算过程和步骤的规划、计算模型的选择、以与算法和数据结构的选择2.3.1 解题思路在明确了对程序的功能、性能等方面的要求之后,接着需要做的是建立解题思路,然后根据解题思路选择和设计算法,构造相应的数据结构所谓建立解题思路就是用自然语言描述解题的计算过程和步骤,而算法如此是使用具有可操作性的语言,按照一定的规如此,对这些过程和步骤进一步细化。
如果用写文章做比喻的话,可以说解题思路解决的是布局和谋篇的问题,而算法描述如此是关键章节和段落的构思当然,在程序设计的过程中,这两个层面并不是截然分开的,它们之间的界限也不是不可逾越的很多时候,对解题思路的考虑要涉与到所拟采用的算法的时空效率,而对一些简单的问题,相应的算法就是解题思路的直接延伸,或者说,解题思路可能直接就导出了相应的算法有些时候,题目的求解过程很简单,从对问题的分析就直接可以得到问题的求解思路例如【例2-2】多项式运算的主要功能只有读入数据、进展多项式的运算和输出运算结果这三个步骤,而这三个功能从概念上讲,都是比拟简单的根本操作步骤其中输入数据的读入直接对应了简单的语句,而对多项式的计算和按格式输出计算结果又是和具体的数据结构的选择以与编码中的一些考虑相关的因此对这样的问题,就可以省略建立求解思路的过程而直接进入算法和数据结构的设计以与编码了对于复杂一些的问题,解题思路可能涉与多个性质不同的计算步骤和过程,而每一个计算步骤所涉与的算法和数据结构也各不一样这样,解题思路就与算法和数据结构的设计有一个比拟明显的划分例如,不少人都玩过一个叫做“连连看〞的电子游戏这是一个基于图形界面的人机交互游戏,用鼠标点击连接盘面上图案一样的两个棋子时,如果这对棋子可以使用不超过3条线段连接起来,那么这对棋子即可被消除。
当盘面上的棋子不能被消除时,游戏程序会对剩余的棋子重新排列游戏的目标是尽可能多地连续消除盘面上的棋子,以便在有限的对剩余棋子的重新排列次数内去除掉所有的棋子图2-1是游戏的一个初始状态盘面假设我们希望编写一个程序来帮助我们对任何一个游戏状态找到最优的操作序列,那么一个自然的想法就是让程序自动地在游戏的盘面状态上进展搜索为实现这一目标,我们需要识别盘面中各个棋子的图案,而要做到这一点,就需要获取计算机终端屏幕上指定区域中的图像,在这个图像中分割出一个个棋子所对应的区域,然后再对这些区域进展识别和记录为了便于对盘面状态进展搜索,需要在识别了棋子的图案后把它们转换为一种内部的表示形式,并存储在程序内部表示游戏盘面状态的数据结构中在完成了这些步骤之后,就可以选择最适合的搜索算法来求解最优的操作顺序然后,再以适宜的方式把这一操作顺序通知用户这一连串的计算过程分别属于数据采集、图像处理、图像识别、状态空间搜索、以与人机交互等领域,每一个步骤都是相对独立的、有其自身的特点和独立的算法的图2-1 游戏连连看的一个布局一般说来,建立解题思路是一个逐步探索、逐步细化的过程,其根本策略是分而治之,也就是把大的问题逐步分解成小的、更容易把握和解决的问题。
对于简单的问题,可能略加思索就可以明确解题的根本步骤对于较为复杂的问题,如此需要首先明确解题的根本方向和大的步骤,然后再对每个具体步骤逐步细化,直到每一个步骤都是可以解决的根本问题为止在这一过程中,重要的是需要抓住问题的关键,并围绕关键的步骤灵活地思考在思考的过程中,首先需要评估一下条件和所要求的结果,也就是出发点和目标之间的差距如果这两者之间的差距很小,可以用的方法实现从出发点到目标的跨越,如此说明已经找到了解决这一问题的方法否如此,就需要考虑如何利用的方法,从出发点向着目标前进一步当然,我们也可以从目标出发,考虑能否找到利用方法达到目标且距离出发点较近的中间结果不断地针对新的起点和新的目标重复上述过程,就可以构建一条根据条件解决问题的思路需要注意的是,在这一过程中,在构建思路中的每一个步骤时,都必须考虑到它的可行性,即这一步骤应该不仅在理论上是正确的,而且在计算机上是可以实现的,是在计算机所能提供的有限资源下可以计算的有些时候,一个解题思路会受到某些因素的制约,因而在实际上是不可行的这时就需要另寻其他的思路至于解题思路中每一步骤的大小,并没有固定的标准它既取决于问题的规模,也取决于编程人员的能力和经验。
一般来说,规模较大的程序中每一个步骤的粒度要大于规模较小的程序有经验的编程人员考虑问题可以粗一些,而经验较少的初学者就需要把问题分解得更细一些例如,在做程序练习题时,对于经验较多的人,“根据输入数据建立一个名字-数值对照表〞可能就是一个很明确的、可以把握的根本操作步骤,而对于初学者来说,就需要再进一步将其分解为更细的操作步骤随着经验的积累和能力的提高,对问题分解的粒度也可以逐渐加大下面我们以一个具体的题目为例,来讨论解题思路的建立过程例2-1-1】N!的分解-解题思路 在这个例子中,程序的主要功能是将N!进展质因数分解,以与记录每一个质因数出现次数最直观的解题方法就是首先计算出N!,然后再对其进展质因数分解我们知道如何计算N!,也知道如何对一个数进展质因数分解因此从理论上讲,我们找到了一条解决这一问题的思路但是在实际上,这条路是不可行的,它受到了计算机所能提供的数值表达能力和计算能力的限制我们知道,N!随着N的增加呈指数方式迅速增大对于32位的计算机来说,它所能直接表示的最大有符号整数是231-1,所能直接表示的最大无符号整数是232-1这两个数都介于12!和13!之间,64位整数可以表示到20!。
即使使用double类型的浮点数,也只能表示到1475!的近似值,而这道题目要求准确分解的最大的数是60000!,这远远超过了计算机根本数据类型所能直接表示的数值X围即使我们可以用其他方法来表示这么大的数值,这样的方法在计算效率方面也会很低,在可以承受的时间内无法得出计算结果因此必须寻找其他的解决方法因为N!是由从1到N的N个正整数的乘积,而N的最大取值60000仍然在计算机可以直接表示的X围内所以我们可以考虑逐一地对这N个自然数进展质因数分解,在分解的过程中记录每一个质因子出现的次数,并把每个自然数中一样的质因子出现的次数累加起来首先,这一方法在理论上是正确的:中学的数学教科书中就讲过乘法的交换律和结合律;其次,这一方法是可以在计算机上计算的:对一个60000以内的自然数进展质因数分解,即使用手工计算也不是非常困难的问题使用计算机更是可以轻而易举地完成的因此我们可以以此作为解决这道题目的一个思路在确定了解题思路之后,剩下的问题就是对其中的关键步骤,也就是一个正整数的质因数分解、以与对每个质因数出现的次数计数,进展算法和数据结构的设计这里,我们可以认为这两个步骤都比拟根本,是用已有的知识就可以完成的。
如果读者认为这两个步骤依然比拟复杂,对于设计解题的算法和编程来说还嫌过于粗糙,也可以在解题思路的层面上对这两个步骤进一步细化在上面的例子中,解题步骤的实际不可计算性使得初始的解题路线不可行,必须另辟蹊径一般来说,对于同一个问题,可能有多个不同的解题思路不同的解题思路有可能在描述的繁简、实现的难易、运行的效率、以与对计算资源的要求等方面都不一样,程序的运行环境以与系统所提供的各种根本支持等其他多种因素也常常对解题步骤产生影响因此在构思了一个解题思路之后,需要根据这些指标来衡量一下,看看解题思路是否可行,并在遇到难以克制的困难时与时转换解题思路有些时候,对问题的进一步分析,特别是对算法和数据结构的设计和分析有可能导出新的解题思路因此,在建立解题思路的过程中,需要保持灵活和开放的态度,对已有的解题思路进展认真的分析,看看它是否真的可行,是否还有更好的方法2.3.2 计算模型计算模型是对所要求解的问题的一种抽象,它用计算过程中的各种元素,如数据、公式、操作等来描述需要求解的问题一些与数值计算和系统软件直接相关的题目,往往直接给出了题目的计算模型或计算公式这时编程人员只需要确定适当的计算步骤,选择和设计有效的算法以与相应的数据结构,就可以着手编码了。
另外一类题目,往往是与其他应用领域相关的题目,如此只从相关领域的角度描述了计算的前提条件和对计算的要求这就像数学。