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