📜  COBOL 中的循环语句

📅  最后修改于: 2022-05-13 01:55:07.985000             🧑  作者: Mango

COBOL 中的循环语句

每种编程语言不仅有一个选择结构,而且还有一个涉及迭代的结构。

使用这种构造,代码块可以重复运行。事实上,程序员自己可以通过选择特定类型的循环来编写代码。

说到循环的类型,现代编程语言提供 for 和 while 循环,而其他一些提供重复结构。前者按照程序员的规定运行一定的次数,后者在不满足设定条件的情况下可以无限期地运行。这是Python 3 的“for”循环:

Python3
for i in range(0,5,1):
    print(i)


Java
int x = 0;
while (x < 5) {
System.out.println(x);
x++;
}


Cobol
IDENTIFICATION DIVISION.
       PROGRAM-ID. ADD-SUBTRACT-NUMBERS.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           01 my-var PIC 99 VALUE 12.
           01 my-var2 PIC 99 VALUE 23.
           01 resultAdd PIC 999.
           01 resultSub PIC 99.
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           PERFORM AddTwoNumbers
           PERFORM SubtractTwoNumbers
           PERFORM DisplayResult
           STOP RUN.
       AddTwoNumbers.
           COMPUTE resultAdd = my-var + my-var2.
       SubtractTwoNumbers.
           COMPUTE resultSub = my-var2 - my-var.
       DisplayResult.
           DISPLAY "Total: " resultAdd
           DISPLAY "Difference: " resultSub.
       END PROGRAM ADD-SUBTRACT-NUMBERS.


Cobol
IDENTIFICATION DIVISION.
       PROGRAM-ID. ADD-SUBTRACT-NUMBERS.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           01 my-var PIC 99 VALUE 12.
           01 my-var2 PIC 99 VALUE 23.
           01 resultAdd PIC 999.
           01 resultSub PIC 99.
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           PERFORM AddTwoNumbers THRU DisplayResult
           STOP RUN.
       AddTwoNumbers.
           COMPUTE resultAdd = my-var + my-var2.
       SubtractTwoNumbers.
           COMPUTE resultSub = my-var2 - my-var.
       DisplayResult.
           DISPLAY "Total: " resultAdd
           DISPLAY "Difference: " resultSub.
       END PROGRAM ADD-SUBTRACT-NUMBERS.


Cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 my-var PIC X(6) VALUE "Hello!".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello 3 TIMES
    STOP RUN.
DisplayHello.
    DISPLAY my-var.
END PROGRAM DISPLAY-HELLO.


Cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-NUMBERS.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 MyCounter PIC 9 VALUE 1.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayNumbers UNTIL MyCounter > 5
    STOP RUN.
DisplayNumbers.
    DISPLAY MyCounter.
    COMPUTE MyCounter = MyCounter + 1.
END PROGRAM DISPLAY-NUMBERS.


Cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-NUMBERS.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 MyCounter PIC 9 VALUE 1.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayNumbers VARYING MyCounter FROM 1 BY 1 
    UNTIL MyCounter > 5
    STOP RUN.
DisplayNumbers.
    DISPLAY MyCounter. 
END PROGRAM DISPLAY-NUMBERS.


Cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 Greeting PIC A(5) VALUE "Hello".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello
    STOP RUN.
DisplayHello.
    DISPLAY Greeting
    GO TO DisplayHello.    
END PROGRAM DISPLAY-HELLO.


Cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 Greeting PIC A(5) VALUE "Hello".
    01 Answer PIC A(1) VALUE "N".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello
    STOP RUN.
DisplayHello.
    DISPLAY Greeting
    DISPLAY "Terminate Greeting? (Y/N): "
    ACCEPT Answer
    IF Answer = "N"
        GO TO DisplayHello.
END PROGRAM DISPLAY-HELLO.


如您所知,数字 0 到 4 是用这个 for 循环打印的,如下面的输出所示:

0
1
2
3
4

现在,让我们看看Java中的“while”循环:



Java

int x = 0;
while (x < 5) {
System.out.println(x);
x++;
}

您也可以在Java使用此 while 循环获得相同的输出,如下面的输出所示:

0
1
2
3
4

尽管这些迭代构造很简单,但 COBOL 还提供了此类循环构造。即使语法看起来与上面显示的示例非常不同。

