CU首页>> 读书频道>> 分类浏览>> C程序设计思想与方法>> 阅读内容
C程序设计思想与方法
方案设计
方案设计
方案设计是根据对问题的分析和理解,确定解决问题的方法和策略,为后续的编码提供依据。方案设计阶段的工作包括计算过程和步骤的规划、计算模型的选择、以及算法和数据结构的选择。
解题思路
在明确了对程序的功能、性能等方面的要求之后,接着需要做的是建立解题思路,然后根据解题思路选择和设计算法,构造相应的数据结构。所谓建立解题思路就是用自然语言描述解题的计算过程和步骤,而算法则是使用具有可操作性的语言,按照一定的规则,对这些过程和步骤进一步细化。如果用写文章做比喻的话,可以说解题思路解决的是布局和谋篇的问题,而算法描述则是关键章节和段落的构思。当然,在程序设计的过程中,这两个层面并不是截然分开的,它们之间的界线也不是不可逾越的。很多时候,对解题思路的考虑要涉及到所拟采用的算法的时空效率,而对一些简单的问题,相应的算法就是解题思路的直接延伸,或者说,解题思路可能直接就导出了相应的算法。有些时候,题目的求解过程很简单,从对问题的分析就直接可以得到问题的求解思路。例如【例
2-2】多项式运算的主要功能只有读入数据、进行多项式的运算和输出运算结果这三个步骤,而这三个功能从概念上讲,都是比较简单的基本操作步骤。其中输入数据的读入直接对应了简单的语句,而对多项式的计算和按格式输出计算结果又是和具体的数据结构的选择以及编码中的一些考虑相关的。因此对这样的问题,就可以省略建立求解思路的过程而直接进入算法和数据结构的设计以及编码了。
对于复杂一些的问题,解题思路可能涉及多个性质不同的计算步骤和过程,而每一个计算步骤所涉及的算法和数据结构也各不相同。这样,解题思路就与算法和数据结构的设计有一个比较明显的划分。例如,不少人都玩过一个叫做“连连看”的电子游戏。这是一个基于图形界面的人机交互游戏,用鼠标点击连接盘面上图案相同的两个棋子时,如果这对棋子可以使用不超过3条线段连接起来,那么这对棋子即可被消除。当盘面上的棋子不能被消除时,游戏程序会对剩余的棋子重新排列。游戏的目标是尽可能多地连续消除盘面上的棋子,以便在有限的对剩余棋子的重新排列次数内清除掉所有的棋子。图2-1是游戏的一个初始状态盘面。假设我们希望编写一个程序来帮助我们对任何一个游戏状态找到最优的操作序列,那么一个自然的想法就是让程序自动地在游戏的盘面状态上进行搜索。为实现这一目标,我们需要识别盘面中各个棋子的图案,而要做到这一点,就需要获取计算机终端屏幕上指定区域中的图像,在这个图像中分割出一个个棋子所对应的区域,然后再对这些区域进行识别和记录。为了便于对盘面状态进行搜索,需要在识别了棋子的图案后把它们转换为一种内部的表示形式,并存储在程序内部表示游戏盘面状态的数据结构中。在完成了这些步骤之后,就可以选择最适合的搜索算法来求解最优的操作顺序。然后,再以合适的方式把这一操作顺序通知用户。这一连串的计算过程分别属于数据采集、图像处理、图像识别、状态空间搜索、以及人机交互等领域,每一个步骤都是相对独立的、有其自身的特点和独立的算法的。
图2-1 游戏连连看的一个布局
一般说来,建立解题思路是一个逐步探索、逐步细化的过程,其基本策略是分而治之,也就是把大的问题逐步分解成小的、更容易把握和解决的问题。对于简单的问题,可能略加思索就可以明确解题的基本步骤。对于较为复杂的问题,则需要首先明确解题的基本方向和大的步骤,然后再对每个具体步骤逐步细化,直到每一个步骤都是可以解决的基本问题为止。在这一过程中,重要的是需要抓住问题的关键,并围绕关键的步骤灵活地思考。在思考的过程中,首先需要评估一下已知条件和所要求的结果,也就是出发点和目标之间的差距。如果这两者之间的差距很小,可以用已知的方法实现从出发点到目标的跨越,则说明已经找到了解决这一问题的方法。否则,就需要考虑如何利用已知的方法,从出发点向着目标前进一步。当然,我们也可以从目标出发,考虑能否找到利用已知方法达到目标且距离出发点较近的中间结果。不断地针对新的起点和新的目标重复上述过程,就可以构建一条根据已知条件解决问题的思路。需要注意的是,在这一过程中,在构建思路中的每一个步骤时,都必须考虑到它的可行性,即这一步骤应该不仅在理论上是正确的,而且在计算机上是可以实现的,是在计算机所能提供的有限资源下可以计算的。有些时候,一个解题思路会受到某些因素的制约,因而在实际上是不可行的。这时就需要另寻其他的思路。至于解题思路中每一步骤的大小,并没有固定的标准。它既取决于问题的规模,也取决于编程人员的能力和经验。一般来说,规模较大的程序中每一个步骤的粒度要大于规模较小的程序。有经验的编程人员考虑问题可以粗一些,而经验较
程序设计方法包括三个基本步骤—— 个人的编程体会 来自淘豆网m.daumloan.com转载请标明出处.