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