OCCURSで表を定義する
OCCURSは、同じ形式のデータを複数個持つ表を定義します。次の例では、3人分の点数を配列のように扱います。
3人の点数COBOL
01 SCORES.
05 SCORE PIC 9(3) OCCURS 3 TIMES.SCORE (1)、SCORE (2)のように括弧内の添字を指定します。COBOLではデータ名と添字の間に空白を入れても読めますが、既存コードの書き方に合わせるのが安全です。
添字で値を読み書きする
添字を1から始めて、PERFORM VARYINGで順番に値を設定できます。ループ終了後の添字の値にも注意しましょう。
表へ点数を入れるCOBOL
01 SCORES.
05 SCORE PIC 9(3) OCCURS 3 TIMES.
01 I PIC 9 VALUE 1.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
COMPUTE SCORE (I) = I * 25
END-PERFORM.
DISPLAY SCORE (1) " / " SCORE (2) " / " SCORE (3).実行結果OUTPUT
025 / 050 / 075表を検索する
表の各要素を順番に調べ、目的の値が見つかったらフラグを立てます。データが見つからない場合の処理も用意します。
商品コードを探すCOBOL
01 CODES.
05 ITEM-CODE PIC 9(3) OCCURS 4 TIMES.
01 TARGET PIC 9(3) VALUE 310.
01 FOUND PIC X VALUE "N".
01 I PIC 9 VALUE 1.
MOVE 101 TO ITEM-CODE (1).
MOVE 205 TO ITEM-CODE (2).
MOVE 310 TO ITEM-CODE (3).
MOVE 412 TO ITEM-CODE (4).
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4 OR FOUND = "Y"
IF ITEM-CODE (I) = TARGET
MOVE "Y" TO FOUND
END-IF
END-PERFORM.
IF FOUND = "Y" DISPLAY "見つかりました。"
ELSE DISPLAY "見つかりません。"
END-IF.実行結果OUTPUT
見つかりました。表の値を集計する
合計用の項目を0で初期化し、各要素をADDします。合計項目を初期化し忘れると、前回の計算結果が混ざるため注意が必要です。
合計と平均を求めるCOBOL
01 SCORES.
05 SCORE PIC 9(3) OCCURS 3 TIMES.
01 TOTAL PIC 9(4) VALUE 0.
01 AVERAGE PIC 9(3).
01 I PIC 9.
MOVE 70 TO SCORE (1).
MOVE 80 TO SCORE (2).
MOVE 90 TO SCORE (3).
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
ADD SCORE (I) TO TOTAL
END-PERFORM.
COMPUTE AVERAGE = TOTAL / 3.
DISPLAY "合計=" TOTAL " 平均=" AVERAGE.実行結果OUTPUT
合計=0240 平均=080練習
5人分の点数をOCCURS 5 TIMESで定義し、合計、最高点、60点以上の人数を求めてください。点数を変えた場合も正しい結果になるようにします。
余裕があれば、商品コードと商品名を同じ回数のOCCURSで持ち、コードから商品名を検索して表示してみましょう。
