如何根据输入控制循环? (为什么这会永远循环?)

时间:2011-10-23 03:59:44

标签: loops cobol

我是COBOL的新手,只是想知道我发生了一些奇怪的事情。我想创建一个循环并执行3个段落,直到用户在第一段中提供的输入为“no”。

我有什么办法可以使用这个输入,还是我必须改变一切,以便在执行第一段之前给出输入?现在我的循环看起来像:

PERFORM PARAGRAPH1 WITH TEST AFTER UNTIL INPUT = "no"
     PERFORM PARAGRAPH2
     PERFORM PARAGRAPH3
END-PERFORM.

目前它只是保持循环并且永远不会结束,正如您所猜测的那样是一个问题。我想我可能还没有完全理解COBOL的范围,这是我第一次尝试COBOL。

真的很感激任何帮助:)

2 个答案:

答案 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-1phrase-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

或(假设PARAGRAPH2PARAGRAPH3不引用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 或更多年前。