[COBOLのはじめ方] Part10: 繰り返し処理(PERFORM, TIMES, UNTIL)

COBOL

こんにちは! COBOL学習中の皆さん 😊
今回は、プログラムで同じ処理を何度も繰り返したいときに使う「繰り返し処理」について学びます。COBOLでは主に PERFORM 文を使って繰り返しを実現します。色々な書き方があるので、一つずつ見ていきましょう!

1. PERFORM文の基本(手続きの実行)

一番シンプルな PERFORM は、指定した手続き(段落やセクション)を実行するためだけに使われます。繰り返しというよりは、単なる手続きの呼び出しです。


IDENTIFICATION DIVISION.
PROGRAM-ID. SIMPLE-PERFORM.
DATA DIVISION.
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DISPLAY-MESSAGE
    STOP RUN.

DISPLAY-MESSAGE.
    DISPLAY "手続きが実行されました!".
        

上記の例では、MAIN-PROCEDURE の中で PERFORM DISPLAY-MESSAGE が実行されると、DISPLAY-MESSAGE という名前の段落に書かれた処理(メッセージの表示)が行われます。

2. PERFORM … TIMES(回数指定の繰り返し)

決まった回数だけ処理を繰り返したい場合は、PERFORM ... TIMES を使います。


IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-TIMES.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNT PIC 9(1).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DISPLAY-LOOP 3 TIMES
    STOP RUN.

DISPLAY-LOOP.
    DISPLAY "これはループ処理です!".
        

この例では、DISPLAY-LOOP 段落が 3回 繰り返されます。数字だけでなく、数字を格納したデータ項目(変数)を指定することもできます。


* データ項目で回数を指定する例
IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-TIMES-VAR.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 LOOP-COUNT PIC 9(2) VALUE 5.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM DISPLAY-LOOP LOOP-COUNT TIMES
    STOP RUN.

DISPLAY-LOOP.
    DISPLAY "データ項目で指定された回数ループします!".
        

3. PERFORM … UNTIL(条件指定の繰り返し)

特定の条件が満たされるまで処理を繰り返したい場合は、PERFORM ... UNTIL を使います。条件判定のタイミングで2つの書き方があります。

3.1. TEST BEFORE (前判定)

PERFORM WITH TEST BEFORE UNTIL 条件 または、TEST BEFORE を省略した PERFORM UNTIL 条件 の形です。ループ内の処理を実行するに条件を判定します。最初に条件が満たされている場合、ループ内の処理は一度も実行されません。


IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-UNTIL-BEFORE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 9(1) VALUE 1.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM COUNT-UP UNTIL COUNTER > 3
    DISPLAY "終了時のCOUNTER: " COUNTER
    STOP RUN.

COUNT-UP.
    DISPLAY "COUNTER: " COUNTER
    ADD 1 TO COUNTER.
        

この例では、COUNTER が 1, 2, 3 の時に COUNT-UP が実行され、COUNTER が 4 になった時点で条件 COUNTER > 3 が満たされるため、ループを抜けます。最終的に COUNTER は 4 になります。

3.2. TEST AFTER (後判定)

PERFORM WITH TEST AFTER UNTIL 条件 の形です。ループ内の処理を実行したに条件を判定します。そのため、条件が最初から満たされていても、ループ内の処理は最低1回は必ず実行されます。


IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-UNTIL-AFTER.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 9(1) VALUE 4. *> 最初から条件を満たす値
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    DISPLAY "TEST AFTER 開始".
    PERFORM WITH TEST AFTER UNTIL COUNTER > 3
        DISPLAY "COUNTER: " COUNTER
        ADD 1 TO COUNTER
    END-PERFORM
    DISPLAY "終了時のCOUNTER: " COUNTER
    STOP RUN.
        

この例では、COUNTER は最初 4 であり、条件 COUNTER > 3 を満たしています。しかし、TEST AFTER なので、まずループ内の処理が1回実行され、COUNTER: 4 が表示され、COUNTER は 5 になります。その後、条件判定が行われ、条件を満たすためループを抜けます。最終的に COUNTER は 5 になります。

💡 TEST BEFORETEST AFTER のどちらを使うかは、処理の内容によって決めましょう。通常は TEST BEFORE (省略形) がよく使われます。

4. PERFORM VARYING … UNTIL(カウンター付き繰り返し)

カウンター変数を使い、その値を変化させながら条件を満たすまで繰り返す場合によく使われるのが PERFORM VARYING です。


IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-VARYING.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(2).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5
        DISPLAY "現在の I の値: " I
    END-PERFORM
    DISPLAY "ループ終了後の I の値: " I
    STOP RUN.
        

この例は、次のような意味になります。

  • 変数 IFROM 1 (初期値1) で始める。
  • ループ処理を実行する前に UNTIL I > 5 (Iが5より大きくなるまで) という条件をチェックする (TEST BEFORE)。
  • 条件が満たされていなければ、ループ内の処理(DISPLAY "現在の I の値: " I)を実行する。
  • ループ内の処理が終わったら、変数 IBY 1 (1ずつ増やす) で変化させる。
  • 再び条件チェックから繰り返す。
結果として、I が 1, 2, 3, 4, 5 の時に DISPLAY 文が実行され、I が 6 になった時点でループを抜けます。

FROM (初期値), BY (増分), UNTIL (終了条件) をうまく使うことで、様々な繰り返し処理を簡潔に書けます。

5. PERFORMの色々な書き方 まとめ 📝

今回学んだ PERFORM 文の主な使い方をまとめます。

形式主な用途特徴
PERFORM 手続き名手続き(段落・セクション)の実行単純な呼び出し。サブルーチンのように使う。
PERFORM 手続き名 回数 TIMES回数指定の繰り返し指定した回数だけ手続きを繰り返す。
PERFORM 手続き名 UNTIL 条件
(TEST BEFORE)
条件指定の繰り返し(前判定)処理の前に条件を判定。条件次第では一度も実行されない。
PERFORM 手続き名 WITH TEST AFTER UNTIL 条件条件指定の繰り返し(後判定)処理の後に条件を判定。最低1回は実行される。
PERFORM VARYING 変数 FROM 初期値 BY 増分 UNTIL 条件カウンター付き繰り返し変数を変化させながら条件を満たすまで繰り返す。TEST BEFOREが基本。
PERFORM インライン処理 END-PERFORM手続きを使わない繰り返しPERFORMEND-PERFORM の間に直接処理を記述する。TIMES, UNTIL, VARYING と組み合わせ可能。

⚠️ PERFORM UNTIL などで、ループ内で条件が変化しない場合、無限ループになってしまう可能性があります。カウンター変数の更新忘れなどに注意しましょう!

今回はCOBOLの繰り返し処理 PERFORM 文について学びました。繰り返し処理はプログラミングの基本であり、非常に重要です。色々なパターンを実際に書いて動かして、使い方に慣れていきましょう!🚀

コメント

タイトルとURLをコピーしました