COBOL为什么它总是执行ELSE语句,如果其中一个IF语句是真的?

时间:2014-07-03 12:03:59

标签: if-statement cobol

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。

3 个答案:

答案 0 :(得分:4)

这里有1985年前后COBOL的混合物。在COBOL-85 END-IF之前 不存在,终止条件语句(例如IF)的唯一方法是终止 包含句子的句子(点)。使用句点终止条件的问题 声明是它不仅终止了最近的&#34;有条件但有条件的 语句。

以下是重构为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 < GOAL2 OR GOAL2 > GOAL1。显然,如果 GOAL1 < GOAL2为真,那么GOAL2 > 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

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

答案 1 :(得分:1)

您的代码在您编写语句时执行语句。您的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.

答案 2 :(得分:1)

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

您的问题在第三个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这样的段落有什么问题?