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

标签 loops cobol

我是 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-1phrase-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

或者(假设 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 或更多年前。

关于loops - 如何根据输入控制循环? (为什么这个循环永远?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7864261/

相关文章:

java - 创建具有IBM I系列(AS400)特殊隐藏(不可打印和不可见?)字符的Java文件问题

file - 在 COBOL 中创建文件

c# 嵌套 for 循环检查比较列表中的每个元素返回奇数结果

algorithm - 在每次迭代中删除元素的嵌入式循环的大 O 是什么?

c - 这个 C 结构如何被翻译成 Cobol

comments - 是否可以在 Cobol 中添加内联注释

db2 - 终止引发线

php - 如何准备 mysql 查询以在 smarty 部分循环?

r - 将循环输出存储在 R 中的数据帧中

loops - 如何迭代或映射元组?