COBOL 中的循环语句:

简单地说,COBOL 中的循环是使用 PERFORM 动词执行的,但它还有其他值得一提的功能。

在最简单的形式中,PERFORM 只是将控制权转移到将只执行一次的代码块。这可以是一个段落或一个部分。或者,它可以通过使用 PERFORM THRU 构造来执行包含在多个连续段落中的多个代码块。

对于作为本讨论重点的迭代构造,您可以使用 PERFORM 动词来执行代码块,通过使用 PERFORM TIMES 循环执行一定次数。

您还可以设置 PERFORM 动词以执行代码块,直到使用 PERFORM UNTIL 循环满足特定条件。

最后,PERFORM VARYING 循环工作一定次数,并取决于我们使用的 FROM BY 值。

让我们从简单的 PERFORM 语句的语法开始。



简单的 PERFORM 语句:

如前所述,PERFORM 语句将以最简单的形式只执行一次代码块。对于此示例,我们使用 PERFORM 语句在 AddTwoNumbers 和 SubtractTwoNumbers 段落中运行代码。

科博尔

IDENTIFICATION DIVISION.
       PROGRAM-ID. ADD-SUBTRACT-NUMBERS.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           01 my-var PIC 99 VALUE 12.
           01 my-var2 PIC 99 VALUE 23.
           01 resultAdd PIC 999.
           01 resultSub PIC 99.
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           PERFORM AddTwoNumbers
           PERFORM SubtractTwoNumbers
           PERFORM DisplayResult
           STOP RUN.
       AddTwoNumbers.
           COMPUTE resultAdd = my-var + my-var2.
       SubtractTwoNumbers.
           COMPUTE resultSub = my-var2 - my-var.
       DisplayResult.
           DISPLAY "Total: " resultAdd
           DISPLAY "Difference: " resultSub.
       END PROGRAM ADD-SUBTRACT-NUMBERS.

操作结果完成后,DisplayResult 段落将打印结果,如下所示:

Total: 035
Difference: 11

接下来,我们将查看 PERFORM THRU 语句的语法以及它与仅使用一次 PERFORM 语句有何不同。

PERFORM-THRU 声明:

当我们使用 PERFORM-THRU 语句时,目标是一次运行多个段落。当然,语句必须提供开头和结尾的段落,如下面的代码所示:

科博尔

IDENTIFICATION DIVISION.
       PROGRAM-ID. ADD-SUBTRACT-NUMBERS.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           01 my-var PIC 99 VALUE 12.
           01 my-var2 PIC 99 VALUE 23.
           01 resultAdd PIC 999.
           01 resultSub PIC 99.
       PROCEDURE DIVISION.
       MAIN-PROCEDURE.
           PERFORM AddTwoNumbers THRU DisplayResult
           STOP RUN.
       AddTwoNumbers.
           COMPUTE resultAdd = my-var + my-var2.
       SubtractTwoNumbers.
           COMPUTE resultSub = my-var2 - my-var.
       DisplayResult.
           DISPLAY "Total: " resultAdd
           DISPLAY "Difference: " resultSub.
       END PROGRAM ADD-SUBTRACT-NUMBERS.

如您所见,上面的 PERFORM 语句从执行 AddTwoNumbers 中的代码开始,直到它到达 DisplayResult 段落。毫无疑问:它从头到尾遵循段落的自然顺序。

毫不奇怪,我们获得了相同的输出,因为我们使用了相同的输入:

Total: 035
Difference: 11

这将我们带到了 COBOL 中使用 PERFORM 动词的第三种方式。

PERFORM TIMES 声明

这个语句是 COBOL 中的第一种方式,通过它我们可以选择重复多次代码块。如您所知,我们可以指定代码块必须运行的次数 - 3 次,如下所示:



科博尔

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 my-var PIC X(6) VALUE "Hello!".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello 3 TIMES
    STOP RUN.
DisplayHello.
    DISPLAY my-var.
END PROGRAM DISPLAY-HELLO.

当您运行代码时,您会发现字符串“Hello!”显示三次,如下图。就是这样。这就是 PERFORM TIMES 语句的全部内容。

Hello!
Hello!
Hello!

