COBOL入門 Mission2-6 テーブルの利用

処 理 内 容 PROGRAM-ID 難易度 言語
ファイル出力(テーブル体験) CNT006 1 COBOL
1:処理図
2:処理概要

[CNT005の条件変更]
カウントを1〜100まで数えながらカウント値とその時々の時間を (4)外部フォーマットの様式に変更してディスクに書き出す。また 同じものを画面にも表示する 処理の結果を1画面で表示したい
見やすくするために「時分秒」の間に「:」を入れたい
「作業領域で文字列を編集してからWriteする」
3:ファイル名称
I-O
外部ファイル名 編成 KP/KL RL/BF access
(1)カウントデータ out C:\dat\cnt006.dat seq  /  75/1
4:外部フォーマット定義(画面・書式等)
カウント  空白   時    ":"   分   ":"  秒   空白
 9(4)    x(1)   9(2)   x(1)   9(2)  x(1)  9(2)  x(1)
[CNT005]とほぼ同様の項目を、5回分並べたものを1レコードとして出力すること
5:その他

☆テーブルとは

プログラム言語では、同じ利用目的の項目同士をひとつの集団項目として扱うことが可能です。この項目の集りをテーブルと呼びます。

◎テーブル領域の定義(繰り返し) [ OCCURS ]

 01 A-REC.
    03  A-TABLE  OCCURS  10  TIMES. *>下位レベルの項目を繰り返し定義する
        05  A-DATA  PIC X(1).

「A-DATA」という項目を「OCCURS 10」で10回定義している、即ちA-DATAが10個あるということです。

★添字を利用した繰り返し命令 [PERFORM VARYING]

    PERFORM  VARYING  添字  FROM  初期値  FROM  増分値  UNTIL  終了条件
        命令文
    END-PERFORM

*【使用例】

    PERFORM  VARYING  S  FROM  1  BY  1  UNTIL  S  >  10
        DISPLAY  "のび太さんのエッチ!"
    END-PERFORM

(Sという添字を1(初期値)から1(増分値)ずつ増やしつつ、
    10を越えるまで(終了条件)、"のび太さんのエッチ!"の画面表示を繰り返す)

前回のプログラム[Mission2-5 CNT005]では、カウント数と時間が縦一列でズラーッと並んで出力されました。でも、ちょっと見づらいですよね。今度は横に5つずつ、カウント数と時間を表示できるように変更してみましょう。

 IDENTIFICATION             DIVISION.
 PROGRAM-ID.                CNT006.
 ENVIRONMENT                DIVISION.
 INPUT-OUTPUT               SECTION.
 FILE-CONTROL.
     SELECT  F1  ASSIGN  TO  CNT006
                 ACCESS  MODE  IS  SEQUENTIAL.
 DATA                       DIVISION.
 FILE                       SECTION.
 FD  F1.
 01  F1R                    PIC X(75).
 WORKING-STORAGE            SECTION.
 01  CNT                    PIC 9(04) VALUE 0.
 01  S                      PIC 9(01).
 01  WTIME.
     03  HH                 PIC 9(02).
     03  MM                 PIC 9(02).
     03  SS                 PIC 9(02).
 01  W1R.
     03  W1REC  OCCURS  5.
         05  W-CNT          PIC 9(04).
         05                 PIC X(01) VALUE SPACE.
         05  W-HH           PIC 9(02).
         05                 PIC X(01) VALUE ":".
         05  W-MM           PIC 9(02).
         05                 PIC X(01) VALUE ":".
         05  W-SS           PIC 9(02).
         05                 PIC X(01) VALUE SPACE.
 PROCEDURE                  DIVISION.
     OPEN  OUTPUT  F1
     PERFORM  UNTIL  CNT  =  100
         INITIALIZE  W1R
         ACCEPT  WTIME  FROM  TIME
         PERFORM  VARYING  S  FROM  1  BY  1  UNTIL  S  >  5
             ADD  1  TO  CNT
             ACCEPT  WTIME  FROM  TIME
             MOVE  CNT    TO  W-CNT(S)
             MOVE  HH     TO  W-HH(S)
             MOVE  MM     TO  W-MM(S)
             MOVE  SS     TO  W-SS(S)
         END-PERFORM
         WRITE  F1R  FROM  W1R
         DISPLAY  W1R
     END-PERFORM
     CLOSE  F1
     STOP   RUN.

テーブルについて補足説明

今回は同じ項目が5回も出てきます。COBOLプログラムでは同じ名前のついた項目は利用できません。たとえばカウンタ数の名前を「W-CNT」とした場合、この5つ分のカウンタは全て違う名前で項目を作成しなければなりません。

 01 W-CNT1  PIC 9(2)  VALUE  ZERO.
 01 W-CNT2  PIC 9(2)  VALUE  ZERO.
 01 W-CNT3  PIC 9(2)  VALUE  ZERO.
 01 W-CNT4  PIC 9(2)  VALUE  ZERO.
 01 W-CNT5  PIC 9(2)  VALUE  ZERO.

ちょっと記述するのは面倒臭いですよね?テーブルとは、こういった同じ目的を持ち繰り返し利用される項目を、ひとくくりにして利用する手法です。図解にみるとこんな感じ。

これはCOBOL言語に限らず、どのプログラム言語にも(多分)用意されています。では、先ほどの「W-CNT」をテーブル化してみましょう。

 01 W-CNTS.
   02  W-CNT-TABLE  OCCURS  5.
     03 W-CNT  PIC 9(2)  VALUE  ZERO.

こんな感じになります。わかりますか?同じ名前(W-CNT)が一気に5個用意されました。実際に利用する際には、何番目のW-CNTを使うのかこちらで指示してあげればOKです。

    MOVE  1  TO  W-CNT(1) W-CNT(3)
    ADD   1  TO  W-CNT(2)
    COMPUTE  W-CNT(5) = W-CNT(1) + W-CNT(2)

こんな感じで利用されます。さらに添字と呼ばれるものを利用すれば、よりスマートなプログラムが組めます。ではサンプルプログラムを眺めつつ添字について以下に解説してみます。

※前画面に戻る場合は、[Back space]キーが便利です  ▼メニューにジャンプ

テーブルの添え字について

さあ、いよいよ添え字の説明です。結局、何故テーブルを利用するかとプログラマに問えば、きっと「プログラム書くのが楽だから」そんな返事が返ってくると思います。添え字の利用ができて初めてテーブル化した価値がある、そう言い替えてもいい。

サンプルプログラムの中に出てくる、

 01  S                      PIC 9(01).
このSという項目、これが「添え字」にあたります。このプログラムでは出力ファイルのデータ5回分の処理が終わる都度、ファイルに出力しなければなりませんね。この5回の繰り返し文
    PERFORM  VARYING  S  FROM  1  BY  1  UNTIL  S  >  5
この命令によって5回分の繰り返しデータ格納がおこなわれています。ここまで理解できるかな?そして
             MOVE  CNT    TO  W-CNT(S)
             MOVE  HH     TO  W-HH(S)
             MOVE  MM     TO  W-MM(S)
             MOVE  SS     TO  W-SS(S)
ここで初めて添え字によるテーブル格納が処理されるわけです。この添え字は1〜5までの数値を「CNT=100」になるまで繰り返しますね。こういう一連の処理を、添え字を利用すれば簡単に記述できてしまうわけです。便利でしょ?

※前画面に戻る場合は、[Back space]キーが便利です  ▼メニューにジャンプ

<< Back    Index    Next >>   < Top >