COBOL - Bedingte Anweisungen

Bedingte Anweisungen werden verwendet, um den Ausführungsfluss in Abhängigkeit von bestimmten vom Programmierer angegebenen Bedingungen zu ändern. Bedingte Anweisungen werden immer als wahr oder falsch bewertet. Bedingungen werden in IF-, Evaluate- und Perform-Anweisungen verwendet. Die verschiedenen Arten von Bedingungen sind wie folgt:

  • IF-Bedingungserklärung
  • Beziehungsbedingung
  • Zeichenbedingung
  • Klassenbedingung
  • Bedingung-Name Bedingung
  • Negierter Zustand
  • Kombinierter Zustand

IF-Bedingungserklärung

IF-Anweisung prüft auf Bedingungen. Wenn eine Bedingung erfüllt ist, wird der IF-Block ausgeführt. und wenn die Bedingung falsch ist, wird der ELSE-Block ausgeführt.

END-IFwird verwendet, um den IF-Block zu beenden. Um den IF-Block zu beenden, kann anstelle von END-IF eine Periode verwendet werden. Es ist jedoch immer vorzuziehen, END-IF für mehrere IF-Blöcke zu verwenden.

Nested-IF- IF-Blöcke erscheinen in einem anderen IF-Block. Die Tiefe verschachtelter IF-Anweisungen ist unbegrenzt.

Syntax

Es folgt die Syntax von IF-Bedingungsanweisungen -

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 um das obige COBOL-Programm auszuführen -

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

Wenn Sie das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:

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

Beziehungsbedingung

Die Beziehungsbedingung vergleicht zwei Operanden, von denen jeder ein Bezeichner, ein Literal oder ein arithmetischer Ausdruck sein kann. Der algebraische Vergleich numerischer Felder erfolgt unabhängig von Größe und Verwendungsklausel.

For non-numeric operands

Wenn zwei nicht numerische Operanden gleicher Größe verglichen werden, werden die Zeichen von links mit den entsprechenden Positionen verglichen, bis das Ende erreicht ist. Der Operand mit einer größeren Anzahl von Zeichen wird als größer deklariert.

Wenn zwei nicht numerische Operanden ungleicher Größe verglichen werden, wird das kürzere Datenelement am Ende mit Leerzeichen versehen, bis die Größe der Operanden gleich ist, und dann gemäß den im vorherigen Punkt genannten Regeln verglichen.

Syntax

Im Folgenden wird die Syntax der Beziehungsbedingungsanweisungen angegeben.

[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 um das obige COBOL-Programm auszuführen -

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

Wenn Sie das obige Programm kompilieren und ausführen, erhalten Sie das folgende Ergebnis:

WS-NUM1 IS GREATER THAN WS-NUM2

Zeichenbedingung

Die Vorzeichenbedingung wird verwendet, um das Vorzeichen eines numerischen Operanden zu überprüfen. Es bestimmt, ob ein gegebener numerischer Wert größer, kleiner oder gleich NULL ist.

Syntax

Es folgt die Syntax der Zeichenbedingungsanweisungen -

[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 um das obige COBOL-Programm auszuführen -

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

Wenn Sie das obige Programm kompilieren und ausführen, erhalten Sie das folgende Ergebnis:

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

Klassenbedingung

Die Klassenbedingung wird verwendet, um zu überprüfen, ob ein Operand nur Alphabete oder numerische Daten enthält. Leerzeichen werden in ALPHABETIC, ALPHABETIC-LOWER und ALPHABETIC-UPPER berücksichtigt.

Syntax

Es folgt die Syntax von Klassenbedingungsanweisungen -

[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 um das obige COBOL-Programm auszuführen -

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

Wenn Sie das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

Bedingungsname Bedingung

Ein Bedingungsname ist ein benutzerdefinierter Name. Es enthält eine Reihe von Werten, die vom Benutzer angegeben wurden. Es verhält sich wie boolesche Variablen. Sie sind mit der Levelnummer 88 definiert. Es wird keine PIC-Klausel geben.

Syntax

Es folgt die Syntax von benutzerdefinierten Bedingungsanweisungen -

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 um das obige COBOL-Programm auszuführen -

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

Wenn Sie das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:

Passed with 065 marks

Negierter Zustand

Der negierte Zustand wird mit dem Schlüsselwort NOT angegeben. Wenn eine Bedingung wahr ist und wir NICHT davor angegeben haben, ist ihr Endwert falsch.

Syntax

Es folgt die Syntax der Anweisungen für negierte Bedingungen:

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 um das obige COBOL-Programm auszuführen -

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

Wenn Sie das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:

ELSE-BLOCK

Kombinierter Zustand

Eine kombinierte Bedingung enthält zwei oder mehr Bedingungen, die mit logischen Operatoren UND oder ODER verbunden sind.

Syntax

Es folgt die Syntax kombinierter Bedingungsanweisungen -

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 um das obige COBOL-Programm auszuführen -

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

Wenn Sie das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:

Both condition OK

Verb auswerten

Das Verb auswerten ist ein Ersatz für eine Reihe von IF-ELSE-Anweisungen. Es kann verwendet werden, um mehr als eine Bedingung zu bewerten. Es ähnelt der SWITCH-Anweisung in C-Programmen.

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 um das obige COBOL-Programm auszuführen -

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

Wenn Sie das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:

WS-A GREATER THAN 2