如何将流程图转化为实施? [关闭]

2023-11-27

编辑:简介

为了吸引更广泛的读者,我通过一个复杂的(有点乏味的)现实生活中的例子重新阐述了我最初的问题。原始问题如下(远)所示。

Tom 刚刚被 Acme Inc. 聘为初级软件工程师(取决于他前两个工作日的表现)。他的工作是用编程语言 Acme++ 实现由高级软件开发人员设计的算法。公司严格遵循“不goto”政策由首席执行官独家命令。如果汤姆在试用期内表现出色,他将获得公司的全职工作。

第一天,Tom 收到了要实现的以下算法。

Step 1. START
Step 2. Input x
Step 3. In case x<0 goto Step 4 otherwise goto Step 5
Step 4. Set x=-x
Step 5. Output x
Step 6. END

汤姆觉得这个任务非常复杂,他认为研究程序的抽象结构(将其表示为流程图)会让他受益匪浅。画完后如下图第一天流程图他很快意识到,他被要求计算 x 的绝对值,并且他可以使用简单的 if-then-else 语句来实现它。汤姆很高兴,今天结束时他完成了任务。

第 2 天,Tom 收到了要实现的以下算法。

Step 1. START
Step 2. Input x
Step 3. In case x<0 goto Step 2 otherwise goto Step 4
Step 4. Output x
Step 5. END

Tom作为一个新手,再次觉得以抽象的方式来理解算法会更好,所以他画了下面的流程图第二天流程图.

检查流程图表明 Tom 被要求实现一个 while 循环,等待第一个非负输入。汤姆很高兴,并在一天结束时完成了他的任务。

基于汤姆的出色表现,他被公司聘用。

然而,在第 3 天,Tom 陷入了困境,因为他收到了 1996 的 1000 行算法goto跳跃是由该公司的一名前员工设计的,没有其他人知道该算法的作用、它是如何实现的以及为什么首先要以这种方式设计。然而,这根本不关心汤姆,因为他的唯一任务是实现算法,无论它是什么。凭借前两天的专业知识,他在 1000 个节点上绘制了具有 1997 个有向边的流程图。汤姆非常绝望,在 stackoverflow 上询问到底要怎么处理这么混乱的情况,经验丰富的程序员反复建议他

  1. 将程序分解成更小的部分;和
  2. 他确信在某些情况下实际上可以使用goto; and
  3. 他被告知要“重组”该计划。

汤姆非常勤奋地考虑了这些建议,他的想法如下:

  1. 他意识到,如果流图的连通分量恰好有一个入度和一个出度,那么就可以将其视为一种可以独立开发的“子算法”,因此他可以分解他的任务以这种方式。然而,他一开始就不知道如何找到这些组件,也不知道是否有其他智能方法可以进一步解决这个问题。
  2. 汤姆并不真正关心是否使用goto是好的还是坏的编程实践(参见GOTO 仍然被视为有害吗?),他担心的是他的公司有一些他需要始终遵循的编程准则。
  3. 汤姆确实可以触及算法,因为他可以自行决定替换某些指令,从而产生等效的算法。然而,汤姆不知道程序的哪一部分需要重组,更重要的是,他不明白为什么需要重组。 Tom 紧张地盯着他的 1000 个顶点图,一开始并不知道如何开始实现它。

关于这篇(编辑过的)帖子的问题如下:

你能帮助汤姆弄清楚如何开始实现一些不“两行死显而易见”的东西吗?特别是,应该以什么顺序执行流程图节点所描述的任务,这一点是否清楚?是否清楚某些嵌套循环应按什么顺序依次出现?

流程图中不能进一步分解成更小的部分的最小“原子”是什么?也就是说,Tom 什么时候才能自信地回应 stackoverflow“我已经将我的算法分解成更小的部分了”?一切本质上都是一个 while 循环和/或一个二进制分支点(第一天和第二天的任务),这是真的吗?

