本文へスキップ
BecomeCoder

COBOLコース · 第6章 表を扱う ― OCCURSと配列 · レッスン30

OCCURS句 ― 同じ形の項目を繰り返す(配列相当)

ローカル実施

導入

「5人分の点数を管理したい」——このとき WS-SCORE-1WS-SCORE-2……と5個の変数を別々に宣言するのは非効率です。COBOLには、同じ形のデータを繰り返し持つための OCCURS句 があります。

説明

       01  WS-SCORES.
           05  WS-SCORE         PIC 9(3)   OCCURS 5 TIMES.
  • OCCURS 5 TIMESWS-SCORE という項目を 5個繰り返す という宣言。これで WS-SCORE は「5個分の PIC 9(3)」という**表(テーブル)**になります。
  • WS-SCORES 全体では、9(3)(3バイト)× 5個 = 15バイトの連続した領域が確保されます。

他の言語で言えば int scores[5]; に相当する宣言です。COBOLでは配列のことを 表(table) と呼ぶのが伝統的な用語です。

要素へのアクセスは、変数名のあとにカッコで**添字(番号)**を指定します。

       PROCEDURE DIVISION.
           MOVE 90 TO WS-SCORE(1).
           MOVE 85 TO WS-SCORE(2).
           MOVE 78 TO WS-SCORE(3).

           DISPLAY WS-SCORE(1).
      *>  結果: 090
  • WS-SCORE(1) … 1番目の要素。COBOLの添字は1から始まります(多くのプログラミング言語の0始まりと異なるので要注意)。

集団項目にもOCCURSを付けられます。これは「構造体の配列」に相当します。

       01  WS-EMPLOYEE-TABLE.
           05  WS-EMPLOYEE      OCCURS 3 TIMES.
               10  WS-EMP-NAME  PIC X(10).
               10  WS-EMP-AGE   PIC 9(3).

       PROCEDURE DIVISION.
           MOVE "SUZUKI" TO WS-EMP-NAME(1).
           MOVE 28 TO WS-EMP-AGE(1).
           DISPLAY WS-EMP-NAME(1).

WS-EMPLOYEE が3人分繰り返され、それぞれに WS-EMP-NAMEWS-EMP-AGE という2つの子項目が入っています。「氏名と年齢のペアが3人分並んでいる表」というイメージです。

試すには

5人分の点数を入れる WS-SCORE OCCURS 5 TIMES を宣言し、WS-SCORE(1) から WS-SCORE(5) まで順番に値をMOVEしてから、それぞれをDISPLAYしてみましょう。