基本的なCOBOLの文法(4)~PROCEDURE DIVISION 2/2~
D.PROCEDURE DIVISION 2/2
条件処理
IF文により、条件を評価し、対応する文を実行させることができます。構文は次のとおりです。
IF 条件 THEN 文1 ELSE 文2.
条件が真の場合、文1を実行し、それ以外は文2を実行します。文1および文2は複数の文を指定できます。以下にIF文の例を示します。
002010 IF LCNT-1 > 10 THEN 002020 ADD 1 TO PCNT-1 002030 MOVE 1 TO LCNT-1 002040 ELSE 002050 ADD 1 TO LCNT-1 002060 END-IF.
IF文の中にIF文を記述し入れ子構造にすることもできます。以下に入れ子構造のIF文の例を示します。
002010 IF LCNT-1 > 10 THEN 002020 IF PCNT-1 > 5 THEN 002030 MOVE 1 TO PCNT-1 002040 ELSE 002050 ADD 1 TO PCNT-1 002060 END-IF 002070 MOVE 1 TO LCNT-1 002080 ELSE 002090 ADD 1 TO LCNT-1 002100 END-IF.
真条件または偽条件で処理を行わない場合は"NEXT SENTENCE"を記述します。
002010 IF LCNT-1 > 10 THEN 002020 NEXT SENTENCE 002030 ELSE 002040 ADD 1 TO LCNT-1 002050 END-IF. 002060 IF PCNT-1 > 1 THEN 002070 ADD 1 TO PCNT-1 002080 ELSE 002090 NEXT SENTENCE 002100 END-IF.
偽条件で"NEXT SENTENCE"の場合は、ELSEおよびNEXT SENTENCEを省略できます。
002060 IF PCNT-1 > 1 THEN 002070 ADD 1 TO PCNT-1 002080* ELSE (コメント行にしてみました) 002090* NEXT SENTENCE (コメント行にしてみました) 002100 END-IF.
別の部分に制御を移す
GO TO文により、手続き部のある部分から別の部分に制御を移すことができます。構文は次のとおりです。
(1) GO TO 手続き名. (2) GO TO 手続き名1 手続き名2… DEPENDING ON 一意名.
- (1)は、手続き名で指定された箇所に制御を移します。
- (2)は一意名の内容により、指定された箇所に制御を移します。
繰り返し実行
PERFORM文により一連の文を繰り返し実行できます。構文は次のとおりです。
(1) PERFORM 手続き名1 THRU 手続き名2 回数 TIMES. (2) PERFORM 回数 TIMES 文 END-PERFORM. (3) PERFORM 手続き名1 THRU 手続き名2 TEST 前後指定 UNTIL 条件. (4) PERFORM TEST 前後指定 UNTIL 条件 文 END-PERFORM.
- (1)は、手続き名1から手続き名2までの間を回数分実行します。1回のみ実行する場合は、"回数 TIMES"を省略できます。また、手続き名1のみを実行する場合は、"THRU 手続き名2"を省略できます。以下に例を示します。
- (2)はPERFORM内で指定した単一または複数の文を回数分実行します。1回のみ実行する場合は、"回数 TIMES"を省略できます。以下に例を示します。
- (3)は、手続き名1から手続き名2までの間を条件が真の間実行し、「TEST 前後」により、条件の判定を繰り返しの前か後で行うことを指定します。手続き名1のみを実行する場合は、"THRU 手続き名2"を省略できます。「TEST 前後」を省略することもできます。省力すると条件の判定を繰り返しの前で行います。また、繰り返し実行終了時に条件判定で使用する値を変更することもできます。以下に例を示します。
- (4)は、PERFORM内で指定した単一または複数の文を条件が真の間実行し、「TEST 前後」により、条件の判定を繰り返しの前か後で行うことを指定します。「TEST 前後」を省略することもできます。省力すると条件の判定を繰り返しの前で行います。また、繰り返し実行終了時に条件判定で使用する値を変更することもできます。以下に例を示します。
003000 PERFORM SHORI1 THRU SHORI2 3 TIMES. ...(途中省略) 005000 SHORI1. 005010 MOVE 1 TO CNT1. 005020 MOVE 1 TO CNT2. 006000 SHORI2. 005010 MOVE 1 TO CNT3. 005020 MOVE 1 TO CNT4.
003000 PERFORM 3 TIMES 003010 MOVE 1 TO CNT1 003020 MOVE 1 TO CNT2 003030 MOVE 1 TO CNT3 003040 END-PERFORM.
003000 MOVE 1 TO CNT5. 003010 PERFORM SHORI1 THRU SHORI3 TEST AFTER UNTIL CNT5 < 10. 003020 PERFORM SHORI1 THRU SHORI2 VARYING CNT5 FROM 1 BY 1 UNTIL CNT5 < 10. ...(途中省略) 005000 SHORI1. 005010 MOVE 1 TO CNT1. 005020 MOVE 1 TO CNT2. 006000 SHORI2. 005010 MOVE 1 TO CNT3. 005020 MOVE 1 TO CNT4. 005030 SHORI3. 005040 ADD 1 TO CNT5.
003000 PERFORM TEST AFTER VARING CNT5 FROM 1 BY 1 UNTIL CNT5 < 10 003010 MOVE 1 TO CNT1 003020 MOVE 1 TO CNT2 003030 MOVE 1 TO CNT3 003040 END-PERFORM.
ファイル入出力
ファイル入出力は、OPEN文でファイルを用意し、READ文で入力、WRITE文で出力します。主な構文は次のとおりです。
OPEN INPUT ファイル名. OPEN OUTPUT ファイル名.
READ ファイル名 INTO 一意名 AT END 文1 NOT AT END 文2 END-READ.
WRITE レコード名 FROM 一意名.
詳細は稿を改めて解説します。
プログラムの終了
プログラムの終了はSTOP文で指定します。構文は次のとおりです。
STOP RUN.
STOP文は手続き部のどこにでも、またいくつでも記述することができ、当該処理を実行したときに上位処理に制御を渡します。OpenCOBOLでは、RETURN-CODEという特別な変数が用意されており、これに値を設定すると上位処理にリターンコードを渡すことができます。
000100 IDENTIFICATION DIVISION. 000200 PROGRAM-ID. SAMPLE. 000300 ENVIRONMENT DIVISION. 000400 DATA DIVISION. 000500 FILE SECTION. 000600 WORKING-STORAGE SECTION. 001100 PROCEDURE DIVISION. 001200 DISPLAY "Hello World!!". 001300 MOVE ZERO TO RETURN-CODE. 001400 STOP RUN.
上記の例では、リターンコードは0となります(ZEROは0の定数表記です)。
まとめ
以上、サンプルコードを交えて、COBOLの言語仕様について基本的な内容を一通り説明しましたが、言語仕様にコーディング規約が内包されているような感想を持たれた方は多いと思います。
実際に使用されているCOBOLは周辺機能(プラグイン)がさらに充実しており、現在でも実際の業務として新規に開発が可能な言語となっています。OpenCOBOLのプラグインは開発途上ではありますが、これを機会にCOBOL言語を触れてみてはどうでしょうか。
次回は、ファイル処理を中心に、実際にコーディングをして機能を確かめてみたいと思います。
参考
- COBOL言語をLinux環境で動かす:CodeZine(OpenCOBOL環境のインストール方法)