我是 COBOL 的新手,只是想知道我遇到的一些奇怪的事情。我想创建一个循环并执行 3 个段落,直到用户在第一段中提供的输入为“否”。
有什么方法可以使用这个输入,或者我是否必须更改周围的所有内容以便在执行第一段之前给出输入?现在我的循环看起来像:
PERFORM PARAGRAPH1 WITH TEST AFTER UNTIL INPUT = "no"
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
END-PERFORM.
目前它一直在循环并且永不结束,您可以猜到这是一个问题。我想我可能还没有完全理解 COBOL 的范围,这是我对 COBOL 的第一次实际尝试。
非常感谢任何帮助:)
最佳答案
你那里有一个有趣的小程序。正如我所见,有一些 问题。
PERFORM
动词有几种不同的风格(基本、TIMES、UNTIL 和 VARYING)。
您尝试使用的 PERFORM UNTIIL
风格具有以下内容
“铁轨”语法:
__________________________________________________________________________________________________
| |
| >>__PERFORM__ _procedure-name-1__ _______________________________ __| phrase 1 |_ ____________>< |
| | |_ _THROUGH_ __procedure-name-2_| | |
| | |_THRU____| | |
| |_| phrase 1 |__ ________________________ __ END-PERFORM___________| |
| |_imperative-statement-1_| |
| |
| phrase 1: |
| |__ ____________________________ __UNTIL__condition-1__________________________________________| |
| |_ ______ __TEST__ _BEFORE_ _| |
| |_WITH_| |_AFTER__| |
| |
|__________________________________________________________________________________________________|
请注意,在 PERFORM
动词之后,您可以编写 procedure-name-1
或 phrase-1
通过任意数量的 imperative-statement-1
。这些是互斥的选项(即没有
图中的路径允许您“环回”。一旦你通过这些选项之一,另一个
不再被提供。然而,
您的代码正在做这两件事!由于固有的歧义,我不希望它编译
在代码中(我尝试编译您的程序,幸好我的编译器出现错误)。
我看到的另一个问题是使用 INPUT
作为变量名。 INPUT
是一个大的
COBOL 保留字集
所以不能以这种方式使用(我再次希望编译器发出错误)。简单的解决方法是
在名称中添加一些内容(例如 WS-)以消除歧义。
正如 Joe 所指出的,典型的 COBOL 方法来做我认为你正在尝试的事情是:
PERFORM PARAGRAPH1
PERFORM UNTIL FUNCTION LOWER-CASE (WS-INPUT) = 'no'
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
END-PERFORM
我假设 PARAGRAPH1
负责设置循环控制变量 WS-INPUT
。
或者(假设 PARAGRAPH2
和 PARAGRAPH3
不引用 WS-INPUT
并且它们被执行
至少一次)
PERFORM WITH TEST AFTER UNTIL FUNCTION LOWER-CASE (WS-INPUT) = 'no'
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
END-PERFORM
基本区别在于第一个示例是典型的 DO-WHILE 结构(测试之前 进入循环体),第二个是典型的 DO-UNTIL 结构(总是执行 1 遍 通过循环体并在后续传递之前进行测试)。
第三种方法,过时的方法是:
PERFORM PARAGRAPH1
PERFORM PARAGRAPHS UNTIL LOWER-CASE (WS-INPUT) = 'no'
PARAGRAPHS.
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
PERFORM PARAGRAPH1
.
这等同于上面的第一个例子。 我不推荐这种编码风格——它可以追溯到做事的方式 30 或更多年前。
关于loops - 如何根据输入控制循环? (为什么这个循环永远?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7864261/