COBOL - instrukcje warunkowe
Instrukcje warunkowe służą do zmiany przepływu wykonywania w zależności od określonych warunków określonych przez programistę. Instrukcje warunkowe zawsze będą oceniane jako prawda lub fałsz. Warunki są używane w instrukcjach IF, Evaluate i Perform. Różne rodzaje warunków są następujące -
- Instrukcja warunku IF
- Warunek relacji
- Stan znaku
- Stan klasy
- Warunek nazwy warunku
- Stan zanegowany
- Połączony stan
Instrukcja warunku IF
Instrukcja IF sprawdza warunki. Jeśli warunek jest spełniony, wykonywany jest blok IF; a jeśli warunek jest fałszywy, wykonywany jest blok ELSE.
END-IFsłuży do zakończenia bloku IF. Aby zakończyć blok IF, można użyć kropki zamiast END-IF. Ale zawsze lepiej jest używać END-IF dla wielu bloków IF.
Nested-IF- Bloki IF pojawiające się w innym bloku IF. Nie ma ograniczeń co do głębokości zagnieżdżonych instrukcji IF.
Składnia
Poniżej znajduje się składnia instrukcji warunkowych JEŻELI -
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK
Warunek relacji
Warunek relacji porównuje dwa operandy, z których każdy może być identyfikatorem, literałem lub wyrażeniem arytmetycznym. Algebraiczne porównanie pól numerycznych jest wykonywane niezależnie od rozmiaru i klauzuli użycia.
For non-numeric operands
Jeśli porównuje się dwa nieliczbowe operandy o jednakowym rozmiarze, znaki są porównywane od lewej z odpowiednimi pozycjami aż do końca. Operand zawierający większą liczbę znaków jest deklarowany jako większy.
Jeżeli porównuje się dwa nieliczbowe operandy o nierównych rozmiarach, to do krótszego elementu danych dodaje się spacje na końcu, aż rozmiar argumentów stanie się równy, a następnie porównuje się go zgodnie z regułami wymienionymi w poprzednim punkcie.
Składnia
Poniżej podano składnię instrukcji warunku relacji -
[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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -
WS-NUM1 IS GREATER THAN WS-NUM2
Stan znaku
Warunek znaku służy do sprawdzania znaku operandu numerycznego. Określa, czy dana wartość liczbowa jest większa, mniejsza lub równa ZERO.
Składnia
Poniżej znajduje się składnia instrukcji warunku 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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -
WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE
Stan klasy
Warunek klasy służy do sprawdzania, czy operand zawiera tylko litery lub dane liczbowe. Spacje są brane pod uwagę w alfabetycznym, alfabetycznym-dolnym i alfabetycznym-górnym.
Składnia
Poniżej znajduje się składnia instrukcji warunku klasy -
[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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC
Nazwa warunku Warunek
Nazwa warunku to nazwa zdefiniowana przez użytkownika. Zawiera zestaw wartości określonych przez użytkownika. Zachowuje się jak zmienne boolowskie. Są one zdefiniowane na poziomie 88. Nie będą miały klauzuli PIC.
Składnia
Poniżej znajduje się składnia instrukcji warunkowych zdefiniowanych przez użytkownika -
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
Passed with 065 marks
Stan zanegowany
Warunek negowany jest podawany za pomocą słowa kluczowego NOT. Jeśli warunek jest prawdziwy, a przed nim NIE podaliśmy, jego ostateczna wartość będzie fałszywa.
Składnia
Poniżej znajduje się składnia instrukcji warunkowych z wykluczeniem -
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
ELSE-BLOCK
Połączony stan
Warunek złożony zawiera co najmniej dwa warunki połączone za pomocą operatorów logicznych AND lub OR.
Składnia
Poniżej znajduje się składnia połączonych instrukcji warunkowych -
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
Both condition OK
Oceń czasownik
Czasownik oceny jest zamiennikiem serii instrukcji IF-ELSE. Może służyć do oceny więcej niż jednego warunku. Jest podobny do instrukcji SWITCH w programach C.
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 aby wykonać powyższy program w języku COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
WS-A GREATER THAN 2