COBOL - 条件语句


条件语句用于根据程序员指定的某些条件来更改执行流程。条件语句将始终评估为 true 或 false。条件用于 IF、Evaluate 和 Perform 语句。不同类型的条件如下 -

  • IF 条件语句
  • 关系条件
  • 签署条件
  • 班级条件
  • 条件名称 条件
  • 否定条件
  • 组合条件

IF 条件语句

IF 语句检查条件。如果条件为真,则执行 IF 块;如果条件为假,则执行 ELSE 块。

END-IF用于结束 IF 块。要结束 IF 块,可以使用句点代替 END-IF。但对于多个 IF 块,最好使用 END-IF。

Nested-IF - IF 块出现在另一个 IF 块内。嵌套 IF 语句的深度没有限制。

句法

以下是 IF 条件语句的语法 -

IF [condition] THEN
   [COBOL statements]
ELSE
   [COBOL statements]
END-IF.

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).
   01 WS-NUM3 PIC 9(5).
   01 WS-NUM4 PIC 9(6).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1 WS-NUM3.
   MOVE 15 TO WS-NUM2 WS-NUM4.
   
   IF WS-NUM1 > WS-NUM2 THEN
      DISPLAY 'IN LOOP 1 - IF BLOCK'
      
      IF WS-NUM3 = WS-NUM4 THEN
         DISPLAY 'IN LOOP 2 - IF BLOCK'
      ELSE
         DISPLAY 'IN LOOP 2 - ELSE BLOCK'
      END-IF
      
   ELSE
      DISPLAY 'IN LOOP 1 - ELSE BLOCK'
   END-IF.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 -

IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK

关系条件

关系条件比较两个操作数,其中任何一个操作数都可以是标识符、文字或算术表达式。无论大小和用法子句如何,都会进行数字字段的代数比较。

对于非数字操作数

如果比较两个大小相等的非数字操作数,则从左侧开始将字符与相应位置进行比较,直到到达末尾。包含较多字符的操作数被声明为较大。

如果比较两个大小不相等的非数字操作数,则较短的数据项会在末尾附加空格,直到操作数的大小相等,然后根据上一点提到的规则进行比较。

句法

下面给出的是关系条件语句的语法 -

[Data Name/Arithmetic Operation]

   [IS] [NOT] 

[Equal to (=),Greater than (>), Less than (<), 
Greater than or Equal (>=), Less than or equal (<=) ]

[Data Name/Arithmetic Operation] 

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1.
   MOVE 15 TO WS-NUM2.
   
   IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN
      DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
   ELSE
      DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
   END-IF.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 -

WS-NUM1 IS GREATER THAN WS-NUM2

签署条件

符号条件用于检查数字操作数的符号。它确定给定的数值是否大于、小于或等于 0。

句法

以下是 Sign 条件语句的语法 -

[Data Name/Arithmetic Operation] 

   [IS] [NOT] 

[Positive, Negative or Zero]

[Data Name/Arithmetic Operation]

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC S9(9) VALUE -1234.
   01 WS-NUM2 PIC S9(9) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   IF WS-NUM1 IS POSITIVE THEN
      DISPLAY 'WS-NUM1 IS POSITIVE'.
      
   IF WS-NUM1 IS NEGATIVE THEN
      DISPLAY 'WS-NUM1 IS NEGATIVE'.
      
   IF WS-NUM1 IS ZERO THEN
      DISPLAY 'WS-NUM1 IS ZERO'.
      
   IF WS-NUM2 IS POSITIVE THEN
      DISPLAY 'WS-NUM2 IS POSITIVE'.

STOP RUN.

JCL执行上述 COBOL 程序 -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 -

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

班级条件

类条件用于检查操作数是否仅包含字母或数字数据。空格按 ALPHABETIC、ALPHABETIC-LOWER 和 ALPHABETIC-UPPER 考虑。

句法

以下是类条件语句的语法 -

[Data Name/Arithmetic Operation>]

   [IS] [NOT] 

[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]

[Data Name/Arithmetic Operation]

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
   01 WS-NUM2 PIC 9(9) VALUE 123456789.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF WS-NUM1 IS ALPHABETIC THEN
      DISPLAY 'WS-NUM1 IS ALPHABETIC'.
      
   IF WS-NUM1 IS NUMERIC THEN
      DISPLAY 'WS-NUM1 IS NUMERIC'.
      
   IF WS-NUM2 IS NUMERIC THEN
      DISPLAY 'WS-NUM2 IS NUMERIC'.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 -

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

条件名称 条件

条件名称是用户定义的名称。它包含一组由用户指定的值。它的Behave类似于布尔变量。它们是用级别号 88 定义的。它不会有 PIC 子句。

句法

以下是用户定义的条件语句的语法 -

88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM PIC 9(3).
   88 PASS VALUES ARE 041 THRU 100.
   88 FAIL VALUES ARE 000 THRU 40.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 65 TO WS-NUM.
   
   IF PASS 
      DISPLAY 'Passed with ' WS-NUM ' marks'.
      
   IF FAIL 
      DISPLAY 'FAILED with ' WS-NUM 'marks'.
      
STOP RUN.

JCL执行上述 COBOL 程序 -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 -

Passed with 065 marks

否定条件

否定条件是通过使用 NOT 关键字给出的。如果一个条件为 true 并且我们在它前面给出了 NOT,那么它的最终值将为 false。

句法

以下是否定条件语句的语法 -

IF NOT [CONDITION] 
   COBOL Statements
END-IF.

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(9) VALUE 25.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN
      DISPLAY 'IF-BLOCK'
   ELSE
      DISPLAY 'ELSE-BLOCK'
   END-IF.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 -

ELSE-BLOCK

组合条件

组合条件包含使用逻辑运算符 AND 或 OR 连接的两个或多个条件。

句法

以下是组合条件语句的语法 -

IF [CONDITION] AND [CONDITION]
   COBOL Statements
END-IF.

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(2) VALUE 25.
   01 WS-NUM3 PIC 9(2) VALUE 20.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN
      DISPLAY 'Both condition OK'
   ELSE
      DISPLAY 'Error'
   END-IF.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 -

Both condition OK

评估动词

评估动词是一系列 IF-ELSE 语句的替代。它可用于评估多个条件。它类似于C程序中的SWITCH语句。

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 0.
   
PROCEDURE DIVISION.
   MOVE 3 TO WS-A.
   
   EVALUATE TRUE
      WHEN WS-A > 2
         DISPLAY 'WS-A GREATER THAN 2'

      WHEN WS-A < 0
         DISPLAY 'WS-A LESS THAN 0'

      WHEN OTHER
         DISPLAY 'INVALID VALUE OF WS-A'
   END-EVALUATE.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

当您编译并执行上述程序时,它会产生以下结果 -

WS-A GREATER THAN 2