如何自动实现这样一个“原子”,或多或少以与汤姆在第一天和第二天所做的相同的方式?

汤姆可以与首席执行官争论使用goto在某些情况下是必不可少的,也就是说,要么他们用它来实现某种算法,要么根据公司的指导方针(即不使用goto)?

流程图的哪些部分存在问题并需要重组,为什么?例如,三路分支可以替换为嵌套的两路 if-then-else 语句,也就是说,Tom 可以安全地假设流程图上的每个节点的出度最多为 2。但是还应该进行哪些其他重组来处理由goto声明?什么样的图形属性使得重组成为必要?或许,学历高?

最初提出的算法(由软件开发团队)的流程图背后的数学(图)理论是什么,以及算法的重组和分解的流程图,哪个(比如汤姆)实际上更重要-或更少自动地实施?


原问题

假设我有一些使用二元决策的算法goto声明。该算法以以下高级方式描述为 N>=2(有限)步骤,并且应该按顺序执行(一个步骤接着一个步骤):

任何算法

Step 1. START
Step 2. Do something. If condition in Step 2 holds goto Step X else goto Step Y.
Step 3. Do something. If condition in Step 3 holds goto Step U else goto Step V.
Step 4. Do something.
Step 5. Do something. If condition in Step 5 holds goto...
Step 6. ...
...
Step N. END

你明白了。例如,Knuth 在他的书中以这种独立于编程语言的高级方式描述了算法。

现在的问题是如何将这样的高级描述转换为goto语句到带有 while 循环和 if/else 语句的实际实现中?是否可以完全消除所有goto语句,并用 while 循环替换它们?如果是这样,应该如何做一般来说?

基于算法的描述,可以构建相应的流程图,从而构建(有向)流程图。所以换句话说,问题是“如何根据流程图实现代码而不需要goto声明一般来说?".

有两种方法可以回答这个问题。优选地,并且非常希望,我正在寻找一种算法方法来实现任何算法。如果算法是什么very简单,那么直观上就很清楚应该做什么,但在我看来,一旦频繁访问某个步骤(那里有很多 goto 语句跳转),或者换句话说,当其中一个节点时,事情就会变得相当复杂。流图的入度很大。然后我不太明白 while 循环应该以什么特定顺序嵌套。另一方面,很可能一个人根本无法做我想做的事情,这样的答案应该得到对算法不可能的高级描述的支持,该描述清楚地表明无论如何,一个人根本无法做到避免使用goto在实际实施中跳跃。

在我看来,将实现转换为流程图已被多次询问:自动流程图工具和这里创建流程图的算法[一点指导??]。该程序代码2流似乎是可视化代码的一个很好的起点。

