C++-程序设计实现
2017-04-01 16:24
232 查看
当我们有一个新的idea或者拿到用户需求的时候,常常会对怎样将其转化为代码而感到困惑。到底程序要解决哪些问题?模拟那些场景?在本文中,我们一起探讨一些这个问题。
俗话说,未雨绸缪,而事半功倍。是的,在编程之前,我们必须充分地设计我们的程序。因为,程序的架构往往直接决定了程序的质量。再说,好的前期规划,也可以节省你的时间,还可以减少你的挫折感(ps:每个程序员都有过编程到一半返工的事情吧?)。
那么,我们简单总结一下,大致可以分为这几步:
写一个电话簿应用程序,管理我的通讯录;
写一个迷宫程序,寻找迷宫;
写一个从网上读取股票信息,然后预测该买哪一只股票的程序;
尽管,这一步看上去如此多余,却是很重要的。最坏的事情就是你的程序与你本来的目的不符,或者不能满足你的boss的要求。
理解你的目标用户是谁,以及他们想要什么;
选择目标硬件架构,是否带有OS操作系统;
选择使用的工具集;
决定是独自程序还是成立一个team;
收集需求(用文档列出程序需要实现哪些功能);
决定你的测试、反馈、发布策略;
决定怎样备份代码;
当然了,作为一个新人,这些问题的答案就非常简单了:目标用户就是自己,独立开发,运行在自己的系统上,使用的工具是你自己购买或者下载的IDE,你的代码除了你自己外别人不会使用。这就使得问题变得简单了。
即便如此,你也应该备份代码。仅仅是在你机器的另一个本地位置,zip或者拷贝一份,那是不够的,虽然聊胜于无。如果你的系统崩了,就后悔莫及了。最好的备份策略就是,在你的系统之外备份。其实,有很多简单的办法可以实现:Email,云服务器,FTP服务器,github等等。
举例说明,假设我们为胡萝卜写一份报告。现在,看起来我的报告结构应该是这样:
写关于胡萝卜的报告;
一次写一个关于胡萝卜的报告,是一个相当大的任务,所以让我们把它分解成子任务:
写关于胡萝卜的报告
调研胡萝卜
写大纲
根据大纲填充胡萝卜的详细信息
添加目录表
这就比较容易处理了。但是,我们发现调研胡萝卜是一个模糊的概念。于是,我们继续划分这个子任务:
写关于胡萝卜的报告
调研胡萝卜
去图书馆,查阅相关书籍
在互联网上查找胡萝卜的信息
从参考文献中记录相关信息的片段
写大纲
种植信息
加工信息
营养信息
根据大纲填充胡萝卜的详细信息
添加目录表
现在,我们就有了任务的层次结构,他们中没有特别困难的。通过完成这些相对不难的子项目,我们就完成了“写关于胡萝卜”相对艰巨的大任务。
还有一种方法就是“自下而上”。在这个方法中,我们先是对简单任务做一个列表,然后将它们进行组合,构筑层次结构。
挑选衣服
穿上衣服
吃早餐
开车上班
刷牙
起床
准备早餐
上车
沐浴
使用“自下而上”的方法,就是通过寻找它们的相似性把它们组织起来。
起床上班
卧室
起床
挑选衣服
穿好衣服
盥洗室
沐浴
刷牙
早餐
准备早餐
吃早餐
交通
上车
开车上班
事实证明,这些任务层次结构在编程中是非常有用的,因为任务的划分往往从根本上定义了程序的结构。顶层任务(在这儿,指“写关于胡萝卜的报告”或“起床上班”)就成了main()函数(因为它是你试图去解决的主要问题),那么,自然而然的,子任务也就成了程序的函数。
如果其中的某个子函数太难实现,就把它再细分为子子函数。
第一步,就是确定这些事件执行的先后顺序。例如,当我们早上起床,上面这些任务的顺序是什么呢?看起来应该是这样:
起床
挑衣服
淋浴
穿衣服
准备早餐
吃早餐
刷牙
上车
开车上班
如果你打算写一个计算器,可能会按照下面的顺序进行:
得到第一个数字
得到数学操作符
得到第二个数字
计算结果
打印结果
这也就定了你的main()的内容:
对于计算器,main()实现如下:
比如上面的计算器任务,可能就会这样:
对于计算器的计算结果,我们可以声明这样的函数原型:
俗话说,未雨绸缪,而事半功倍。是的,在编程之前,我们必须充分地设计我们的程序。因为,程序的架构往往直接决定了程序的质量。再说,好的前期规划,也可以节省你的时间,还可以减少你的挫折感(ps:每个程序员都有过编程到一半返工的事情吧?)。
那么,我们简单总结一下,大致可以分为这几步:
1、分析问题
首要的问题就是,搞清楚你到底要解决什么问题。理想的情况就是,你能用一两句话描述完整问题。例如:写一个电话簿应用程序,管理我的通讯录;
写一个迷宫程序,寻找迷宫;
写一个从网上读取股票信息,然后预测该买哪一只股票的程序;
尽管,这一步看上去如此多余,却是很重要的。最坏的事情就是你的程序与你本来的目的不符,或者不能满足你的boss的要求。
2、选择工具,制定目标和备份计划
当你成为一个有经验的程序员后,在这一步,你需要完成许多工作,包含:理解你的目标用户是谁,以及他们想要什么;
选择目标硬件架构,是否带有OS操作系统;
选择使用的工具集;
决定是独自程序还是成立一个team;
收集需求(用文档列出程序需要实现哪些功能);
决定你的测试、反馈、发布策略;
决定怎样备份代码;
当然了,作为一个新人,这些问题的答案就非常简单了:目标用户就是自己,独立开发,运行在自己的系统上,使用的工具是你自己购买或者下载的IDE,你的代码除了你自己外别人不会使用。这就使得问题变得简单了。
即便如此,你也应该备份代码。仅仅是在你机器的另一个本地位置,zip或者拷贝一份,那是不够的,虽然聊胜于无。如果你的系统崩了,就后悔莫及了。最好的备份策略就是,在你的系统之外备份。其实,有很多简单的办法可以实现:Email,云服务器,FTP服务器,github等等。
3、任务划分
其实,写代码就像生活中遇到的一些困难,常常让我们头疼,不知道怎么实现。每当这时,我们应该选择“自顶向下”的问题解决策略:相比解决一个大问题,不如把它划分为多个子任务;如果子任务还是很难实现,那么就继续划分子子任务;……;直到每一个独立的任务都是易实现的(当然了,这儿指的可不是特别琐碎的任务)。举例说明,假设我们为胡萝卜写一份报告。现在,看起来我的报告结构应该是这样:
写关于胡萝卜的报告;
一次写一个关于胡萝卜的报告,是一个相当大的任务,所以让我们把它分解成子任务:
写关于胡萝卜的报告
调研胡萝卜
写大纲
根据大纲填充胡萝卜的详细信息
添加目录表
这就比较容易处理了。但是,我们发现调研胡萝卜是一个模糊的概念。于是,我们继续划分这个子任务:
写关于胡萝卜的报告
调研胡萝卜
去图书馆,查阅相关书籍
在互联网上查找胡萝卜的信息
从参考文献中记录相关信息的片段
写大纲
种植信息
加工信息
营养信息
根据大纲填充胡萝卜的详细信息
添加目录表
现在,我们就有了任务的层次结构,他们中没有特别困难的。通过完成这些相对不难的子项目,我们就完成了“写关于胡萝卜”相对艰巨的大任务。
还有一种方法就是“自下而上”。在这个方法中,我们先是对简单任务做一个列表,然后将它们进行组合,构筑层次结构。
挑选衣服
穿上衣服
吃早餐
开车上班
刷牙
起床
准备早餐
上车
沐浴
使用“自下而上”的方法,就是通过寻找它们的相似性把它们组织起来。
起床上班
卧室
起床
挑选衣服
穿好衣服
盥洗室
沐浴
刷牙
早餐
准备早餐
吃早餐
交通
上车
开车上班
事实证明,这些任务层次结构在编程中是非常有用的,因为任务的划分往往从根本上定义了程序的结构。顶层任务(在这儿,指“写关于胡萝卜的报告”或“起床上班”)就成了main()函数(因为它是你试图去解决的主要问题),那么,自然而然的,子任务也就成了程序的函数。
如果其中的某个子函数太难实现,就把它再细分为子子函数。
4、解决事件的先后顺序
好了,到现在,我们已经知道要做哪些事情了。那么,我们怎样把这些任务串联起来呢?第一步,就是确定这些事件执行的先后顺序。例如,当我们早上起床,上面这些任务的顺序是什么呢?看起来应该是这样:
起床
挑衣服
淋浴
穿衣服
准备早餐
吃早餐
刷牙
上车
开车上班
如果你打算写一个计算器,可能会按照下面的顺序进行:
得到第一个数字
得到数学操作符
得到第二个数字
计算结果
打印结果
这也就定了你的main()的内容:
int main() { getOutOfBed(); pickOutClothes(); takeAShower(); getDressed(); prepareBreakfast(); eatBreakfast(); brushTeeth(); getInCar(); driveToWork(); }
对于计算器,main()实现如下:
int main() { // 得到第一个数字 getUserInput(); // 得到数学操作符 getMathematicalOperation(); // 得到第二个数字 getUserInput(); // 计算结果 calculateResult(); // 打印结果 printResult();
5、确立每个任务的输入和输出
因为,这儿举例比较简单,就是每个函数的输入和输出。对于比较大的系统,就是任务间通信,因为每一个任务不可能都是独立存在的,必然存在着某种联系,所以,每个任务都有输出和输出。比如上面的计算器任务,可能就会这样:
int getUserInput();
对于计算器的计算结果,我们可以声明这样的函数原型:
int calculateResult(int input1, int op, int input2);
6、写程序、调试、验证
这一步是我们每一个coder的职责了,要不然怎么会被称为码农呢?这里就不详述了。相关文章推荐
- PAT程序设计考题——甲级1007 (最大连续子序列和) C++实现
- PAT程序设计考题——甲级1040 (最长回文串) C++实现
- PAT程序设计考题——甲级1030(Travel Plan) C++实现
- C++实现的Huffman压缩解压缩程序及相应程序框架的设计
- PAT程序设计考题——甲级1043(Is It a Binary Search Tree ) C++实现
- PAT程序设计考题——甲级1045 (最长不下降子序列) C++实现
- PAT程序设计考题——甲级1006(Sign In and Sign Out ) C++实现
- PAT程序设计考题——甲级1031(Hello World for U) C++实现
- PAT程序设计考题——甲级1107( Social clusters并查集) C++实现
- PAT程序设计考题——甲级1058(A+B in Hogwarts ) C++实现
- PAT程序设计考题——甲级1068 (背包问题) C++实现
- 程序基础设计模式的解析和实现(C++)之二十-Visitor模式
- PAT程序设计考题——甲级1002(A+B for Polynomials ) C++实现
- PAT程序设计考题——甲级1003(Emergency ) C++实现
- PAT程序设计考题——甲级1066(Root of AVL Tree ) C++实现
- PAT程序设计考题——甲级1005( Spell It Right ) C++实现
- PAT程序设计考题——甲级1027(Colors in Mars ) C++实现
- PAT程序设计考题——甲级1017(Queueing at Bank ) C++实现
- PAT程序设计考题——甲级1014( Waiting in Line ) C++实现
- PAT程序设计考题——甲级1019( General Palindromic Number ) C++实现