《如何设计第一个程序》由会员分享,可在线阅读,更多相关《如何设计第一个程序(24页珍藏版)》请在金锄头文库上搜索。
1、如何设计第一个程序测绘遥感信息工程 国家重点实验室l目前你已经学习了一些编程基础,让我们 来进一步看看如何设计一个具体的程序。 当你坐下准备写一个程序,通常你对于想 解决的问题,或者想模拟的情况多少有一 些想法。新手程序员经常感到在解决如何 把想法变换成实际代码的问题上存在困难 。但结果却是,你已经从日常学习生活中 获得了很多你所需要的解决问题的技术。l请记住最重要的事情是要在你开始编写代码之前 设计好你的程序,而这也是最困难的。在很多注 意中,编程就像是盖房子。如果你在没有建筑设 计平面图的情况下试图建造一个房子,那会发生 什么?除非你是个天才,否则你会得到一所问题 重重的房子:漏水的屋顶,
2、凹凸不平的墙壁等等 同样的,如果你在设计好计划之前就开始编 写程序,你会发现你所编写的代码有很多问题, 你必须花费很多时间来修改问题,这本来是可以 通过提前设计避免的。l一个预先的计划会长远的节约你的时间,避免挫 折。第一步:明确问题首先你要明确你的程序要解决什么问题。理论上, 你应该能够用一两句话进行描述。例如:l我想写一个电话簿记录我的朋友的电话号码。l我想写一个能随机地下发生器,它可以产生看起 来有趣的洞穴。l我想写一个程序,可以提供股票信息以及预测我 该买那些股票。 尽管这一步似乎显而易见,但它还是十分重要的。 你能做到的最坏的情况就是写一个实际上不是你 或你的老板想要的程序!第二步:
3、明确你的目标当你是一个富有经验的程序员时,在此时会有很多 其他典型的步骤,其中包括:l了解你的目标使用者是谁 l定义目标架构和/或你的程序涉及的操作系统l确定你将用到的所有工具l确定你是独自编写程序还是作为团队中的一员l收集需求(一个关于程序要做什么的文件记录列 表) 然而,作为一个新手程序员,这些问题的答案是简 单的:你是在为你自己写一个程序,独自的,用 你自己的方法,利用你购买或下载的集成开发环 境。这使得情况变得简单,所以我们不会在这一 步花费时间。第三步:将任务分出层次在现实生活中,我们经常需要完成十分复杂的任务 。尝试去解决如何做这些任务是很有挑战性的。 在这种情况下,我们经常使用自
4、顶向下的方法来 解决问题。也就是说,我们不是解决一个单一的 复杂的任务,而是将任务分解成多个更容易解决 的子任务。如果这些子任务仍然很难解决,则可 以进一步分解。通过不断的将复杂的任务分解成 简单的任务,最终你可以得到的每一个单独的任 务都是容易进行的。 让我们来看一个关于这一点的例子。我们想写一个 关于胡萝卜的报告。当前的任务层次是这样的:l。写关于胡萝卜的报告 一次性写一个关于胡萝卜的报告是一个很难的任务 ,所以我们把它分解成子任务:l。写报告l。做调查l。写概述l。填写关于胡萝卜的细节我们现在有三个可以分别集中研究的任务,这是很 容易办到的。然而,在这种情况下,做关于胡萝 卜的研究是模糊
5、不清的,所以我们可以进一步分 解:l。写关于胡萝卜的报告 l。做关于胡萝卜的调查l。去图书馆找有关于胡萝卜的书l。在网上搜索有关于胡萝卜的信息l。写概述l。关于生长的信息l。关于加工的信息l。关于营养的信息l。填写关于胡萝卜的细节l现在我们有了一个任务的层次,每个子任务都不 是特别困难。通过完成每个相对容易做的子项目 ,我们可以完成关于写一个胡萝卜报告的更困难 的全部任务。l创造任务层次的另一种方法是自底向上的方法。 在这种方法中,我们从一个简单任务的列表开始 ,通过将它们分组来构造层次。 举个例子,很多人必须在工作日上班或者上学,所 以我们想解决“从起床到上班”的问题。如果问早 上从起床到上
6、班你要做什么任务,你也许会想到 如下的列表:l。挑选衣服l。穿衣服l。吃早饭l。开车去工作l。刷牙l。起床l。准备早饭l。进入车里l。洗淋浴使用自底向上的方法,我们可以通过寻找相似点把项目组织 起来的方法,将这些整理成一个项目层次:l。从起床到上班 l。卧室的事情l。起床l。挑选衣服l。浴室的事情l。洗淋浴l。刷牙l。早餐l。准备早餐l。吃早餐l。交通的事情l。进入车里l。开车去工作l结果表明,这些任务层次对程序设计非常有用, 因为一旦你有了一个任务层次,你就基本明确了 整个程序的结构。最高级别的任务(在本例中,“ 写一个关于胡萝卜的报告”或者“从起床到上班”) 成为main()(因为它是你要
7、解决的主要项目)。 子项目成为程序中的函数。l如果其中一个项目(或函数)太难实现,仅仅是 把这个项目分解成多个子项目,再函数调用多个 子项目来实现这些新任务。最终,你应该达到的 目标是在你的程序中的每一个函数实现起来都是 琐碎的。第四步:确定项目的顺序现在你的程序有了一个结构,然后就该确定如何将所有的任 务联系在一起。第一步是确定项目的执行顺序。例如,当 你早上起床,是什么决定了你做以上任务的顺序?顺序或 许是这样的:l。起床l。挑选衣服l。洗淋浴l。穿衣服l。准备早餐l。吃早餐l。刷牙l。进入车里l。开车去工作现在你的程序有了一个结构,然后就该确定如何将所有的任 务联系在一起。第一步是确定项
8、目的执行顺序。例如,当 你早上起床,是什么决定了你做以上任务的顺序?顺序或 许是这样的:l。起床l。挑选衣服l。洗淋浴l。穿衣服l。准备早餐l。吃早餐l。刷牙l。进入车里l。开车去工作这个列表基本上定义了将要进入main()函数中的东西:l01 int main() l02 l03 GetOutOfBed(); l04 PickOutClothes(); l05 TakeAShower(); l06 GetDressed(); l07 PrepareBreakfast(); l08 EatBreakfast(); l09 BrushTeeth(); l10 GetInCar(); l11 Dr
9、iveToWork(); l12 或者在计算机的情况下: l01 int main() l02 l03 / Get first number from user l04 GetUserInput(); l05 l06 / Get mathematical operation from user l07 GetMathematicalOperation(); l08 l09 / Get second number from user l10 GetUserInput(); l11 l12 / Calculate result l13 CalculateResult(); l14 l15 / Pr
10、int result l16 PrintResult(); l17 第五步:确定每个任务的数据输入和输出l一旦你有了层次结构和项目顺序,下一件事就是确定每个任务需要操 作的输入数据,以及他产生的数据(如果有的话)。如果你已经从以 前的步骤得到输入数据,那么输入数据将会变成参数。如果你通过其 它函数计算输出以供使用,那么通常输出会成为返回值。 l当做完这些,我们应该有了每个函数的原型。假如你忘记了,函数原 型是一个函数的声明,它包括了函数名,参数和返回值,但是并不执 行函数。 l让我们举一个例子。GetUserInput()是相当简单的。我们将要从用户 那里得到一个数,然后返回调用程序。因此,函
11、数原型就像这样: l1 int GetUserInput() l在计算机例子中,CalculateResult()函数将会需要获得三块输出:两 个数和一个数学运算符。当我们指出这个函数的位置时,我们应该已 经有了这三项,所以这三块数据将会是函数参数。CalculateResult() 函数会计算结果的值,但它不会显示结果本身。因此,我们需要将结 果作为返回值返回以便其它函数使用。 l鉴于此,我们可以写一个函数原型,如下所示: l1 int CalculateResult(int nInput1, char chOperator, int nInput2);第六步:写任务细节l在这一步里,对每一
12、个任务,你要写它的具体实施。如果你已经把任 务分解成为足够小的部分,每一个任务都应该相当简单明确。如果所 给任务仍然过度复杂,可能它需要分解成子项目以便更加简单的实现 。例如: l01 char GetMathematicalOperation() l02 l03 cout chOperation; l07 l08 / What if the user enters an invalid character? l09 / Well ignore this possibility for now l10 return chOperation; l11 第七步:连接数据输入和输出l最后一步是将每个
13、任务的输入和输出以适当的方式连接起 来。例如,你会把CalculateResult()的输出发送到 PrintResult()的输入中,所以它可以输出计算的结果。这 通常包含存储临时结果的中间变量的使用,所以它可以在 函数之间交换。例如: l1 / nResult is a temporary value used to transfer the output of CalculateResult() l2 / into an input of PrintResult() l3 int nResult = CalculateResult(nInput1, chOperator, nInput2
14、); l4 PrintResult(nResult);l这与不使用时间变量的可选浓缩版本相比更倾向于可读性 : l1 PrintResult( CalculateResult(nInput1, chOperator, nInput2) );l找到窍门对于一个新手程序员来讲是最困难的步骤。编写程序时的一些建议1.开始时要使你的程序保持简洁。新手程序员经常 会关注所有他们想让程序实现的东西。“我想利用 图形学写一个角色扮演游戏,以及音频、随机怪 兽和地下城,附带一个可以访问并出售你在地下 城找到的物品的城镇。”如果刚开始时你就试图编 写过于复杂的东西,你会由于你的毫无进展而受 到打击并感到气馁。相
15、反的,让你的第一目标尽 可能的简单,确定它在你所能达到的范围之内。 例如,“我想能够在屏幕上显示二维表征的世界地 图”。2.随着时间增加特征。一旦你有一个简单程序并且 运行良好,然后你就可以对它增加一些特征。例 如,一旦你可以显示你的二维世界地图,那么就 增加一个可以四处走动的人物。一旦你可以走动 ,增加一个可以阻碍你行动的墙壁。一旦你有了 墙壁,在他们之外建立一个简单的城镇。一旦你 有了一个城镇,增加商人。通过逐渐增加每一种 特征,你的程序就会逐渐的变得更加复杂,并且 在这个过程中没有东西能压倒你。 3.分散在多个任务上。每次只集中于一个任务,使 它尽可能的顺利实现。拥有一个充分的工作任务
16、就更好了。如果你分散了你的注意力,你就更可 能犯错误,并且忘记重要的细节。4.随着你的进展测试每一段代码。新手程序员经常 写完全部程序并且一次通过。然后当他们第一次 编译时,编译器会报告几百个错误。这不只是吓 人的,如果你的代码无法运行,要想出原因就可 能十分困难。相反的,写一段代码,然后立即编 译并检验。如果你的代码无法运行,你会准确地 知道问题在哪里,并且容易修改。一旦你确定代 码可以运行,转移到下一段并重复一遍。这样也 许会花费你更多的时间编写代码,但是当你做完 整个程序并可以运行时,你就不必花费两倍长的 时间去解决为什么它不能运行。l大部分新手程序员会忽略这里提到的很多步骤和 建议(因为它看起来有很多工作并且/或