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。
答案 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这样的段落有什么问题?