美文网首页
伪·从零开始学算法 - 1.3 流程图

伪·从零开始学算法 - 1.3 流程图

作者: 阿啊阿吖丁 | 来源:发表于2018-02-17 23:09 被阅读41次

    简介

    流程图是描述算法的工具之一。人教版高中数学课本上称其为“程序框图”。它是一种用规定的图形、指向线及文字说明来准确、直观地表示算法的图形。

    目前最常用的流程图的符号由美国国家标准学会(American National Standards Institute, ANSI)于20世纪60年代规范标准,1970年,国际标准化组织(International Organization for Standardization, ISO)采纳了ANSI制定的符号。目前的标准于1985年修改。

    流程图的基本符号

    如果不包括流程线,有四大最基本的符号:

    终端框(起止框):符号为胶囊状矩形。表示一个算法的开始或结束。上面的文字一般只是“开始”或“结束”,也可以是触发算法开始的操作或者是提交、传值等将值传给下一个算法的操作。

    终端框

    输入、输出框:符号为平行四边形。表示一个算法输入和输出的信息。一般来说文字的开头要注明“输入”或“输出”。

    输入、输出框

    处理框(执行框):符号为矩形。表示一个赋值、计算等操作。文字注明具体操作。

    处理框

    判断框:符号为菱形。表示判断某条件是否成立。一般来说,它有两个分支,条件成立与否之后的流程在分支线处标明“是”“否”或“Y”“N”。对于不是判断某条件是否成立,而是判断某个表达式的值的情况(如C、Javascript的switch语句),目前没有规定的画法。我一般的做法是在分支处标明值。

    判断框

    流程线(指向线):流程图各符号之间以有向单向线连接。线一般要求横平竖直,可以有若干个90°的转弯。流程线尽量不要交叉,当两条流程线不得已而交叉时,将其中一条流程线的交叉处用圆弧隔开。标准规定,如果不是从上到下、从左到右,流程线的箭头是必需的。但是,一般来说,在任何情况下都要画出流程线的箭头。

    流程线

    此外还有一些不太常用的符号:

    连接点/连接符/页面内引用:符号为圆形。用于将流程图中的各个元素连接起来,可以在流程图过于复杂、流程线过长或可能会发生混淆的情况下使用。

    连接点

    具体操作是:流程图分裂开来,分裂时通常从流程图的某一条流程线处分开,并在此流程线处标注分裂号,同时在另一流程图的入口位置标注同样的分裂号,以表示两个流程图在此标号处连接。如图:

    连接点用例

    跨页引用/页面外引用:符号为上面为方的五边形。当流程图太长以至于需要断开成多页,可以在前页的结尾和后页的开头插入。我没找到它的详细用法,可能和连接点的用法相似。事实上也有人使用连接点执行上述职能。

    跨页引用 跨页引用用例

    注释:如图所示,为块做注释。

    注释,从一处理框引出

    子流程/子程序/预定义流程:符号为左右各有一条竖线的矩形。这种符号一般用于比较庞大的工程中,用以分割基本功能。

    子流程

    此外还有一些极少用的符号,这里就不再赘述。一般来说,了解上面的符号,95%以上的流程图就能够掌握了。

    流程图的画法

    一般来说,流程图是从上到下、从左到右画的。竖版和横版都可以,但竖版更为常见。

    为了美观大方,更能体现流程,流程图应该条理层次清晰,各块不重叠、大小和间距尽量相同。流程线尽量不交叉,横平竖直。

    其实,在上面的“连接点用例”中,我们已经看到了一个流程图的例子。即使我没有教后面的内容,我想你们也能够比较清楚它的执行过程了吧(sqrt(x)是x的算术平方根,*是乘号,/是除号)。

    一般来说,如果在纸上画流程图,最好事先打草稿,以免构图时遇到困扰。在电脑上画流程图有(但不限于)以下软件或网站:

    • Microsoft Visio(Windows,流程图只是其功能之一)
    • OmniGraffle(macOS)
    • yEd(跨平台)
    • Inkscape(跨平台,流程图只是其功能之一)
    • ProcessOn(网站)

    我用过Visio和ProcessOn,感觉还行。

    Visio ProcessOn

    此外,一些使用Markdown的平台(如Typora)有基于flowchart.js、mermaid的流程图引擎,可以通过特定的语法生成流程图。

    我在这里以flowchart为例:

    st=>start: 开始
    e=>end: 结束
    input=>inputoutput: 输入a、b
    output=>inputoutput: 输出max
    cond1=>condition: a ≥ b?
    op1=>operation: max = a
    op2=>operation: max = b
    
    st->input->cond1
    cond1(yes)->op1->output
    cond1(no)->op2->output
    output->e
    
    flowchart.js生成结果

    参考资料

    相关文章

      网友评论

          本文标题:伪·从零开始学算法 - 1.3 流程图

          本文链接:https://www.haomeiwen.com/subject/ndwstftx.html