【问题标题】:COBOL why does it always perform the ELSE statement also if one of the IF statement is true?如果 IF 语句之一为真,COBOL 为什么它也总是执行 ELSE 语句?
【发布时间】:2014-07-03 12:03:59
【问题描述】:
IF GOAL1 = GOAL2 AND GOAL1 = 0
    PERFORM DRAW-2.
IF GOAL1 < GOAL2 OR GOAL2 > GOAL1
    PERFORM WIN-2.
IF GOAL1 > GOAL2 OR GOAL2 < GOAL1
    PERFORM WIN-1
IF GOAL1 = GOAL2
    PERFORM DRAW-1
ELSE
    DISPLAY "INVALID"
END-IF.

*FUNCTION*

WIN-1.
     DISPLAY TEAM1 " WIN".
WIN-2.
     DISPLAY TEAM2 " WIN".
DRAW-1.
     DISPLAY "BOTH TEAM DRAW".
DRAW-2.
     DISPLAY "SCORELESS DRAW".

首选输出只是 if 或 else 语句之一。但我得到了 2 个输出,例如 TEAM1 WIN 和 INVALID。

【问题讨论】:

  • 实际输入和输出是什么?
  • @tenfour TEAM1 = 巴西,TEAM2 = 乌拉圭,目标 1 = 2,目标 2 = 1。巴西获胜且输出无效。
  • 你不应该这么准备接受。
  • @BillWoodger 当时在阅读了他的答案后,它触发了我的一些东西来改变我的整个代码。我现在得到了我想要的。

标签: if-statement cobol


【解决方案1】:

您在这里看到的是 1985 年之前和之后的 COBOL 的混合体。在 COBOL-85 END-IF 之前 不存在并且终止条件语句(例如 IF)的唯一方法是终止 包含句点(点)的句子。使用句点终止条件的问题 声明是它不仅终止“最接近”的条件,而且终止所有条件 声明。

这是您的代码在重构为 COBOL-85 后的样子:

IF GOAL1 = GOAL2 AND GOAL1 = 0
    PERFORM DRAW-2
END-IF

IF GOAL1 < GOAL2 OR GOAL2 > GOAL1
    PERFORM WIN-2
END-IF

IF GOAL1 > GOAL2 OR GOAL2 < GOAL1
    PERFORM WIN-1
    IF GOAL1 = GOAL2
        PERFORM DRAW-1
    ELSE
        DISPLAY "INVALID"
    END-IF
END-IF

*FUNCTION*

WIN-1.
     DISPLAY TEAM1 " WIN".
WIN-2.
     DISPLAY TEAM2 " WIN".
DRAW-1.
     DISPLAY "BOTH TEAM DRAW".
DRAW-2.
     DISPLAY "SCORELESS DRAW".

现在在上面的代码中有一些让我觉得很奇怪的地方。第一的 为什么要使用双重条件,例如:IF GOAL1 &lt; GOAL2 OR GOAL2 &gt; GOAL1。显然,如果 GOAL1 &lt; GOAL2 为真,那么GOAL2 &gt; GOAL1 也必须为真!另一件事,和 这就是我相信你的问题是关于导致 执行段落WIN-1 仅在GOAL1 NOT = GOAL2 时为真,因此第二个嵌入 条件IF GOAL1 = GOAL2 不能为真导致ELSE 导致DISPLAY "invalid"

使用 COBOL-85,可以通过更结构化的方式来做我认为您想做的事情 这里。请尝试以下操作:

 EVALUATE TRUE
     WHEN GOAL1 = ZERO AND
          GOAL2 = ZERO
          PERFORM DRAW-2
     WHEN GOAL1 = GOAL2
          PERFORM DRAW-1
     WHEN GOAL1 > GOAL2
          PERFORM WIN-1
     WHEN GOAL1 < GOAL2
          PERFORM WIN-2
     WHEN OTHER
          DISPLAY "invalid"
 END-EVALUATE

我认为这更容易理解,并且不使用句点来终止 条件语句的范围。

【讨论】:

  • 典型 :-) 顺便说一句,当我建议不值得评估时,我没有看到这一点。比原版清晰很多。
  • @NealB 我什至不知道这种方法存在,我应该了解更多。如果我将 0 作为目标 1 和目标 2 的输入,WHEN 条件 1 和 2 不会执行吗?
  • @Jack011 一旦WHEN 被操作,那是EVALUATE 的结束。不要期望事情一定会像另一种语言的结构一样工作。
【解决方案2】:

您的代码执行您编写的语句。您的 ELSE 子句仅适用于最终的 IF 语句。编辑:使用ELSE IF 使IF 语句链做你想做的事:

IF GOAL1 = GOAL2 AND GOAL1 = 0
    PERFORM DRAW-2.
ELSE IF GOAL1 < GOAL2 OR GOAL2 > GOAL1
    PERFORM WIN-2.
ELSE IF GOAL1 > GOAL2 OR GOAL2 < GOAL1
    PERFORM WIN-1
ELSE IF GOAL1 = GOAL2
    PERFORM DRAW-1
ELSE
    DISPLAY "INVALID"
END-IF.

【讨论】:

  • 谢谢。现在只需从代码中删除两个句号/句点,您总共需要四个 END-IF,每个 IF 一个。以这种方式构建嵌套 IF 清楚地表明了 EVALUATE 的使用。我想知道@Jack011、NealB 和你自己认为什么会“无效”:-)
【解决方案3】:

对于一个简单的事情来说,这是非常复杂的代码。

您的问题是在第三个 IF 上缺少句号/句号。您不应该使用句号/句号来终止 IF,您应该始终使用 END-IF (除非您的当地标准出于某种愚蠢的原因规定,否则不使用句号/句号)。看看这个最近的问题:Dot rules in nested conditional statements - COBOL

您接受的答案不正确。如果您嵌套了这些 IF,并有一个最终的 ELSE,则该 ELSE 将仅应用于嵌套的最后一个 IF,与其余部分无关。

从表面上看,EVALUATE 会更适合您的需求。然而:

    IF GOAL1 EQUAL TO GOAL2 
        PERFORM A-DRAW
    ELSE
        PERFORM A-WIN
    END-IF
    .
A-DRAW.
    IF TEAM1-NO-GOALS
        DISPLAY "SCORELESS DRAW"
    ELSE
        DISPLAY "SCORE DRAW"
    END-IF
    .    
A-WIN.
    IF GOAL1 GREATER THAN GOAL2
        DISPLAY TEAM1 " WIN"
    ELSE
        DISPLAY TEAM2 " WIN"
    END-IF
    .

TEAM1-NO-GOALS 是 GOAL1 上的 88 级条件名称。

显然,DISPLAY 行可以替换为原始段落的 PERFORM,尽管您应该使名称更有意义 - 至少像 TEAM1-WINS 或 SCORE-DRAW 这样的段落有什么问题?

【讨论】:

  • 我将他标记为正确的原因是因为当时他是唯一一个足够快地回答我的问题的人,在阅读了他写的内容之后,我触发了一些事情来更改我的整个代码以获得我想要的.无论如何,我的错误决定太快和粗心。
  • @Jack011 没问题。希望他们能回复并更正答案,以免让未来的读者感到困惑。
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 2020-08-19
  • 2020-09-06
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多