解決したいこと
COBOLにてアンケートプログラムを作成しているのですが、集計結果を上手く出力することが出来ないです。
問題
設問の数は1~10問で可変、回答の選択肢は1~5の間で可変。
処理するアンケートによって、設問数、選択肢数はパラメタファイルで設定できる。
また、集計元結果ファイルの先頭1行はヘッダ行となり、対応するパラメタIDが設定される。ヘッダ行のパラメタIDとパラメタのパラメタIDが相違する場合はエラー終了させる。
同様に、集計元結果ファイルの最終行にはそのファイルのデータレコードの件数が設定される。この件数とファイルのデータレコード数が不一致である場合はエラー終了させる。
私が考えていること
箱の初期化
ファイルを開く
1行目読み込む
2行目読み込む
ヘッダIDとパラメタIDが相違しているなら終了
(GO TO で、終了)
ファイルを読み込む
↓
主処理
データ区分が2なら
ループ
入力データを足す→計算結果格納する箱がいる
1行読む
ループ
データ区分が2でないなら、
件数とファイルのデータレコード数が不一致である場合はエラー終了させる。
↓
終了処理
結果を出力する
ファイルを閉じる
ディスプレイに表示
終わる
入力ファイル
1JP000001
200001,00101,00001,0000,10000,10000,10000,10000,10000,10000
200001,00101,00001,0000,10000,10000,10000,10000,10000,10000
200001,00101,00001,0000,10000,10000,10000,10000,10000,10000
200001,00101,00001,0000,10000,10000,10000,10000,10000,10000
200001,00101,00001,0000,10000,10000,10000,10000,10000,10000
900005
パラメタファイル
JP000001,06,01
出力ファイルで出力したい形
例)設問1選択肢1件数5
************************************************************ * 例題プログラム * ank3 ************************************************************ * 見出し部 ************************************************************ IDENTIFICATION DIVISION. PROGRAM-ID. ank3. ************************************************************ * 環境部 ************************************************************ ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. * 入力ファイル SELECT 入力ファイル ASSIGN TO syukeimoto ORGANIZATION IS LINE SEQUENTIAL. * パラメタファイル SELECT パラメタファイル ASSIGN TO parameta ORGANIZATION IS LINE SEQUENTIAL. * 出力ファイル SELECT 出力ファイル ASSIGN TO syukeiresult ORGANIZATION IS LINE SEQUENTIAL. ************************************************************ * データ部 ************************************************************ DATA DIVISION. FILE SECTION. * 入力ファイルのレイアウト定義 FD 入力ファイル. 01 ヘッダ. 03 ヘッダ区分 PIC 9(1). 03 ヘッダID PIC X(08). 01 データ. 03 データ区分 PIC 9(1). 03 データ設問 OCCURS 10. 05 データー選択肢 OCCURS 5. 07 入力ー結果 PIC 9(01). 05 FILLER PIC 9(01). 01 トレーラ. 03 トレーラ区分 PIC 9(1). 03 トレーラーデータ件数 PIC X(05). *----------------------------------------------------------- * パラメタファイルのレイアウト定義 FD パラメタファイル. 01 パラメタ. 03 パラメタID PIC X(08). 03 FILLER PIC 9(01). 03 設問 PIC 9(02). 03 FILLER PIC 9(01). 03 選択肢 PIC 9(01). *----------------------------------------------------------- * 出力ファイルのレイアウト定義 FD 出力ファイル. 01 出力. 03 出力ー設問 PIC 9(02). 03 出力ー選択肢 PIC 9(01). 03 出力ー件数 PIC 9(02). *----------------------------------------------------------- *作業領域の定義 WORKING-STORAGE SECTION. 01 W定数. 03 W定数ー終了 PIC 9(02) VALUE 1. 01 W表示. 03 W表示ー終了 PIC 9(02). 03 W表示ー終了2 PIC 9(02). 01 W計算. 03 W計算ー設問 OCCURS 10. 05 W計算ー回答 OCCURS 5. 07 W計算ー箱 PIC 9(02). 01 W色々. 03 WIXーx PIC 9(02). 03 WIXーy PIC 9(02). 03 WIX-入力件数 PIC 9(02). ************************************************************ * 手続き部 ************************************************************ PROCEDURE DIVISION. メインコントロール SECTION. メインコントロールS. ************************************************************ * メインコントロール ************************************************************ PERFORM 初期処理 * PERFORM 主処理 UNTIL W表示ー終了 = W定数ー終了 * PERFORM 終了処理 . メインコントロールE. STOP RUN. 初期処理 SECTION. 初期処理S. ************************************************************ * 初期処理 ************************************************************ * 作業領域の初期化 INITIALIZE W表示. INITIALIZE W色々. * ファイルのオープン OPEN INPUT 入力ファイル. OPEN INPUT パラメタファイル. OPEN OUTPUT 出力ファイル. * 入力データの読み込み PERFORM ファイル読み込み PERFORM パラメタ読み込み * 相違エラー IF ヘッダID NOT = パラメタID THEN DISPLAY "エラー" UPON CONSOLE GO TO メインコントロールE END-IF PERFORM ファイル読み込み . 初期処理E. EXIT. 主処理 SECTION. 主処理S. ************************************************************ * 主処理 ************************************************************ *集計 IF データ区分 = 2 THEN PERFORM UNTIL WIXーx = 設問 COMPUTE WIXーx = WIXーx + 1 PERFORM UNTIL WIXーy = 選択肢 COMPUTE WIXーy = WIXーy + 1 IF 入力ー結果(WIXーx ,WIXーy) = 1 THEN COMPUTE W計算ー箱 (WIXーx ,WIXーy) = W計算ー箱(WIXーx ,WIXーy) + 1 END-IF END-PERFORM INITIALIZE WIXーy END-PERFORM INITIALIZE WIXーx END-IF * 入力データの読み込み PERFORM ファイル読み込み . 主処理E. EXIT. 終了処理 SECTION. 終了処理S. ************************************************************ * 終了処理 ************************************************************ * 出力ファイルの編集 PERFORM UNTIL WIXーx = 設問 COMPUTE WIXーx = WIXーx + 1 PERFORM UNTIL WIXーy = 選択肢 COMPUTE WIXーy = WIXーy + 1 PERFORM 書き込み END-PERFORM INITIALIZE WIXーy END-PERFORM . * 出力ファイルの編集 CLOSE 入力ファイル CLOSE パラメタファイル CLOSE 出力ファイル . 終了処理E. EXIT. ヘッダ9 SECTION. ヘッダ9S. ************************************************************ * ヘッダ9 ************************************************************ IF WIX-入力件数 NOT = トレーラーデータ件数 DISPLAY "入力件数が正しくありません" UPON CONSOLE CLOSE 入力ファイル CLOSE パラメタファイル CLOSE 出力ファイル STOP RUN END-IF . 終了処理E. EXIT. ファイル読み込み SECTION. ファイル読み込みS. ************************************************************ * ファイル読み込み ************************************************************ READ 入力ファイル AT END MOVE 1 TO W表示ー終了 NOT AT END COMPUTE WIX-入力件数 = WIX-入力件数 + 1 END-READ . ファイル読み込みE. EXIT. パラメタ読み込み SECTION. パラメタ読み込みS. ************************************************************ * パラメタ読み込み ************************************************************ READ パラメタファイル AT END MOVE 1 TO W表示ー終了2 NOT AT END CONTINUE END-READ . ファイル読み込みE. EXIT. 書き込み SECTION. 書き込みS. ************************************************************ * 書き込み ************************************************************ MOVE WIXーx TO 出力ー設問 MOVE WIXーy TO 出力ー選択肢 MOVE W計算ー箱(WIXーx,WIXーy) TO 出力ー件数 WRITE 出力 . 書き込みE. EXIT.
あなたの回答
tips
プレビュー