我是COBOL的新手,只是想知道我发生了一些奇怪的事情。我想创建一个循环并执行3个段落,直到用户在第一段中提供的输入为“no”。
我有什么办法可以使用这个输入,还是我必须改变一切,以便在执行第一段之前给出输入?现在我的循环看起来像:
PERFORM PARAGRAPH1 WITH TEST AFTER UNTIL INPUT = "no"
PERFORM PARAGRAPH2
PERFORM PARAGRAPH3
END-PERFORM.
目前它只是保持循环并且永远不会结束,正如您所猜测的那样是一个问题。我想我可能还没有完全理解COBOL的范围,这是我第一次尝试COBOL。
真的很感激任何帮助:)
答案 0 :(得分:3)
您正在将内联执行与段落执行混合。很奇怪。我怀疑它只是因为你将Cobol-74终止子(期间)与Cobol-85终止子(End-Perform)混合而编译。如果您的编译器支持End- *作用域终结符,则除了作为段落的结尾之外,不应使用句点,否则您可能会创建一些非常扭曲和混乱的执行路径。
您还需要在输入中管理案例折叠。
“测试之后是一个特殊的野兽。它相当于在其他语言中的do / while。但它总是可以用启动读取并首先进行测试。
尝试这样的事情:
Perform Paragraph1
Perform until function lower-case(INPUT) = "no"
Perform Paragraph2
Perform Paragraph3
Perform Paragraph1
End-Perform
答案 1 :(得分:3)
你有趣的小程序。我看到它有一些 问题。
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-)以消除歧义。
正如乔所指出的那样,典型的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 或更多年前。