伪·从零开始学算法 - 1.5 程序的设计和绘制流程图的注意事项

读懂算法之后,我们可以试着自己设计算法。不过一般来说,我们是在设计程序,而且“设计程序”比“设计算法”范围更广。因此,在本节我讲的是“设计程序”,其中有“设计算法”的部分。顺便说一下绘制流程图的注意事项。

程序设计的步骤

一般来说,程序设计的完整步骤如下:

  1. 分析问题:分析问题的计算部分
  2. 确定问题:将计算部分划分为确定的IPO三部分
  3. 设计算法:完成计算部分的核心处理方法
  4. 编写程序:实现整个程序
  5. 调试测试:使程序在各种情况下都能够正确运行
  6. 升级维护:使程序长期正确运行,适应需求的微小变化

这里面的IPO不是“首次公开上市”的意思,而是一套算法包括的输入(Input)、处理(Process)和输出(Output)三个部分。虽然对于编译器或解释器来说,三个部分都不是必要的,但是对于大多数实用、有价值的算法,三个部分都是必要的。

接下来,我对各个步骤进行讲解。

分析、确定问题

算法为解决实际问题而设计。因此,在设计算法之前,我们应当搞清实际问题的输入、处理和输出是什么,尤其是处理过程,即问题的计算特性。

问题的计算特性

说实话,这两部分不难,和做数学题一样丝滑(并不)。

设计算法

根据分析结果设计算法。

设计算法的时候首先以人的思维来列出基本的算法步骤,再代入机器的思维,想想机器应该怎么做。

记住,对于一个问题的算法不止一种。如果有需要,还要考虑有没有更简单快捷的算法,以节约时间、最大化机器性能。

最著名的例子就是排序算法。排序算法百花齐放,常用的就有7个;而它们的效率也是各有千秋。

24种排序算法的可视化比较,B站av14429343

一般来说,前三个步骤在脑内即可完成。如果需要记下来,一般以代码(这就已经完成第四步了)、伪代码或流程图标明,视个人爱好而定。

编写程序

如果设计出了算法,并且你对将要使用的程序语言十分了解,编写程序就不是什么难事了。

但是,对于不同的语言,由于支持的逻辑结构、功能不同,可能需要改变算法的细节内容。

调试测试

这一步主要是检查程序运行的效果,如果有问题,修改,再检查。

程序需要很好地检查输入的数据。数据类型错误、数字的大小错误等都会带来严重的后果。比如说,在处理输入数值的时候,应当把字符串转换为数字;去掉空格;不能转换的,应当提示错误,让用户重新输入……

程序也需要考虑多种特殊情况。比如说计算日出日落时间,就要考虑极昼极夜的情况。

这种事情一考虑就要费很长时间,其实在设计算法的时候就要考虑到。

我突然想起来一个关于测试工程师的笑话。

作者:今日飞雪
链接: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或功能的过程。简单说就是“写程序→调试”的循环。

结构程序设计的基本方法

这一部分的描述适用于比较大的面向过程的程序设计。一般来说有两种方法:

  • 自顶而下、逐步求精的设计方法
    采取逐步分解、逐步求精的方法。先从总体入手,保证程序员把经历集中在主要问题上,而暂不考虑细节;然后把问题逐步分解为几个部分,每一部分都针对上一部分的某个问题使之精细化,直到能方便地写出简洁而严谨的结构程序为止。这种方法符合人们解决复杂问题的普遍规律,因此可显著提高软件开发的成功率和生产率。而且,由这种方法开发的软件有清晰的层次结构,易读、易理解、易维护。
  • 模块化设计方法
    把问题的处理过程按功能和需要分解为若干块——模块,每一个大的模块可以分解为若干个小的模块——子模块。各模块的程序功能应是相互独立的。因此可分别设计、编程、调试和运行。各模块之间又可以通过一定的逻辑关系连接起来。

绘制流程图的注意事项

对于流程图的知识我在之前也讲了不少了。

它的画法一般来说就是从上到下。从左到右也可以,看纸张的大小和图片周围的环境吧。

在绘制的时候最好遵循基本的逻辑结构,这样也有助于接下来写程序。

要注意空间大小,如果只有纸笔的话最好先打草稿。

另外,流程图的一个流程可以分解为若干个小流程,多个流程也可以合并为一个大流程。这主要取决于侧重面和语言能够实现的功能。同时,流程图的细化和简并也可以使结构条理更加明晰。

流程图的细化

参考资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,429评论 25 707
  • 时间是一把戳穿虚伪的刀,它验证了谎言,揭露了现实。 有心在一起的人,再大的吵闹也会各自找台阶,速度重归...
    萧无名阅读 678评论 0 1
  • 已经有20多年没有如此登楼了。 那时的我,待字闺中。二楼东厢房里一面大大的镜子,爸爸送给我的。镜子边还用贵州蓝底白...
    禅静一生阅读 773评论 2 12
  • 慵懒的阳光,欠我一个明天 可是并不期待,因为习惯了暗翳 习惯了生活在过去, 挺好的! 或许这所追求的一切都是空...
    阡陌流年丶阅读 164评论 0 0