条件语句( Conditional Statements)
条件语句用于根据程序员指定的某些条件更改执行流程。 条件语句将始终评估为true或false。 条件用于IF,Evaluate和Perform语句。 不同类型的条件如下 -
- IF条件声明
- 关系条件
- Sign Condition
- Class Condition
- Condition-Name Condition
- 否定条件
- 综合条件
IF Condition 语句
IF语句检查条件。 如果条件为真,则执行IF块; 如果条件为假,则执行ELSE块。
END-IF用于结束IF块。 要结束IF块,可以使用句点代替END-IF。 但总是最好将END-IF用于多个IF块。
Nested-IF IF块出现在另一个IF块内。 嵌套IF语句的深度没有限制。
语法 (Syntax)
以下是IF条件语句的语法 -
IF [condition] THEN
[COBOL statements]
ELSE
[COBOL statements]
END-IF.
Example
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
关系条件
关系条件比较两个操作数,其中任何一个都可以是标识符,文字或算术表达式。 无论大小和用法子句如何,都会对数字字段进行代数比较。
For non-numeric operands
如果比较两个相等大小的非数字操作数,则从左侧将字符与相应位置进行比较,直到达到结束。 包含更多字符的操作数被声明为更大。
如果比较两个不等大小的非数字操作数,则较短的数据项在末尾附加空格,直到操作数的大小变得相等,然后根据前一点中提到的规则进行比较。
语法 (Syntax)
以下是关系条件语句的语法 -
[Data Name/Arithmetic Operation]
[IS] [NOT]
[Equal to (=),Greater than (>), Less than (<),
Greater than or Equal (>=), Less than or equal (<=) ]
[Data Name/Arithmetic Operation]
Example
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
签署条件
符号条件用于检查数字操作数的符号。 它确定给定的数值是否大于,小于或等于零。
语法 (Syntax)
以下是Sign条件语句的语法 -
[Data Name/Arithmetic Operation]
[IS] [NOT]
[Positive, Negative or Zero]
[Data Name/Arithmetic Operation]
Example
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
class条件
类条件用于检查操作数是否仅包含字母或数字数据。 空间被认为是ALPHABETIC,ALPHABETIC-LOWER和ALPHABETIC-UPPER。
语法 (Syntax)
以下是类条件语句的语法 -
[Data Name/Arithmetic Operation>]
[IS] [NOT]
[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]
[Data Name/Arithmetic Operation]
Example
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-NUM1 IS NUMERIC
Condition-name Condition
条件名称是用户定义的名称。 它包含用户指定的一组值。 它的行为类似于布尔变量。 它们的级别为88.它没有PIC条款。
语法 (Syntax)
以下是用户定义的条件语句的语法 -
88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].
Example
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关键字给出否定条件。 如果条件为真且我们在它前面给出了NOT,那么它的最终值将为false。
语法 (Syntax)
以下是否定条件语句的语法 -
IF NOT [CONDITION]
COBOL Statements
END-IF.
Example
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连接的两个或多个条件。
语法 (Syntax)
以下是组合条件语句的语法 -
IF [CONDITION] AND [CONDITION]
COBOL Statements
END-IF.
Example
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语句。
Example
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