0

我的一个 COBOL 程序中有以下代码片段。

IF  FIRST < SECOND
   MOVE FIRST TO WS
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

我需要在 IF 块内使用 GO TO 来跳转到最后一条语句(MOVE WS TO RESULT)。

IF  FIRST < SECOND
   MOVE FIRST TO WS
   GO TO <last line.(MOVE WS to RESULT)>
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

换句话说,我需要跳过“第二次移动到 WS。”。
跳转到cobol中特定行的最简单方法是什么?我在某处读到,这可以通过定义一个 PARAGRAPH 来实现,但不知道如何定义它。

它可能看起来很简单,但我是 COBOL 编程的新手。

谢谢。

- - - - - - - - * 更新 * - - - - -

基于@lawerence 解决方案,这是正确的吗?

IF  FIRST < SECOND
     MOVE FIRST TO WS
     GO TO C10-END.
  END-IF.

  MOVE SECOND TO WS.

C10-END.
MOVE WS TO RESULT.

我刚刚将最后一条语句移回第一级。

4

5 回答 5

4

GOTO 可以做你想要的,但 IF/ELSE 会更直接。MOVE SECOND TO WS 如果 IF 块没有,您想运行,对吗?

IF  FIRST < SECOND
    MOVE FIRST TO WS
ELSE
    MOVE SECOND TO WS
END-IF.
MOVE WS TO RESULT. 

我希望我的语法是正确的,我从来没有使用过 COBOL,只是试图处理你的代码片段和这个例子http://www.fluffycat.com/COBOL/If-and-End-If/。将来可能会出现需要 GOTO 的情况,但是 A) 当另一个控制结构可以工作时应该避免它 B) 我一点也不知道它是如何完成的

老实说,COBOL 看起来很惨,哈哈。我从未见过如此冗长的语言。祝一切顺利


编辑


主要是为了乔...

不能用 min 函数更好地完成这一切吗?我确定语法是错误的,但是:

Move Function Min(FIRST, SECOND) to RESULT
于 2011-05-04T05:13:58.287 回答
2

OMFSM!不是 1974 年,你为什么要这样写 Cobol?这:

IF  FIRST < SECOND
   MOVE FIRST TO WS
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

有很多问题:

  • 它使用句点来划定范围,这已被弃用了近三个十年。
  • 它没有使用 ELSE
  • 它正在尝试使用 GO TO。

我是否可以建议以下作为自 1985 年以来处理它的方法:

If FIRST < SECOND
  Move FIRST to WS
Else
  Move SECOND to WS
End-IF
Move WS to RESULT

但实际上,代码应该简单地阅读:

If FIRST < SECOND
  Move FIRST to RESULT
Else
  Move SECOND to RESULT
End-If

除非在 WS 中需要中间结果。Cobol 66 和 74 使用 GOTO 和句点,因为它们缺乏现代控制结构。我知道你是一个“新手”,但你应该向教你的人建议他们真的需要提升他们的技能。

于 2011-05-05T03:48:10.930 回答
1

jon_darkstar 在改进逻辑方面是正确的,但是如果你想看看GO TO这里是如何工作的:

  IF  FIRST < SECOND
     MOVE FIRST TO WS
     GO TO C10-RESULT.
  END-IF.

  MOVE SECOND TO WS.

C10-RESULT.
  MOVE WS TO RESULT.

C10-RESULT.开始一个段落,并且必须是代码 SECTION 中的唯一名称。按照惯例,它也应该以与封闭部分相同的前缀开头。因此,此示例假定您的代码SECTION类似于C00-MAIN-PROCESS SECTION.

于 2011-05-04T05:32:23.387 回答
0

一个新的非答案让这个愚蠢的问题浮出水面。

IF 中的 ELSE 是 100% 显而易见的答案。很奇怪,必须使用 GO TO 而不能使用 ELSE。

另一种方式,很惊讶它没有出现:

MOVE SECOND TO WS
IF  FIRST LESS THAN SECOND
   MOVE FIRST TO WS
END-IF
MOVE WS TO RESULT

没有 ELSE,没有 GO TO。但是,当 FIRST小于秒时执行额外的 MOVE 。

包含 GO TO 很简单,但很愚蠢。添加一个转到。GO TO 必须去某个地方(除非使用 ALTER ... TO PROCEED TO ...,每个人都希望你不是这样),所以在你希望它到达的地方制作一个标签,并添加该标签的名称前往。

标签是用户定义的词。如果被引用(在这种情况下),它必须在一个 SECTION 中是唯一的,如果您使用 SECTION,则不需要,否则在程序中是唯一的,并且无论是否被引用,它可能与其他名称不同(如数据定义或文件的内部名称)。

标签是过程名称。过程名称应以句点/句号终止,过程本身也应以句点/句号终止。

MOVE FUNCTION MIN ( ... ) ...作为解决方案呢?

嗯,它有效。如果您站点的其他工作人员不习惯它,则不会感谢您使用它(无论如何,无需事先讨论)。

它有什么作用?好吧,在 Enterprise COBOL 中,编译器生成一个额外的小区域,将第一个参数复制到该区域,针对第二个参数进行测试,将第一个参数或第二个参数的副本复制到结果中。

与 ELSE 相比,它定义了一个额外的存储区域、一个用于寻址的额外指令、一个额外的汇编程序移动 (MVC) 以及缺乏准备识别。

更适合 COBOL 新手,习惯于其他语言的大量功能?不是真的,因为如果他们不编写其他员工可以理解的程序(凌晨 2 点),他们将被彻底击败。

IF FUNCTION MIN(VAR1 VAR2 VAR3 VAR4 VAR5) = 17

这是 FUNCTION 的另一个缺点。你看,你可以做到。然后,在凌晨 2 点,当程序在 32 行之后崩溃时,在更改 VAR1 和 VAR3 之后,您是否能够在核心转储中找到那个 IF 的结果?也许,也许不是。取决于是否使用了任何其他功能,以及使用了什么类型。凌晨 2 点,你不想要那个。一点也不。

从好的方面来说,它减少了打字。对于那些打字,而不是使用编辑器的人。

于 2014-09-21T00:52:38.930 回答
-1

在我们的商店中,我们将使用 Bill Woodger 提供的示例。但是,我们确实使用句点作为范围终止符。COBOL 应该结构化并使用 KISS 原则,就像任何其他语言一样。这:

第二次移动到 WS。
如果第一次不到第二次
    首先移动到 WS。
将 WS 移至结果。

请注意,这仅在我们确信 SECOND 和 FIRST 具有数值,或者 WS 是 PIC X() 字符串而不是数字 PIC 9() 时才有效。这是迄今为止最容易阅读的。不需要 ELSE 或 GO TO。

于 2016-11-18T22:22:02.417 回答