背景:我继承了一个概念验证项目,该项目为用户提供了一个绘图画布,可在其上构建流程图。然后它尝试从流程图中生成一些过程代码。
我严重怀疑这是否能真正成功,部分原因是因为有太多的错误,但从根本上是因为......
问题:流程图不仅仅是绘制GOTO的一种方式吗?因此,从流程图生成结构良好的过程代码并不一定困难吗?
答案 0 :(得分:0)
这是我自己的答案,我不会接受(至少几周)因为我真的想要别人的意见。
使用流程图表示的算法更类似于使用goto
编写的代码而不是结构化语言(如C#,Pascal或Java)。
流程图连接器有时可以表示代码中的一系列语句。在其他时候,它可以表示结构化构造的一部分,例如īf
,while
等。但由于以下原因,它更通常代表goto
:
goto
的作用。goto
可以定位范围内的任何语句。流程图与代码goto
之间的这种更接近的相似性可以通过比较一个小变化的影响来说明。让我们看一下流程图的两个版本,看看它们如何用goto
s在结构化代码和代码中表示。
流程图的两个版本之间的唯一区别是“注册投票?否”连接器的目标。
这是版本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
。
<强>结论强>
通过对流程图进行少量更改,可以显着改变算法的意图。因此,您可能会说虽然流程图可以表示算法的机制,但它并不能很好地表示意图。
这是因为流程图连接器的目的是表示低级如何,而不是算法试图实现的。相比之下,结构化代码中的构造(例如if
,while
等)更多地是关于 what 。
所以回答这个问题:是的,绘制流程图连接器是表示goto
的一种方式。
<强>脚注强>
正如slebetman对这个问题所评论的那样,至少在机器代码级别,我们用Java,C#等编写的结构良好的代码背后有goto
个。但那只是故事的一部分。在结构化代码中,低级goto
总是以精心控制的方式使用,并且通常与其他人工制品(如高级代码中未见的标签)相关联。
答案 1 :(得分:0)
我当时为青少年编写了编程指南,我认为goto可以很容易地解释程序的流程,所以我用goto代替了while / if / for ...
绘制流程图时,我使用带有标签的圆圈来描述它。