流程图 - 绘制GOTO的一种方式?

时间:2014-09-29 09:52:09

标签: language-agnostic goto flowchart

背景:我继承了一个概念验证项目,该项目为用户提供了一个绘图画布,可在其上构建流程图。然后它尝试从流程图中生成一些过程代码。

我严重怀疑这是否能真正成功,部分原因是因为有太多的错误,但从根本上是因为......

问题:流程图不仅仅是绘制GOTO的一种方式吗?因此,从流程图生成结构良好的过程代码并不一定困难吗?

2 个答案:

答案 0 :(得分:0)

这是我自己的答案,我不会接受(至少几周)因为我真的想要别人的意见。

使用流程图表示的算法更类似于使用goto编写的代码而不是结构化语言(如C#,Pascal或Java)。

流程图连接器有时可以表示代码中的一系列语句。在其他时候,它可以表示结构化构造的一部分,例如īfwhile等。但由于以下原因,它更通常代表goto

  1. 连接器的功能只是将控制权从一个语句转移到另一个语句。这正是goto的作用。
  2. 连接器的目标可以是页面上的任何节点。同样,goto可以定位范围内的任何语句。
  3. 流程图与代码goto之间的这种更接近的相似性可以通过比较一个小变化的影响来说明。让我们看一下流程图的两个版本,看看它们如何用goto s在结构化代码和代码中表示。

    voting flowcharts

    流程图的两个版本之间的唯一区别是“注册投票?否”连接器的目标。

    这是版本A作为结构化代码:

    REM Version A
    decide who to vote for
    IF registered to vote THEN
        vote
    END IF
    

    版本A的结构化代码必须进行重构才能获得版本B:

    REM Version B
    DO
        decide who to vote for
    UNTIL registered to vote
    vote
    

    这是版本A,代码为goto s

    REM Version A
    decide who to vote for
    IF registered to vote THEN GOTO VOTE
    GOTO FINISH
    VOTE:
    vote
    FINISH:
    

    goto s代码的B版非常相似:

    REM Version B
    DECIDE:
    decide who to vote for
    IF registered to vote THEN GOTO VOTE
    GOTO DECIDE
    VOTE:
    vote
    FINISH:
    

    使用goto的代码更改与流程图中所做的更改类似:更改连接器的目标,更改goto目标。相比之下,结构化代码中所需的更改与流程图所做的更改没有任何相似之处:如果条件为真,则版本A执行,而版本B执行其他操作直到条件是真的。

    因此,使用goto s的代码更能代表流程图。流程图组件与goto代码组件之间有更密切的对应关系。流程图连接器直接对应于代码中的goto

    <强>结论

    通过对流程图进行少量更改,可以显着改变算法的意图。因此,您可能会说虽然流程图可以表示算法的机制,但它并不能很好地表示意图。

    这是因为流程图连接器的目的是表示低级如何,而不是算法试图实现的。相比之下,结构化代码中的构造(例如ifwhile等)更多地是关于 what

    所以回答这个问题:是的,绘制流程图连接器是表示goto的一种方式。


    <强>脚注

    正如slebetman对这个问题所评论的那样,至少在机器代码级别,我们用Java,C#等编写的结构良好的代码背后有goto个。但那只是故事的一部分。在结构化代码中,低级goto总是以精心控制的方式使用,并且通常与其他人工制品(如高级代码中未见的标签)相关联。

答案 1 :(得分:0)

我当时为青少年编写了编程指南,我认为goto可以很容易地解释程序的流程,所以我用goto代替了while / if / for ...

绘制流程图时,我使用带有标签的圆圈来描述它。