前回のプログラム[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)
こんな感じで利用されます。さらに添字と呼ばれるものを利用すれば、よりスマートなプログラムが組めます。ではサンプルプログラムを眺めつつ添字について以下に解説してみます。
さあ、いよいよ添え字の説明です。結局、何故テーブルを利用するかとプログラマに問えば、きっと「プログラム書くのが楽だから」そんな返事が返ってくると思います。添え字の利用ができて初めてテーブル化した価値がある、そう言い替えてもいい。
サンプルプログラムの中に出てくる、
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」になるまで繰り返しますね。こういう一連の処理を、添え字を利用すれば簡単に記述できてしまうわけです。便利でしょ?