您的位置:首页 > 编程语言 > C语言/C++

C++-程序设计实现

2017-04-01 16:24 232 查看
当我们有一个新的idea或者拿到用户需求的时候,常常会对怎样将其转化为代码而感到困惑。到底程序要解决哪些问题?模拟那些场景?在本文中,我们一起探讨一些这个问题。

俗话说,未雨绸缪,而事半功倍。是的,在编程之前,我们必须充分地设计我们的程序。因为,程序的架构往往直接决定了程序的质量。再说,好的前期规划,也可以节省你的时间,还可以减少你的挫折感(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的职责了,要不然怎么会被称为码农呢?这里就不详述了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息