本文へスキップ
BecomeCoder

COBOLコース · 第5章 繰り返しと構造化 ― PERFORM · レッスン28

PERFORM VARYING ― カウンタ制御の繰り返し

ブラウザで完結

導入

レッスン26で「1から5まで表示する」ために、カウンタの初期化・条件判定・更新を自分で書く必要がありました。これを1文にまとめてくれるのが PERFORM VARYING です。多くの言語の for 文に相当します。

説明

       01  WS-I                 PIC 9(2).

       PROCEDURE DIVISION.
           PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
               DISPLAY WS-I
           END-PERFORM.
           STOP RUN.

実行結果はレッスン27と同じく、01 から 05 が1行ずつ表示されます(WS-IPIC 9(2) なので2桁ゼロ詰め)。

  • FROM 1 … カウンタ WS-I の初期値。
  • BY 1 … 1回ごとの増分(増やす量)。
  • UNTIL WS-I > 5 … この条件を満たしたら終了。

PERFORM VARYING は「初期化・条件・増分」の3つが1行にまとまっているのが最大の利点です。他の言語の for (i = 1; i <= 5; i++) に相当する内容が、PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5 という英語に近い1文で表現されています。

第6章で学ぶ OCCURS句(配列 を走査するときにも、このPERFORM VARYINGが定番の書き方になります。

      *> 先取りしたイメージ(第6章で詳しく扱う)
           PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 10
               DISPLAY WS-SCORES(WS-IDX)
           END-PERFORM.

さらに、VARYING は2つ以上のカウンタを同時に制御することもできます(AFTER 句を使う多重ループ)。

           PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
               AFTER WS-J FROM 1 BY 1 UNTIL WS-J > 2
                   DISPLAY WS-I " - " WS-J
           END-PERFORM.
      *>  1-1, 1-2, 2-1, 2-2, 3-1, 3-2 の順に表示される(二重ループ)

AFTER を使った多重ループは、第6章の多次元の表(ネストしたOCCURS)を走査するときにまさに使う書き方です。

試すには

PERFORM VARYING を使って、1 から 10 までの合計を計算するプログラムを書いてみましょう(ループの中で ADD WS-I TO WS-SUM のように積み上げていきます)。

実際に動かしてみよう

下のエディタにCOBOLを書いて「実行」を押すと、学習用シミュレータが DISPLAY の出力を表示します(本物のGnuCOBOLではなく、教材の範囲を再現した軽量エンジンです)。PICTURE句の桁数・ゼロ詰め・切り捨てなどCOBOLらしい挙動もそのまま体験できます。本文の例を書き換えて動かしてみましょう(ファイル処理やCALLなど一部の機能は対象外です)。

COBOL — ブラウザ内で実行(学習用シミュレータ)

COBOLの教材サブセットを動かす学習用シミュレータを読み込みます(本物のGnuCOBOLではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。