導入
「5人分の点数を管理したい」——このとき WS-SCORE-1、WS-SCORE-2……と5個の変数を別々に宣言するのは非効率です。COBOLには、同じ形のデータを繰り返し持つための OCCURS句 があります。
説明
01 WS-SCORES.
05 WS-SCORE PIC 9(3) OCCURS 5 TIMES.
OCCURS 5 TIMES…WS-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-NAME と WS-EMP-AGE という2つの子項目が入っています。「氏名と年齢のペアが3人分並んでいる表」というイメージです。
試すには
5人分の点数を入れる WS-SCORE OCCURS 5 TIMES を宣言し、WS-SCORE(1) から WS-SCORE(5) まで順番に値をMOVEしてから、それぞれをDISPLAYしてみましょう。