c++功课:如何设计你的第一个程序
2013-10-11 20:18
246 查看
现在,您已经了解了一些关于项目的基本知识,让我们更仔细地看看如何设计一个程序。当你坐下来写一个程序,一般你有一些问题,你想解决,或情况,你想模拟。新程序员通常很难弄清楚如何转换成实际的代码,想法。但事实证明,你有许多解决问题的能力,获得你需要已经从每一天的生活。
最重要的是要记住的(和最难的事情)是设计你的程序在你开始编码。在许多方面,编程就像架构。会发生什么如果你试图建造一座房子,不遵循一个架构的计划吗?赔率是,除非你很有天赋,最终将得到一个房子,有很多问题:屋顶漏水、墙面不直等…同样,如果你试图程序之前,您有一个好的足球前进,你可能会发现你的代码有很多问题,你得花很多时间解决问题,完全是可以避免与一个小设计。
一个小的预先计划将节省你的时间和挫折从长远来看。
步骤1:定义问题
你首先需要找出是什么问题你的程序正试图解决。理想情况下,您应该能够状态这一两句话。例如:
我想写一个电话簿应用程序来帮助我跟踪我的朋友的电话号码。
我想写一个随机的地牢发电机产生有趣的寻找洞穴。
我想写一个程序,将有关股票的信息,并试图预测哪些我应该买。
虽然这一步似乎是显而易见的,它也是非常重要的。最糟糕的事情你可以做的是编写一个程序,实际上并不做你(或你的老板)想要的!
第二步:定义你的目标
当你是一名有经验的程序员,有许多其他步骤,通常会发生在这一点上,包括:
了解你的目标用户是谁
定义目标架构和/或操作系统上运行你的程序
确定组工具时,您将使用
决定是否你将编写程序单独或作为团队的一部分
收集需求(一个记录列表的程序应该做什么)
然而,作为一个新程序员,这些问题的答案通常是简单的:你在写一个程序仅供您自己使用,在您自己的系统上,使用一个IDE你购买或下载。这使事情变得简单,所以我们不会花任何时间在这一步。
第三步:做一个等级秩序的任务
在现实生活中,我们常常需要执行的任务是非常复杂的。试图找出如何
b3b3
做这些任务可以非常具有挑战性的。在这种情况下,我们通常会使用自顶向下方法解决问题的。那是,而不是解决一个复杂的任务,我们打破这个任务分成多个的子任务,每个单独的容易解决。如果这些子任务仍难以解决,他们可以继续分解。通过不断分裂成几个简单的复杂的任务,你可以最终达到这一点,每个任务是可控的,如果不是微不足道的。
让我们来看一个例子。让我们说我们想写一个报告在胡萝卜。目前我们的任务层次结构如下:
写报告在胡萝卜
写一篇胡萝卜是一个相当大的任务做下来,所以让我们把它分解为子任务:
写报告在胡萝卜
研究胡萝卜
写提纲
填写大纲的详情胡萝卜
这是一个更可管理,因为我们现在有三个任务,我们就可以专注于单独。然而,在这种情况下,“做研究胡萝卜有点含糊的”,所以我们可以细分:
写报告在胡萝卜
研究胡萝卜
去图书馆和得到书胡萝卜
寻找信息在互联网,胡萝卜
写提纲
信息日益增长的
信息处理
营养信息
填写大纲的详情胡萝卜
现在我们有一个层次的任务,没有一个特别硬。通过完成每一种相对可控的目,我们可以完成更困难的总体任务写一篇胡萝卜。
其他的方法来创建一个层次的任务是这样做从下到上。在这个方法中,我们先从一个简单的任务列表,并建立层次结构由它们分组。
作为一个例子,许多人不得不去工作或学校在工作日,所以我们说我们想要解决问题的“获得从床上工作”。如果你是问你做什么工作在凌晨就从床上工作,您可能会使用以下列表:
挑选衣服
穿好衣服
吃早餐
开车上班
刷你的牙齿
离开床
准备早餐
在得到您的汽车
洗澡
使用自底向上方法,我们可以组织成一个层次结构的这些物品通过寻找方法来组织项目一起有相似之处:
获得从床上工作
卧室的东西
离开床
挑选衣服
浴室用品
洗澡
刷你的牙齿
早餐的事情
准备早餐
吃早餐
运输东西
在得到您的汽车
开车上班
事实证明,这些任务层次结构是非常有用的在程序设计中,因为一旦你有一个任务层次结构,实际上定义了结构的整体计划。顶级任务(在本例中,“写了一份关于胡萝卜”或“获得从床上工作”)成为主要()(因为它是主要的项目你想解决)。函数的子项成为程序。
如果事实证明的项目之一(功能)是太难以实现,只需把项目分成多个子项,函数调用的子函数集成到一个样,实施这些新的多重任务。最后你应该达到一个点,每个函数在程序中是微不足道的实现。
第四步:找出事件的顺序
现在,你的程序有一个结构,它的时间来确定如何链接在一起的所有任务。第一步是确定事件发生的顺序,将被执行。例如,当你早晨起床时,你做什么订单上面的任务吗?它可能看起来像这样:
离开床
挑选衣服
洗澡
穿好衣服
准备早餐
吃早餐
刷你的牙齿
在得到您的汽车
开车上班
如果我们编写一个计算器,我们可能做的事情在这个顺序:
从用户获得的第一个号码
数学运算得到从用户
得到第二个数字从用户
计算结果
打印结果
这个列表基本上定义了将进入你的main()函数:
或者对于计算器:
第五步:找出数据输入和输出的每个任务
一旦你有一个层次结构和一系列事件,接下来要做的就是找出输入数据每个任务需要操作,提供数据(如果有的话)。如果你已经输入的数据从一个前一步,输入数据将成为一个参数。如果你计算输出使用的一些其他功能,输出通常会成为一个返回值。
当我们完成后,我们应该为每一个函数原型。如果你已经忘记了,一个函数原型是一个函数的声明,包括函数的名称、参数和返回类型,但没有实现的功能。
让我们做了两个例子。GetUserInput()是相当简单的。我们会得到一个从用户数量并返回给调用者。因此,函数原型应该像这样:
在计算器的例子,CalculateResult()函数将需要3块输入:两个数字和数学运算符。我们应该已经拥有所有这三个我们言归正传,这个函数被调用,所以这三个数据块,将函数参数。这个CalculateResult()函数将计算结果值,但是它不显示结果本身。因此,我们需要返回这个结果作为返回值,以便其他功能可以使用它。
鉴于此,我们可以编写函数原型如下:
第六步:编写任务的详细信息
在这个步骤中,对每一项任务,你将它写的实际实现。如果你打破了任务分解成足够小的块,每个任务应该相当简单明了。如果一个给定的任务似乎仍然那些过于复杂,也许它需要被分解成子任务,这些子任务可以更容易实现。
例如:
第七步:连接数据输入和输出
最后,最后一步是接在每个任务的输入和输出的任何方式是适当的。例如,您可能的输出发送到一个输入CalculateResult()的(),所以PrintResult可以打印计算回答。这往往会涉及使用中介变量来临时存储结果,因此它可以之间传递函数。例如:
这往往是更可读的比选择压缩版本,不使用一个临时变量:
这通常是最困难的一步新程序员来鉴赏。
注意:全面完成这个示例,您将需要使用if语句,我们不会讨论一会儿,但是欢迎你去偷看在现在。
一个完全完成版本的上面的计算器示例如下(隐藏的如果你想要尝试它自己第一):
显示解决方案
建议在编写程序
保持你的程序简单的开始。通常新程序员有一个宏伟的抱负所有他们想要的东西他们的程序去做。“我想写一个角色扮演游戏和图形和声音和随机怪物和地下城,你可以参观一个小镇出售物品,你发现在地牢”如果你试着写一些太复杂的开始,你就会变得不安和沮丧在你缺乏进展。相反,让你的第一个目标尽可能的简单,这绝对是你力所能及的。例如,“我希望能够显示一个2 d表示屏幕上的世界”。
随着时间的增加功能。一旦你有你的简单的程序工作,工作得很好,那么你可以添加的功能。例如,一旦你可以显示你的2 d世界中,添加一个字符谁能四处走动。一旦你可以四处走走,增加墙,可以阻碍你的进步。一旦你的墙壁,构建一个简单的小镇。一旦你有一个小镇,加上商人。通过添加每个功能逐步程序将会变得越来越复杂过程中不会吓到你。
专注于一个地区在一个时间。不要试图代码一次性解决所有问题,不要分散你的注意力在多个任务。一次关注一个任务,并看到它通过完成尽可能多的是可能的。更好的方式是有一个完整的工作任务和五个,还没有开始呢比六部分工作任务。如果你将你的注意力,你更可能犯错,忘记重要的细节。
测试每一块代码当你走。新程序员经常会写一遍整个程序。然后当他们第一次编译,编译器报告数以百计的错误。这不仅可以是令人恐惧的,如果你的代码不工作,它可能很难找出原因。相反,编写一段代码,然后编译和测试它立即。如果它不工作,你就会清楚地知道,问题是,这将是容易修复。一旦你确信代码工作,移动到下一个块和重复。它可能需要更长的时间才能写完你的代码,但是当你完成整个事情应该工作的,你不必再花两倍的时间,试图找出为什么它不。
大多数新程序员会快捷很多这些步骤和建议(因为它似乎是一个大量的工作和/或它不是那么有趣编写代码)。然而,对于所有重要项目,遵循这些步骤一定会节省你大量的时间从长远来看。前面有点计划可以节省大量调试结束。
好消息是,一旦你习惯了所有这些概念,他们会开始自然你甚至不用去思考。最终你会去点,您可以编写整个函数没有任何前期规划在所有。
最重要的是要记住的(和最难的事情)是设计你的程序在你开始编码。在许多方面,编程就像架构。会发生什么如果你试图建造一座房子,不遵循一个架构的计划吗?赔率是,除非你很有天赋,最终将得到一个房子,有很多问题:屋顶漏水、墙面不直等…同样,如果你试图程序之前,您有一个好的足球前进,你可能会发现你的代码有很多问题,你得花很多时间解决问题,完全是可以避免与一个小设计。
一个小的预先计划将节省你的时间和挫折从长远来看。
步骤1:定义问题
你首先需要找出是什么问题你的程序正试图解决。理想情况下,您应该能够状态这一两句话。例如:
我想写一个电话簿应用程序来帮助我跟踪我的朋友的电话号码。
我想写一个随机的地牢发电机产生有趣的寻找洞穴。
我想写一个程序,将有关股票的信息,并试图预测哪些我应该买。
虽然这一步似乎是显而易见的,它也是非常重要的。最糟糕的事情你可以做的是编写一个程序,实际上并不做你(或你的老板)想要的!
第二步:定义你的目标
当你是一名有经验的程序员,有许多其他步骤,通常会发生在这一点上,包括:
了解你的目标用户是谁
定义目标架构和/或操作系统上运行你的程序
确定组工具时,您将使用
决定是否你将编写程序单独或作为团队的一部分
收集需求(一个记录列表的程序应该做什么)
然而,作为一个新程序员,这些问题的答案通常是简单的:你在写一个程序仅供您自己使用,在您自己的系统上,使用一个IDE你购买或下载。这使事情变得简单,所以我们不会花任何时间在这一步。
第三步:做一个等级秩序的任务
在现实生活中,我们常常需要执行的任务是非常复杂的。试图找出如何
b3b3
做这些任务可以非常具有挑战性的。在这种情况下,我们通常会使用自顶向下方法解决问题的。那是,而不是解决一个复杂的任务,我们打破这个任务分成多个的子任务,每个单独的容易解决。如果这些子任务仍难以解决,他们可以继续分解。通过不断分裂成几个简单的复杂的任务,你可以最终达到这一点,每个任务是可控的,如果不是微不足道的。
让我们来看一个例子。让我们说我们想写一个报告在胡萝卜。目前我们的任务层次结构如下:
写报告在胡萝卜
写一篇胡萝卜是一个相当大的任务做下来,所以让我们把它分解为子任务:
写报告在胡萝卜
研究胡萝卜
写提纲
填写大纲的详情胡萝卜
这是一个更可管理,因为我们现在有三个任务,我们就可以专注于单独。然而,在这种情况下,“做研究胡萝卜有点含糊的”,所以我们可以细分:
写报告在胡萝卜
研究胡萝卜
去图书馆和得到书胡萝卜
寻找信息在互联网,胡萝卜
写提纲
信息日益增长的
信息处理
营养信息
填写大纲的详情胡萝卜
现在我们有一个层次的任务,没有一个特别硬。通过完成每一种相对可控的目,我们可以完成更困难的总体任务写一篇胡萝卜。
其他的方法来创建一个层次的任务是这样做从下到上。在这个方法中,我们先从一个简单的任务列表,并建立层次结构由它们分组。
作为一个例子,许多人不得不去工作或学校在工作日,所以我们说我们想要解决问题的“获得从床上工作”。如果你是问你做什么工作在凌晨就从床上工作,您可能会使用以下列表:
挑选衣服
穿好衣服
吃早餐
开车上班
刷你的牙齿
离开床
准备早餐
在得到您的汽车
洗澡
使用自底向上方法,我们可以组织成一个层次结构的这些物品通过寻找方法来组织项目一起有相似之处:
获得从床上工作
卧室的东西
离开床
挑选衣服
浴室用品
洗澡
刷你的牙齿
早餐的事情
准备早餐
吃早餐
运输东西
在得到您的汽车
开车上班
事实证明,这些任务层次结构是非常有用的在程序设计中,因为一旦你有一个任务层次结构,实际上定义了结构的整体计划。顶级任务(在本例中,“写了一份关于胡萝卜”或“获得从床上工作”)成为主要()(因为它是主要的项目你想解决)。函数的子项成为程序。
如果事实证明的项目之一(功能)是太难以实现,只需把项目分成多个子项,函数调用的子函数集成到一个样,实施这些新的多重任务。最后你应该达到一个点,每个函数在程序中是微不足道的实现。
第四步:找出事件的顺序
现在,你的程序有一个结构,它的时间来确定如何链接在一起的所有任务。第一步是确定事件发生的顺序,将被执行。例如,当你早晨起床时,你做什么订单上面的任务吗?它可能看起来像这样:
离开床
挑选衣服
洗澡
穿好衣服
准备早餐
吃早餐
刷你的牙齿
在得到您的汽车
开车上班
如果我们编写一个计算器,我们可能做的事情在这个顺序:
从用户获得的第一个号码
数学运算得到从用户
得到第二个数字从用户
计算结果
打印结果
这个列表基本上定义了将进入你的main()函数:
int main() { GetOutOfBed(); PickOutClothes(); TakeAShower(); GetDressed(); PrepareBreakfast(); EatBreakfast(); BrushTeeth(); GetInCar(); DriveToWork(); }
或者对于计算器:
int main() { // Get first number from user GetUserInput(); // Get mathematical operation from user GetMathematicalOperation(); // Get second number from user GetUserInput(); // Calculate result CalculateResult(); // Print result PrintResult(); }
第五步:找出数据输入和输出的每个任务
一旦你有一个层次结构和一系列事件,接下来要做的就是找出输入数据每个任务需要操作,提供数据(如果有的话)。如果你已经输入的数据从一个前一步,输入数据将成为一个参数。如果你计算输出使用的一些其他功能,输出通常会成为一个返回值。
当我们完成后,我们应该为每一个函数原型。如果你已经忘记了,一个函数原型是一个函数的声明,包括函数的名称、参数和返回类型,但没有实现的功能。
让我们做了两个例子。GetUserInput()是相当简单的。我们会得到一个从用户数量并返回给调用者。因此,函数原型应该像这样:
int GetUserInput()
在计算器的例子,CalculateResult()函数将需要3块输入:两个数字和数学运算符。我们应该已经拥有所有这三个我们言归正传,这个函数被调用,所以这三个数据块,将函数参数。这个CalculateResult()函数将计算结果值,但是它不显示结果本身。因此,我们需要返回这个结果作为返回值,以便其他功能可以使用它。
鉴于此,我们可以编写函数原型如下:
int CalculateResult(int,int nInput1,char chOperator nInput2);
第六步:编写任务的详细信息
在这个步骤中,对每一项任务,你将它写的实际实现。如果你打破了任务分解成足够小的块,每个任务应该相当简单明了。如果一个给定的任务似乎仍然那些过于复杂,也许它需要被分解成子任务,这些子任务可以更容易实现。
例如:
char GetMathematicalOperation() { cout << "Please enter an operator (+,-,*,or /): "; char chOperation; cin >> chOperation; // What if the user enters an invalid character? // We'll ignore this possibility for now return chOperation; }
第七步:连接数据输入和输出
最后,最后一步是接在每个任务的输入和输出的任何方式是适当的。例如,您可能的输出发送到一个输入CalculateResult()的(),所以PrintResult可以打印计算回答。这往往会涉及使用中介变量来临时存储结果,因此它可以之间传递函数。例如:
/ / nResult是一个临时值用来转移CalculateResult的输出() / /进入一个输入的PrintResult() int nResult = CalculateResult(nInput1,chOperator,nInput2); PrintResult(nResult);
这往往是更可读的比选择压缩版本,不使用一个临时变量:
PrintResult(CalculateResult(nInput1,chOperator,nInput2));
这通常是最困难的一步新程序员来鉴赏。
注意:全面完成这个示例,您将需要使用if语句,我们不会讨论一会儿,但是欢迎你去偷看在现在。
一个完全完成版本的上面的计算器示例如下(隐藏的如果你想要尝试它自己第一):
显示解决方案
建议在编写程序
保持你的程序简单的开始。通常新程序员有一个宏伟的抱负所有他们想要的东西他们的程序去做。“我想写一个角色扮演游戏和图形和声音和随机怪物和地下城,你可以参观一个小镇出售物品,你发现在地牢”如果你试着写一些太复杂的开始,你就会变得不安和沮丧在你缺乏进展。相反,让你的第一个目标尽可能的简单,这绝对是你力所能及的。例如,“我希望能够显示一个2 d表示屏幕上的世界”。
随着时间的增加功能。一旦你有你的简单的程序工作,工作得很好,那么你可以添加的功能。例如,一旦你可以显示你的2 d世界中,添加一个字符谁能四处走动。一旦你可以四处走走,增加墙,可以阻碍你的进步。一旦你的墙壁,构建一个简单的小镇。一旦你有一个小镇,加上商人。通过添加每个功能逐步程序将会变得越来越复杂过程中不会吓到你。
专注于一个地区在一个时间。不要试图代码一次性解决所有问题,不要分散你的注意力在多个任务。一次关注一个任务,并看到它通过完成尽可能多的是可能的。更好的方式是有一个完整的工作任务和五个,还没有开始呢比六部分工作任务。如果你将你的注意力,你更可能犯错,忘记重要的细节。
测试每一块代码当你走。新程序员经常会写一遍整个程序。然后当他们第一次编译,编译器报告数以百计的错误。这不仅可以是令人恐惧的,如果你的代码不工作,它可能很难找出原因。相反,编写一段代码,然后编译和测试它立即。如果它不工作,你就会清楚地知道,问题是,这将是容易修复。一旦你确信代码工作,移动到下一个块和重复。它可能需要更长的时间才能写完你的代码,但是当你完成整个事情应该工作的,你不必再花两倍的时间,试图找出为什么它不。
大多数新程序员会快捷很多这些步骤和建议(因为它似乎是一个大量的工作和/或它不是那么有趣编写代码)。然而,对于所有重要项目,遵循这些步骤一定会节省你大量的时间从长远来看。前面有点计划可以节省大量调试结束。
好消息是,一旦你习惯了所有这些概念,他们会开始自然你甚至不用去思考。最终你会去点,您可以编写整个函数没有任何前期规划在所有。
相关文章推荐
- 如何设计你的第一个程序
- 1.10a – 如何设计你的第一个程序
- 《如何运行第一个C/C++语言程序》
- 如何编译第一个uefi程序【转载】
- 第一个c++的小程序
- 如何用CodeBlocks分多个文件编写一个C++程序
- C02-程序设计基础提高班(C++)第4周上机任务
- 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
- C++如何修改SDI程序的默认背景颜色
- c++第一个小程序
- PKU C++程序设计实习 学习笔记3 多态与虚函数
- 如何在Linux使用Eclipse + CDT开发C/C++程序?
- 如何解决Linux下Qt Creator调试C/C++程序出现Debugging starts &"warning: GDB: Failed to set controlling terminal警告
- linux下如何用GDB调试c++程序
- C++如何设计只实例化一次的类?
- 如何运行第一个C|C++语言程序
- linux下如何用GDB调试c++程序
- PAT程序设计考题——甲级1045 (最长不下降子序列) C++实现
- 通过C++程序示例理解设计模式中的外观模式
- 如何运行C++ STL程序