COBOL入門 Mission3-4
処 理 内 容 |
PROGRAM-ID |
難易度 |
言語 |
指定したプログラムを表示する |
LST004 |
1 |
COBOL |
|
1:処理図
|
2:処理概要
[LST003に条件追加] 任意のプログラムを指定して画面に表示する
最初にガイドメッセージを表示する
Display "program-name x(06) type-in"
☆外部ファイル名を組み立てるには
プログラム名は6桁だけ受け取り
前後の文字列を作業領域で組み立てる。
c: \cobol \?????? .cbl
↑ ↑ ↑ ↑
装置名 フォルダ名 プログラム名 拡張子
※図は手違いでLST030になってます
|
|
3:ファイル名称 |
I-O |
外部ファイル名 |
編成 |
KP/KL |
RL/BF |
access |
(1)ソースプログラム |
in |
c:\cobol\??????.cbl |
seq |
/ |
72/1 |
順 |
|
4:その他
外部ファイル名 (c:\cobol\??????.cbl) の中の ?????? 以外の部分をあらかじめ作業領域に作成しておいて組み立てる |
|
IDENTIFICATION DIVISION.
PROGRAM-ID. LST004.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT F1 ASSIGN TO f1idt
* ~~~~~ 外部ファイル名(代名詞)
STATUS FST ACCESS MODE IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD F1.
01 F1R PIC X(72).
WORKING-STORAGE SECTION.
01 FST PIC X(02).
01 CNT PIC 9(02) VALUE 0.
01 F1IDT.
* (この中で外部ファイル名を組み立てる)
03 PIC X(09) VALUE "c:\cobol\".
03 IDT PIC X(06).
03 PIC X(04) VALUE ".cbl".
PROCEDURE DIVISION.
DISPLAY "PROGRAM-NAME X(06) TYPE-IN"
* (プログラム名 6桁を受け取る)
ACCEPT IDT
OPEN INPUT F1
PERFORM UNTIL FST NOT = "00"
READ F1
END DISPLAY "<<< LST004 - ENDED >>>"
NOT END DISPLAY F1R
ADD 1 TO CNT
IF CNT = 20
THEN STOP "!!! OK CLICK !!!"
MOVE 0 TO CNT
ELSE CONTINUE
END-IF
END-READ
END-PERFORM
CLOSE F1
STOP RUN.
整構造にするとこうなります
**** not open program 整構造化 ****
IDENTIFICATION DIVISION.
PROGRAM-ID. LST004.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT F1 ASSIGN TO F1IDT STATUS FST
ACCESS MODE IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD F1.
01 F1R PIC X(72).
WORKING-STORAGE SECTION.
01 FST PIC X(02).
01 F1IDT.
03 PIC X(09) VALUE "c:\cobol\".
03 IDT PIC X(06).
03 PIC X(04) VALUE ".cbl".
01 CNT PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
DISPLAY "PROGRAM-NAME X(06) TYPE-IN"
ACCEPT IDT
OPEN INPUT F1
IF FST = "00"
* ^^^^^^^^^^^^^^^^ (OPEN出来たかどうかの判定をする)
THEN PERFORM UNTIL FST NOT = "00"
READ F1
END DISPLAY "<<< LST004 - ENDED >>>"
NOT END DISPLAY F1R
ADD 1 TO CNT
IF CNT = 20
THEN STOP "!!! OK CLICK!!!"
MOVE 0 TO CNT
ELSE CONTINUE
END-IF
END-READ
END-PERFORM
CLOSE F1
* [ OPEN 出来た時だけ CLOSE命令 が実行される ]
ELSE DISPLAY "!!! PROGRAM NOT-FOUND !!!"
END-IF
STOP RUN.
ファイルステータスを利用しない場合どうなるか?
* file status を使わない場合
IDENTIFICATION DIVISION.
PROGRAM-ID. LST004.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT F1 ASSIGN TO F1IDT ACCESS MODE IS SEQUENTIAL.
* ^^^^^ 外部ファイル名(代名詞)
DATA DIVISION.
FILE SECTION.
FD F1.
01 F1R PIC X(72).
WORKING-STORAGE SECTION.
01 EID PIC X(01).
01 F1IDT.
* ^^^^^ ここで外部ファイル名を組み立てる
03 PIC X(09) VALUE "c:\cobol\".
03 IDT PIC X(06).
03 PIC X(04) VALUE ".cbl".
01 CNT PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
DISPLAY "PROGRAM-NAME X(06) TYPE-IN"
ACCEPT IDT
OPEN INPUT F1
* !!! << ファイルステータスを使っていないので判定できない >> !!!
PERFORM UNTIL EID = "E"
READ F1
END MOVE "E" TO EID
DISPLAY " <<< LST004 - ENDED >>>"
NOT END DISPLAY F1R
ADD 1 TO CNT
IF CNT = 20
THEN STOP "!!! OK CLICK !!!"
MOVE 0 TO CNT
ELSE CONTINUE
END-IF
END-READ
END-PERFORM
CLOSE F1 STOP RUN.
上記のプログラムの場合、ファイルのオープンができなくても以降の処理が流れてしまいます。まぁ実際にはコンピュータ側から処理の強制終了をされますが、こういう記述は出来る限り避けましょう。どんな状況でもキチンと動作させること。それが大事なのですから。
PERFORM制御の場合
* PERFORM制御 *
IDENTIFICATION DIVISION.
PROGRAM-ID. LST004.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT F1 ASSIGN TO F1IDT STATUS 状態
ACCESS MODE IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD F1.
01 F1R PIC X(72).
WORKING-STORAGE SECTION.
01 状態 PIC X(02).
01 F1IDT.
03 PIC X(09) VALUE "c:\cobol\".
03 名前 PIC X(06).
03 PIC X(04) VALUE ".cbl".
01 行数 PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
制御. PERFORM 前処理 THRU 前出口
PERFORM 繰処理 THRU 繰出口 UNTIL 状態 NOT = "00"
PERFORM 後処理 THRU 後出口
STOP RUN.
前処理. DISPLAY "プログラム名 6桁 タイプイン"
ACCEPT 名前
OPEN INPUT F1
PERFORM 読処理 THRU 読出口
前出口. EXIT.
繰処理. DISPLAY F1R
ADD 1 TO 行数
IF 行数 = 20
THEN STOP "!!! OK CLICK !!!
MOVE 0 TO 行数
ELSE CONTINUE
END-IF
PERFORM 読処理 THRU 読出口
繰出口. EXIT.
後処理. DISPLAY "<<< LST004 - 終了>>>"
CLOSE F1
後出口. EXIT.
読処理. READ F1
END CONTINUE
NOT END CONTINUE
END READ
読出口. EXIT.
これがいわゆるCOBOLの王道パターンですね。前処理、本処理、後処理と制御を大きく分けた上、さらに各処理で処理単位にブロック化する。この手のコードが本当に多いです。良いか悪いかは別として…。
PERFORM制御&ステータス制御した場合
*PERFORM制御でファイルステータスを使用
IDENTIFICATION DIVISION.
PROGRAM-ID. LST004.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT F1 ASSIGN TO F1IDT STATUS STS
ACCESS MODE IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD F1.
01 F1R PIC X(72).
WORKING-STORAGE SECTION.
01 STS PIC X(02).
01 FLG PIC X(01) VALUE SPACE.
01 F1IDT.
03 PIC X(09) VALUE "c:\cobol\".
03 NAMAE PIC X(06).
03 PIC X(04) VALUE ".cbl".
01 LCNT PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
MAIN. PERFORM MAE THRU MAE-E
PERFORM LOOP THRU LOOP-E UNTIL STS NOT = "00"
PERFORM ATO THRU ATO-E
STOP RUN.
MAE. DISPLAY "プログラム名 6桁 タイプイン"
ACCEPT NAMAE
OPEN INPUT F1
IF STS NOT = "00"
THEN MOVE "N" TO FLG
DISPLAY "!!! PROGRAM NOT-FOUND !!!"
ELSE PERFORM READ-R THRU READ-E
END-IF
MAE-E. EXIT.
LOOP. DISPLAY F1R
ADD 1 TO LCNT
IF LCNT = 20
THEN STOP "!!! OK CLICK !!!"
MOVE 0 TO LCNT
ELSE CONTINUE
END-IF
PERFORM READ-R THRU READ-E
LOOP-E. EXIT.
ATO. IF FLG = "N"
THEN CONTINUE
ELSE DISPLAY "<<< LST004 - 終了 >>>"
CLOSE F1
END-IF
ATO-E.
READ-R. READ F1
END CONTINUE
NOT END CONTINUE
END READ
READ-E. EXIT.
* [OPEN 出来ない時 OPEN-ERR だけは表示される]
うん、これが一番しっくりきますね。おっと、計らずも「うんこ」と言ってしまいました。すみません。えっと、このプログラムならファイルステータスにてファイルのオープンが出来なかった場合にも対応しています。若干ソースに余計な手間をかけてる感じを受けますが、より正確なプログラムというのはIF,THEN,ELSE,END-IFをキッチリ書くかどうかで決まるとも言えますね。