然而,在这里我对另一个方向感兴趣。简单的搜索发现DRAKON(也可以看看https://en.wikipedia.org/wiki/DRAKON and http://drakon-editor.sourceforge.net/)可能正在做我所要求的事情。从这个角度来看,问题是,这样一个自动流程图到代码程序在不使用goto陈述?


引用OP:最好并且很有希望,我正在寻找一种算法方法来实现任何算法

嗯,显而易见的答案是用目标语言为算法的每个步骤定义一个标签,在该标签处为每个步骤编写代码,并完全按照算法所描述的方式插入 GOTO 语句。这将为您提供一个大多数人称之为“意大利面条代码”的工作程序。

OP 有一个冗长的介绍,表明他(或者汤姆)更愿意以一种令人信服地匹配算法的方式编写一个无 goto 的版本。

好的,好消息是博姆和约科皮尼很久以前就表明,您可以仅使用以下三个基本控制流操作来实现任何计算sequence, 如果-那么-否则, and while 循环,具有单进单出的良好特性。所以我们知道有一个“结构化程序”的实现。

不太好的消息是,他们的构造性证明(从 gotoful/流程图版本构建此类程序的过程)引入了一组布尔变量和额外的测试来控制循环。这些变量用于跳过循环迭代的剩余部分,强制退出循环,并告诉循环调用者循环已退出。这个额外的 对我来说,即使您不反对管理这些变量所需的存储和执行时间,代码也会使生成的程序难以阅读。 (有关为 goto-ful COBOL 程序执行此操作的算法,请参阅维基百科链接)。

更好的消息是,S. Rao Kosaraju 证明,如果您可以跳出任意嵌套深度的循环,则无需额外的控制变量即可构建此类程序。许多编程语言都提供这样的功能; C 提供了一个带有“break N;”的脆弱版本。打破N个嵌套循环的语句[使用这个著名的东海岸AT&T电话系统崩溃事件,当时有人在现有代码中插入了一个额外的循环并且没有注意到break语句]。 Ada 和其他语言允许对循环进行标记,并且本质上是“离开”以使用指定的标签名称离开循环。对我来说,这是一个很好的解决方案。 [我更喜欢一种变体,其中有一个可以“离开”的标记开始结束块。 如果您的语言没有这样的带标签的离开结构,但您愿意以风格上认可的方式(而不是临时方式)使用 GOTO 语句,则可以通过放置标签来模拟离开语句after每个循环并写“goto”而不是leave。

因此,我们知道可以从任意干净的流程图/gotoful 程序中构建结构化程序。

遵循 Sue Graham 1975 年论文的思路,通过将原始流程图简化为结构化子元素来实现此目的的算法,用于全局流分析的快速且通常为线性的算法.

该算法的本质是在可能的情况下将原始流程图逐步简化为 Bohm/Jacopini 原语(序列/if-then-else/循环)构造,并减少“不可简化”构造(想想流程图中的一个小结) )看起来不像这些特殊的方式。在每个步骤中,流程图的一部分都会简化为该部分的单个摘要节点。最终,这个过程将任意复杂度的原始流程图简化为单个节点。此时,缩减过程可以反向运行,每个汇总节点都扩展回原来的状态。

出于 OP 的目的,摘要节点的扩展提供了以结构化方式为简化子图编写代码的机会。重复直到生成原始流程图,然后导致整个程序以结构化方式编写。

【今天就这些了。让我们看看我是否可以产生一个算法。关注此空间]。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将流程图转化为实施? [关闭] 的相关文章

  • 生成随机数背后的数学(崩溃游戏 BTC Casino)

    我正在开发一款基于网络的游戏 其中有多个迷你游戏 我们坚持还添加一个在赌博界非常流行的崩溃游戏 然而 我们一直在努力理解生成随机 几乎不可预测 数字的概念 大多数赌博网站都会提供哈希值等来证明数字未被篡改 我们真的不需要这个 因为我们的游戏
  • 如何返回 Solidity 中的结构数组?

    我正在为以太坊智能合约设计一个解决方案bidding 用例包括保留名称 例如 myName 并分配给一个地址 然后 人们可以竞标该名称 在本例中为 myName 可以有多个名称发生多次此类出价 struct Bid address bidO
  • 编译过程

    谁能解释一下编译是如何工作的 我似乎无法弄清楚编译是如何工作的 更具体地说 这是一个例子 我正在尝试在 MSVC 6 中编写一些代码来加载 Lua 状态 我已经 设置库的附加目录并将文件包含到正确的目录中 使用 extern C 因为 Lu
  • StackOverflowError 计算 BigInteger 的阶乘?

    我正在尝试编写一个Java程序来计算大数的阶乘 它似乎BigInteger无法容纳这么大的数量 下面是我编写的 简单的 代码 public static BigInteger getFactorial BigInteger num if n
  • 趋势线的最佳拟合曲线

    问题约束 数据集的大小是已知的 但数据本身并不已知 数据集每次增长一个数据点 趋势线一次绘制一个数据点 使用样条 贝塞尔曲线 Graphs 下面的拼贴画显示了具有相当准确的趋势线的数据集 这些图表是 左上 按小时计算 大约有 24 个数据点
  • Python 中的空填字游戏求解器

    我得到了一个包含填字游戏蓝图的矩阵 当然 它是空的 我们的目标是填补整个难题 这是 Checkio 的一项任务 我已经为此奋斗了相当长一段时间 根据我对复杂性的理解 这个问题没有完美的算法 不过 必须有最好的方法来做到这一点 对吧 我尝试了
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • 如何在单向链表(一次遍历中)中从尾部获取第 n 个节点?

    所以我在一次考试中得到了这个问题 如何从单链表的尾部获取第 n 个节点 每个节点都有一个值和一个下一个 指向下一个值的指针 我们得到这个 getNodeFromTail Node head int x 所以我的做法是通过遍历一次来求出列表的
  • 简单的jquery求和

    我有未知数量的输入字段 有 add 类 我只想用 jquery 对这些进行求和 不知道我错在哪里
  • Google 文档如何处理编辑冲突?

    我一直在尝试编写自己的 Javascript 编辑器 其功能类似于 Google Docs 允许多人同时使用 我不明白一件事 假设用户 A 和用户 B 直接相互连接 网络延迟为 10 毫秒 我假设编辑器使用 diff 系统 据我了解 Doc
  • 序列和与 GCD

    大约一个月前 我在编程挑战中遇到了这个问题 但社论尚未发布 所以我在这里问 有一个大小为 N 的数组 A 求 A 的 K 个长度子序列的总和 GCD Example 如果 A 1 2 3 且 K 2 1 2 3 总和 1 GCD 3 1 3
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 解释 Vinay Deolalikar 的证明 P != NP [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近有一个paper https www win tue nl gwoegi P versus NP Deolalikar pdf惠普实验
  • CompileAssemblyFromDom 抛出访问被拒绝异常

    代码 using var codeProvider new CSharpCodeProvider var compilerParameter new CompilerParameters assemblies assemblyName fa
  • 重写修改后的 goto 语义的算法

    我有一大堆使用旧的自行设计的脚本语言编写的遗留代码 我们将它们编译 翻译成 javascript 该语言有条件跳转 跳转到标签 与普通 goto 语句的区别在于 不可能向后跳转 该语言中没有嵌套的 if 语句或循环 由于 javascrip
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 是否可以在线构建 Cordova App?

    我正在使用 PhoneGap 框架制作一个应用程序 PhoneGap提供构建服务 http build phonegap com 这使我们能够构建和将应用程序打包到云中 您不需要安装任何本地SDK构建应用程序 有什么办法可以建造科尔多瓦应用
  • Gradle Android 测试不支持过滤器(--tests)

    Gradle Android 测试不支持过滤器 tests gradlew test tests com example test works gradlew connectedAndroidTest tests com example t
  • 在一个 UITableView 问题中调用两个不同的自定义单元格

    我创建了一个自定义单元格 FeatureCell 该单元格中有 5 个图像 将在主视图中调用 但当我调用它时 我得到空行 那么请问我的问题可能出在哪里 我在谷歌上搜索了自定义单元格 并使用了我必须在下面的代码中使用的方式 但没有任何反应 这
  • DataSet 和 DataReader 哪个更好?

    我刚刚看到这个话题 数据表与数据集但这并没有解决我的疑问 让我更好地解释一下 我正在与数据库进行连接 需要在 GridView 中显示结果 我之前使用 VB6 时使用了 RecordSet DataSet 与它非常相似 因此使用 DataS
  • jersey + grizzly + hk2:依赖注入,但不注入资源

    跟进Jersey HK2 Grizzly 注入EntityManager的正确方法 我想了解如何在类中使用依赖注入不是球衣资源 例如 我可能在 ExecutorService 中运行后台任务 并且它们可能需要 EntityManager 如
  • SSL:将数据加载到seaborn时出现CERTIFICATE_VERIFY_FAILED错误?

    我正在尝试从 github 页面加载数据 它是您可以获得的标准 seaborn 数据集的一部分 我使用 PyCharm 但我不明白到底发生了什么 import seaborn as sns data sns load dataset tip
  • 使用 NamedParameterJDBCTemplate 进行插入时出现“无效的列类型”异常

    我在向数据库插入一行时使用下面的代码 oracle 10g xe jar ojdbc14 jar String sql INSERT INTO SPONSOR TB ID NAME INDUSTRY TYPE IS REPORTING SP
  • python gnupg.encrypt:没有错误,但不加密数据或文件

    在 Windows 7 上使用 python gnupg v0 3 5 w Python 2 7 和 GPG4Win v2 2 0 test gnupg py 导致 2 次失败 测试搜索密钥是否有效 失败 文档测试 gnupg GPG re
  • 为什么单个修订版的 SVN 转储比完整转储大?

    我的存储库是2 5G 通过转储svnadmin dump myrepos gt dumpfile是5G 但是当我像这样转储时svnadmin dump myrepos r 23785 gt rev 23785 dumpfile其中 2378
  • 边框图像如何与线性渐变一起使用?

    我试图了解 border image slice 在渐变边框图像的情况下如何工作 在规范中 边框图像切片的值可以是一个数字 表示光栅图像的边缘偏移 以像素为单位 和矢量图像的坐标 对于矢量图像 该数字与元素的大小有关 而不是与源图像的大小有
  • Python中的反平方根[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 是否有任何 Python
  • 如何在 .NET 中创建子集字体?

    我有一个 Silverlight 应用程序 需要在其中嵌入一些不太常见的字体 这对我来说非常简单 只需复制 TTF OTF 并使用我的应用程序进行编译即可 然而 在很多情况下 实际只使用了 5 10 个字符 在其他情况下 某些字体文件非常大
  • 将 Hibernate 升级到 5.1.0 后如何导出架构?

    我最近将 Hibernate 从 5 0 更新到 5 1SchemaExportAPI 已更改 迁移文档提到了这一更改 但没有解释如何使用较新的 API 此外 我还没有找到任何其他支持示例来修复重大更改 我偶然发现了这个代码差异 它帮助我解
  • 删除用作外键的对象

    我有下一个型号 class Target models Model name models CharField max length 100 blank False class SubTarget models Model target m
  • MVC JSON 操作返回 bool

    我的 ASP NET MVC 操作是这样写的 GET TaxStatements CalculateTax prettyId public ActionResult CalculateTax int prettyId if prettyId
  • 检测winforms中的箭头键[重复]

    这个问题在这里已经有答案了 可能的重复 上 下 左 右方向键不触发 KeyDown 事件 先看代码 using System using System Collections Generic using System ComponentMo
  • 通过 Composer 安装 Laravel 时获取建议

    从昨天开始 当我通过以下方式创建 laravel 项目时 composer create project prefer dist laravel laravel project name 我收到这些建议消息 这是正常现象还是我搞砸了什么 我
  • 如何指定实际的 x 轴值以在 R 中绘制为 x 轴刻度

    我正在 R 中创建一个绘图 但我不喜欢 R 绘制的 x 轴值 例如 x lt seq 10 200 10 y lt runif x plot x y 这将绘制一个在 X 轴上具有以下值的图表 50 100 150 200 但是 我想绘制 2
  • MySQL - IN() 中的 ORDER BY 值

    我希望对以下查询中返回的项目进行排序它们输入 IN 函数的顺序 INPUT SELECT id name FROM mytable WHERE name IN B A D E C OUTPUT id name 5 B 6 B 1 D 15
  • 如何将流程图转化为实施? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 编辑 简介 为了吸引更广泛的读者 我通过一个复杂的 有点乏味的 现实生活中的例子重新阐述了我最初的问题 原始问题如下 远 所示 Tom 刚刚被 Acme Inc 聘为初级软件工程