读懂算法之后,我们可以试着自己设计算法。不过一般来说,我们是在设计程序,而且“设计程序”比“设计算法”范围更广。因此,在本节我讲的是“设计程序”,其中有“设计算法”的部分。顺便说一下绘制流程图的注意事项。
程序设计的步骤
一般来说,程序设计的完整步骤如下:
- 分析问题:分析问题的计算部分
- 确定问题:将计算部分划分为确定的IPO三部分
- 设计算法:完成计算部分的核心处理方法
- 编写程序:实现整个程序
- 调试测试:使程序在各种情况下都能够正确运行
- 升级维护:使程序长期正确运行,适应需求的微小变化
这里面的IPO不是“首次公开上市”的意思,而是一套算法包括的输入(Input)、处理(Process)和输出(Output)三个部分。虽然对于编译器或解释器来说,三个部分都不是必要的,但是对于大多数实用、有价值的算法,三个部分都是必要的。
接下来,我对各个步骤进行讲解。
分析、确定问题
算法为解决实际问题而设计。因此,在设计算法之前,我们应当搞清实际问题的输入、处理和输出是什么,尤其是处理过程,即问题的计算特性。
说实话,这两部分不难,和做数学题一样丝滑(并不)。
设计算法
根据分析结果设计算法。
设计算法的时候首先以人的思维来列出基本的算法步骤,再代入机器的思维,想想机器应该怎么做。
记住,对于一个问题的算法不止一种。如果有需要,还要考虑有没有更简单快捷的算法,以节约时间、最大化机器性能。
最著名的例子就是排序算法。排序算法百花齐放,常用的就有7个;而它们的效率也是各有千秋。
一般来说,前三个步骤在脑内即可完成。如果需要记下来,一般以代码(这就已经完成第四步了)、伪代码或流程图标明,视个人爱好而定。
编写程序
如果设计出了算法,并且你对将要使用的程序语言十分了解,编写程序就不是什么难事了。
但是,对于不同的语言,由于支持的逻辑结构、功能不同,可能需要改变算法的细节内容。
调试测试
这一步主要是检查程序运行的效果,如果有问题,修改,再检查。
程序需要很好地检查输入的数据。数据类型错误、数字的大小错误等都会带来严重的后果。比如说,在处理输入数值的时候,应当把字符串转换为数字;去掉空格;不能转换的,应当提示错误,让用户重新输入……
程序也需要考虑多种特殊情况。比如说计算日出日落时间,就要考虑极昼极夜的情况。
这种事情一考虑就要费很长时间,其实在设计算法的时候就要考虑到。
我突然想起来一个关于测试工程师的笑话。
作者:今日飞雪
链接:https://www.zhihu.com/question/20034686/answer/52063718
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。一个测试工程师走进一家酒吧,要了一杯啤酒
一个测试工程师走进一家酒吧,要了一杯咖啡
一个测试工程师走进一家酒吧,要了0.7杯啤酒
一个测试工程师走进一家酒吧,要了-1杯啤酒
一个测试工程师走进一家酒吧,要了2^32杯啤酒
一个测试工程师走进一家酒吧,要了一杯洗脚水
一个测试工程师走进一家酒吧,要了一杯蜥蜴
一个测试工程师走进一家酒吧,要了一份asdfQwer@24dg!&*(@
一个测试工程师走进一家酒吧,什么也没要
一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来
一个测试工程师走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿
一个测试工程师走进一
一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷
————首次在知乎这么多赞(๑´ω`๑)————
从评论里补充几个
一个测试工程师走进一家酒吧,要了NaN杯Null
1T测试工程师冲进一家酒吧,要了500T啤酒咖啡洗脚水野猫狼牙棒奶茶
1T测试工程师把酒吧拆了
一个测试工程师化装成老板走进一家酒吧,要了500杯啤酒并且不付钱
一万个测试工程师在酒吧门外呼啸而过
一个测试工程师走进一家酒吧,要了一杯啤酒';DROP TABLE 酒吧
-------------------Jul 14,2016 更新大结局--------------------------
测试工程师们满意地离开了酒吧。然后一名顾客点了一份炒饭,酒吧炸了
还有一张图:
升级维护
这实际上是一个修改bug或功能的过程。简单说就是“写程序→调试”的循环。
结构程序设计的基本方法
这一部分的描述适用于比较大的面向过程的程序设计。一般来说有两种方法:
-
自顶而下、逐步求精的设计方法
采取逐步分解、逐步求精的方法。先从总体入手,保证程序员把经历集中在主要问题上,而暂不考虑细节;然后把问题逐步分解为几个部分,每一部分都针对上一部分的某个问题使之精细化,直到能方便地写出简洁而严谨的结构程序为止。这种方法符合人们解决复杂问题的普遍规律,因此可显著提高软件开发的成功率和生产率。而且,由这种方法开发的软件有清晰的层次结构,易读、易理解、易维护。 -
模块化设计方法
把问题的处理过程按功能和需要分解为若干块——模块,每一个大的模块可以分解为若干个小的模块——子模块。各模块的程序功能应是相互独立的。因此可分别设计、编程、调试和运行。各模块之间又可以通过一定的逻辑关系连接起来。
绘制流程图的注意事项
对于流程图的知识我在之前也讲了不少了。
它的画法一般来说就是从上到下。从左到右也可以,看纸张的大小和图片周围的环境吧。
在绘制的时候最好遵循基本的逻辑结构,这样也有助于接下来写程序。
要注意空间大小,如果只有纸笔的话最好先打草稿。
另外,流程图的一个流程可以分解为若干个小流程,多个流程也可以合并为一个大流程。这主要取决于侧重面和语言能够实现的功能。同时,流程图的细化和简并也可以使结构条理更加明晰。
参考资料
- 【计算机语言】零基础学python语言(北京理工大学)_演讲•公开课_科技_bilibili_哔哩哔哩
https://www.bilibili.com/video/av14634659/ - 广播电视中专教材 计算机应用基础. 江苏科学技术出版社
- 2分钟看完24种算法_数码_科技_bilibili_哔哩哔哩
https://www.bilibili.com/video/av14429343/ - 计算机领域有哪些经典的典故或笑话? - 知乎
https://www.zhihu.com/question/20034686/answer/52063718
(作者:今日飞雪) - 在程序员的眼里,用户是这样使用他们开发的软件的 : 经理人分享
http://www.managershare.com/post/144556