当然,下一个 PERFORM 语句包括一个前测试或后测试来决定循环是否应该终止。

PERFORM UNTIL 声明:

现在,PERFORM UNTIL 语句就像一个 while 循环,循环中的语句重复执行,直到达到某个值。换句话说,只要达到某个值或满足条件,循环就会终止:

科博尔

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-NUMBERS.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 MyCounter PIC 9 VALUE 1.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayNumbers UNTIL MyCounter > 5
    STOP RUN.
DisplayNumbers.
    DISPLAY MyCounter.
    COMPUTE MyCounter = MyCounter + 1.
END PROGRAM DISPLAY-NUMBERS.

在上面的示例中,当MyCounter值达到值 6 时,循环终止。因此,对于输出,您将获得一个从 1 到 5 的数字列表,如下所示:

1
2
3
4
5

除此语句外,您还可以在 UNTIL 字之前添加 WITH TEST BEFORE 和 WITH TEST AFTER 子句。前者就像一个普通的 while 循环,后者类似于现代语言中的 do-while 循环。如果您必须知道,WITH TEST BEFORE 子句是默认的,不需要明确说明。

说了这么多,接下来让我们看看 PERFORM VARYING 语句。

PERFORM VARYING 声明:

PERFORM VARYING 语句是现代语言所称的 for 循环。如您所知,for 循环通常有一个开始值和一个结束值。每次迭代时,该值都会增加一定的数字,直到达到最终值。正如您在下面看到的,PERFORM VARYING 语句试图做到这一点:

科博尔



IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-NUMBERS.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 MyCounter PIC 9 VALUE 1.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayNumbers VARYING MyCounter FROM 1 BY 1 
    UNTIL MyCounter > 5
    STOP RUN.
DisplayNumbers.
    DISPLAY MyCounter. 
END PROGRAM DISPLAY-NUMBERS.

MyCounter值从 1 开始并递增 1,直到达到大于 5 的值。因此,您的输出显示从 1 到 5 的所有数字,如下所示:

1
2
3
4
5

如您所知,此语句类似于 PERFORM TIMES 语句,但不需要我们更新MyCounter值。

最后,我们将看看 GO TO 语句以及它在 COBOL 中的使用方式。

转到声明:

GO TO 声明在过去 50 年中受到很多批评是有充分理由的。是著名的荷兰计算机科学家 Djikstra 领导了关于此语句在程序控制流方面是否真的值得使用的辩论。看看下面这个例子:

科博尔

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 Greeting PIC A(5) VALUE "Hello".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello
    STOP RUN.
DisplayHello.
    DISPLAY Greeting
    GO TO DisplayHello.    
END PROGRAM DISPLAY-HELLO.

由于 DisplayHello 段落中放置不当的 GO TO 语句以及输出打印“Hello!”,程序陷入永无止境的循环中。无数次。无论如何,都应该避免这种无条件的 GO TO 语句。

当然,如果您绝对必须使用 GO TO 语句,请使用有条件的语句。以下是此类 GO TO 语句的示例:

科博尔

IDENTIFICATION DIVISION.
PROGRAM-ID. DISPLAY-HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
    01 Greeting PIC A(5) VALUE "Hello".
    01 Answer PIC A(1) VALUE "N".
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DisplayHello
    STOP RUN.
DisplayHello.
    DISPLAY Greeting
    DISPLAY "Terminate Greeting? (Y/N): "
    ACCEPT Answer
    IF Answer = "N"
        GO TO DisplayHello.
END PROGRAM DISPLAY-HELLO.

如您所知,如果通过输入将 Answer 的值更改为“Y”,则可以终止由 GO TO 语句设置的此循环,如下面的输出所示:

然而,大多数专家认为最好完全避免使用 GO TO 语句,在 COBOL 的情况下,最好使用 PERFORM 动词进行循环。

结论:

现在,我们已经介绍了 COBOL 中的循环,应该不难注意到该语言具有我们在现代语言中看到的流行的 repeat、while、for 和 do-while 循环的选项。这是通过使用全能的 PERFORM 动词来实现的。或者,由于在没有条件的情况下使用时会出现问题,因此 GO TO 动词不常使用。

那么,当涉及到 COBOL 中的循环时,您还有什么想添加的吗?请随时在下面的评论部分分享您的想法。