COBOL - Dichiarazioni condizionali

Le istruzioni condizionali vengono utilizzate per modificare il flusso di esecuzione in base a determinate condizioni specificate dal programmatore. Le dichiarazioni condizionali restituiranno sempre vero o falso. Le condizioni vengono utilizzate nelle istruzioni IF, Evaluate e Perform. I diversi tipi di condizioni sono i seguenti:

  • Dichiarazione delle condizioni IF
  • Condizione di relazione
  • Condizione del segno
  • Condizione di classe
  • Condizione-nome Condizione
  • Condizione negata
  • Condizione combinata

Dichiarazione delle condizioni IF

L'istruzione IF verifica le condizioni. Se una condizione è vera, viene eseguito il blocco IF; e se la condizione è falsa, viene eseguito il blocco ELSE.

END-IFviene utilizzato per terminare il blocco IF. Per terminare il blocco IF, è possibile utilizzare un punto invece di END-IF. Ma è sempre preferibile utilizzare END-IF per più blocchi IF.

Nested-IF- Blocchi IF che compaiono all'interno di un altro blocco IF. Non c'è limite alla profondità delle istruzioni IF annidate.

Sintassi

Di seguito è riportata la sintassi delle istruzioni di condizione 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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

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

Condizione di relazione

La condizione di relazione confronta due operandi, uno dei quali può essere un identificatore, un'espressione letterale o aritmetica. Il confronto algebrico dei campi numerici viene eseguito indipendentemente dalle dimensioni e dalla clausola di utilizzo.

For non-numeric operands

Se vengono confrontati due operandi non numerici di uguale dimensione, i caratteri vengono confrontati da sinistra con le posizioni corrispondenti fino al raggiungimento della fine. L'operando contenente un numero maggiore di caratteri viene dichiarato maggiore.

Se vengono confrontati due operandi non numerici di dimensione diversa, l'elemento di dati più corto viene aggiunto con spazi alla fine fino a quando la dimensione degli operandi diventa uguale e quindi confrontato secondo le regole menzionate al punto precedente.

Sintassi

Di seguito è riportata la sintassi delle istruzioni sulle condizioni di relazione:

[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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

WS-NUM1 IS GREATER THAN WS-NUM2

Condizione del segno

La condizione del segno viene utilizzata per controllare il segno di un operando numerico. Determina se un dato valore numerico è maggiore, minore o uguale a ZERO.

Sintassi

Di seguito è riportata la sintassi delle istruzioni sulla condizione dei segni:

[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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

Condizione di classe

La condizione della classe viene utilizzata per verificare se un operando contiene solo alfabeti o dati numerici. Gli spazi sono considerati in ALFABETICO, ALFABETICO-INFERIORE e ALFABETICO-SUPERIORE.

Sintassi

Di seguito è riportata la sintassi delle istruzioni di condizione della classe:

[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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

Condizione-nome Condizione

Un nome-condizione è un nome definito dall'utente. Contiene una serie di valori specificati dall'utente. Si comporta come le variabili booleane. Sono definiti con il livello numero 88. Non avrà una clausola PIC.

Sintassi

Di seguito è riportata la sintassi delle istruzioni condizionali definite dall'utente:

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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

Passed with 065 marks

Condizione negata

La condizione negata viene fornita utilizzando la parola chiave NOT. Se una condizione è vera e abbiamo dato NON davanti ad essa, il suo valore finale sarà falso.

Sintassi

Di seguito è riportata la sintassi delle istruzioni di condizione negata:

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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

ELSE-BLOCK

Condizione combinata

Una condizione combinata contiene due o più condizioni collegate mediante operatori logici AND o OR.

Sintassi

Di seguito è riportata la sintassi delle istruzioni di condizione combinate:

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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

Both condition OK

Valuta il verbo

Il verbo di valutazione è una sostituzione di una serie di istruzioni IF-ELSE. Può essere utilizzato per valutare più di una condizione. È simile all'istruzione SWITCH nei programmi 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 per eseguire il programma COBOL di cui sopra -

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

Quando compili ed esegui il programma sopra, produce il seguente risultato:

WS-A GREATER THAN 2