Cobol-condition-statements

提供:Dev Guides
移動先:案内検索

COBOL-条件ステートメント

条件ステートメントは、プログラマーが指定した特定の条件に応じて実行フローを変更するために使用されます。 条件付きステートメントは常にtrueまたはfalseに評価されます。 条件は、IF、Evaluate、およびPerformステートメントで使用されます。 条件の種類は次のとおりです-

  • IF条件ステートメント
  • 関係条件
  • サイン条件
  • クラス条件
  • 条件名条件
  • 否定的な条件
  • 複合条件

IF条件ステートメント

IFステートメントは条件をチェックします。 条件が真の場合、IFブロックが実行されます。条件が偽の場合、ELSEブロックが実行されます。

*END-IF* は、IFブロックを終了するために使用されます。 IFブロックを終了するには、END-IFの代わりにピリオドを使用できます。 ただし、複数のIFブロックにはEND-IFを使用することを常にお勧めします。
*Nested-IF* -別のIFブロック内に現れるIFブロック。 ネストされたIFステートメントの深さに制限はありません。

構文

IF条件ステートメントの構文は次のとおりです-

IF [condition] THEN
   [COBOL statements]
ELSE
   [COBOL statements]
END-IF.

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* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

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

関係条件

関係条件は、2つのオペランドを比較します。オペランドは、識別子、リテラル、または算術式のいずれかです。 数値フィールドの代数比較は、サイズと使用法の句に関係なく行われます。

非数値オペランドの場合

同じサイズの2つの非数値オペランドが比較される場合、文字は左から、対応する位置と最後まで比較されます。 より多くの文字を含むオペランドは、より大きく宣言されます。

サイズが等しくない2つの非数値オペランドを比較する場合、オペランドのサイズが等しくなるまで、短いデータ項目の末尾にスペースが追加され、前のポイントで述べた規則に従って比較されます。

構文

以下に、関係条件ステートメントの構文を示します-

[Data Name/Arithmetic Operation]

   [IS] [NOT]

[Equal to (=),Greater than (>), Less than (<),
Greater than or Equal (>=), Less than or equal (<=) ]

[Data Name/Arithmetic Operation]

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* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1 IS GREATER THAN WS-NUM2

サイン条件

符号条件は、数値オペランドの符号を確認するために使用されます。 与えられた数値がゼロより大きいか、小さいか、等しいかを決定します。

構文

以下は、符号条件ステートメントの構文です-

[Data Name/Arithmetic Operation]

   [IS] [NOT]

[Positive, Negative or Zero]

[Data Name/Arithmetic Operation]

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* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

クラス条件

クラス条件は、オペランドにアルファベットまたは数値データのみが含まれているかどうかを確認するために使用されます。 スペースは、ALPHABETIC、ALPHABETIC-LOWER、およびALPHABETIC-UPPERで考慮されます。

構文

以下は、クラス条件ステートメントの構文です-

[Data Name/Arithmetic Operation>]

   [IS] [NOT]

[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]

[Data Name/Arithmetic Operation]

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* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

条件名条件

条件名はユーザー定義の名前です。 ユーザーが指定した値のセットが含まれます。 ブール変数のように動作します。 レベル番号88で定義されます。 PIC句はありません。

構文

以下は、ユーザー定義の条件ステートメントの構文です-

88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].

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* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Passed with 065 marks

否定的な条件

否定条件は、NOTキーワードを使用して与えられます。 条件がtrueで、その前にNOTを指定した場合、その最終値はfalseになります。

構文

否定条件ステートメントの構文は次のとおりです-

IF NOT [CONDITION]
   COBOL Statements
END-IF.

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* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

ELSE-BLOCK

複合条件

結合条件には、論理演算子ANDまたはORを使用して接続された2つ以上の条件が含まれます。

構文

以下は、結合された条件ステートメントの構文です-

IF [CONDITION] AND [CONDITION]
   COBOL Statements
END-IF.

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* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Both condition OK

動詞を評価する

動詞の評価は、一連のIF-ELSEステートメントの置き換えです。 複数の条件を評価するために使用できます。 CプログラムのSWITCHステートメントに似ています。

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* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-A GREATER THAN 2