実 習 2 最大値・最小値
最大値と最小値 実習2 第3図のようなクラブコード、予算額、支出額を記録したファイルを読み、 第3図のようなクラブコード、予算額、支出額を記録したファイルを読み、 処理条件にしたがい第4図のように印字するプログラムを完成させなさい。 入力形式 処理条件 入力ファイル名: YOSAN-F 入力レコード名: YOSAN-R (1)執行率は次の計算式で求める。 執行額 = 支出額 × 100 ÷ 予算 (2)データが終わりになったら、執行率が 最大のクラブコードとその執行率、執行 率が最小のクラブコードとその執行率を 印字する。 (3)最大・最小の執行率のクラブが複数あ る時は、後に入力されたクラブコードを クラブコード (CCODE) X(4) 予算額 (YOSAN) 9(6) 支出額 (SYUTU) 9(6) (第3図) 出力形式 出力ファイル名: LIST-F 出力レコード名: LIST-R クラブ 予算額 支出額 執行率 XXXX ZZZ,ZZ9 ZZZ,ZZ9 ZZ9 XXXX ZZZ,ZZ9 ZZZ,ZZ9 ZZ9 最大クラブコード XXXX 最大執行率 ZZ9 最小クラブコード XXXX 最小執行率 ZZ9 ~ ~ ~ ~ (第4図)
入力データ ファイル名: 実習2data.txt 0101 0102 0103 0104 0105 0106 0107 0108 0109 CCODE YOSAN SYUTU 0101 0102 0103 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 100000 120000 109000 150000 101000 130000 165000 085000 063000 115000 064000 055000 142000 045000 076000 160000 032000 065000 080500 093000 083010 128900 068200 104400 131200 053810 046100 087260 040570 033400 093700 038900 055420 094250 018260 044820 126100 061230 ファイル名: 実習2data.txt
入力形式・出力形式・処理条件 から記憶領域を定義する
記憶領域の定義 記憶装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE XXXX YOSAN 999999 SYUTU 作業領域 01:MEISAI-R 01:RITU M-YOSAN ZZZ,ZZ9 M-SYUTU M-RITU ZZ9 M-CCODE XXXX 999 01:MAX 01:MIDASI 999 クラブ 予算額 支出額 執行率 01:MIN 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE XXXX 最大執行率 M-MAX ZZ9 XXXX 01:MINCCODE 01:MIN-R XXXX 最小クラブコード M-MINCODE XXXX 最小執行率 M-MIN ZZ9 01:E-FLG XXX 出力領域 FD:LIST-F 01:LIST-R X(72)
記憶領域の定義から データ部の記述をする
データ部の記述① DATA DIVISION. FILE SECTION. FD YOSAN-F. 01 YOSAN-R. 02 CCODE PIC X(4). 02 YOSAN PIC 9(6). 02 SYUTU PIC 9(6). 02 PIC X(2). FD LIST-F. 01 LIST-R PIC X(72). 入 力 領 域 出力 領域
データ部の記述② WORKING-STORAGE SECTION. 01 E-FLG PIC X(3). 01 MAX PIC 9(3). 01 MIN PIC 9(3). 01 RITU PIC 9(3). 01 MAXCCODE PIC X(4). 01 MINCCODE PIC X(4). 01 GOKEI PIC 9(8). 01 HEIKIN PIC 9(7). 01 KENSU PIC 9(2). 独立項目の記述 作 業 領 域
データ部の記述③ 作 業 領 域 01 MIDASI. 02 PIC X(4) VALUE SPACE. 01 MEISAI-R. 02 PIC X(5) VALUE SPACE. 02 M-CCODE PIC X(4). 02 PIC X(7) VALUE SPACE. 02 M-YOSAN PIC ZZZ,ZZ9. 02 M-SYUTU PIC ZZZ,ZZ9. 02 M-RITU PIC ZZ9. 見出行の記述 作 業 領 域 明細行の記述
データ部の記述④ 作 業 領 域 01 MAX-R. 最大値行の記述 02 PIC X(20) VALUE " 最大クラブコード ". 02 M-MAXCCODE PIC X(4). 02 PIC X(5) VALUE SPACE. 02 PIC X(13) VALUE "最大執行率 ". 02 M-MAX PIC ZZ9. 01 MIN-R. 02 PIC X(20) VALUE " 最小クラブコード ". 02 M-MINCCODE PIC X(4). 02 PIC X(13) VALUE "最小執行率 ". 02 M-MIN PIC ZZ9. 最大値行の記述 作 業 領 域 最小値行の記述
処理手順を考える
入力ファイル・出力ファイルを開く COBOLのプログラムでは、最初の処理は入力用、出力用のファイルを開くことである。 ファイルを開くとは、ファイルを使用できる状態にすることである。
① 初期値を設定する 初期値 0 初期値 999 初期値”OFF” 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R ① 初期値を設定する 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE YOSAN SYUTU TU 作業領域 01:MEISAI-R 01:RITU M-YOSAN M-SYUTU M-RITU M-CCODE 01:MAX 01:MIDASI 初期値 0 000 クラブ 予算額 支出額 執行率 01:MIN 999 初期値 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG 初期値”OFF” OFF 出力領域 FD:LIST-F 01:LIST-R
② 見出行を印字する 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN ② 見出行を印字する 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU 作業領域 01:MEISAI-R 01:RITU M-YOSAN M-SYUTU M-RITU M-CCODE 01:MAX 01:MIDASI 000 クラブ 予算額 支出額 執行率 01:MIN 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率
繰り返し処理 入力データを読み終えるまで(E-FLG = “ON”となるまで)以下の手続きを繰り返す。 ③入力データを読む。 ④執行率を求める。 ⑤執行率は最大値以上か比較する。 YESの場合は、執行率とクラブコードを保存する。 ⑥執行率は最小値以下か比較する。 YESの場合は、執行率とクラブコードを保存する。 ⑦各項目を明細行に転記する。 ⑧明細行を印字する。
③ 入力データを読む 入力データ 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 ③ 入力データを読む 入力装置 入力データ 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU 作業領域 01:MEISAI-R 01:RITU M-YOSAN M-SYUTU M-RITU M-CCODE 01:MAX 01:MIDASI 000 クラブ 予算額 支出額 執行率 01:MIN 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率
④ 執行率を求める 入力データ 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 ④ 執行率を求める 入力装置 入力データ 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU M-YOSAN M-SYUTU M-RITU M-CCODE 080 01:MAX 01:MIDASI 000 クラブ 予算額 支出額 執行率 01:MIN 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率
⑤ 執行率と最大値を比較する 入力データ YES 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 ⑤ 執行率と最大値を比較する 入力装置 入力データ 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? YES M-YOSAN M-SYUTU M-RITU M-CCODE 080 080 000 01:MAX 01:MIDASI 000 クラブ 予算額 支出額 執行率 01:MIN 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率
⑤ YESなら執行率とクラブコードを保存する NOなら何もしない 入力装置 入力データ ⑤ YESなら執行率とクラブコードを保存する NOなら何もしない 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? YES M-YOSAN M-SYUTU M-RITU M-CCODE 080 080 000 01:MAX 01:MIDASI 000 080 クラブ 予算額 支出額 執行率 01:MIN 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0101 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率
⑥ 執行率と最小値を比較する 入力データ YES NO 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 ⑥ 執行率と最小値を比較する 入力装置 入力データ 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? YES M-YOSAN M-SYUTU M-RITU M-CCODE 080 080 000 01:MAX 01:MIDASI 000 080 RITU <= MIN ? NO クラブ 予算額 支出額 執行率 01:MIN 080 999 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0101 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率
⑥ YESなら執行率とクラブコードを保存する NOなら何もない 入力装置 入力データ ⑥ YESなら執行率とクラブコードを保存する NOなら何もない 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? YES M-YOSAN M-SYUTU M-RITU M-CCODE 080 080 000 01:MAX 01:MIDASI 000 080 RITU <= MIN ? NO クラブ 予算額 支出額 執行率 01:MIN 080 999 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0101 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率
⑦ 各項目を明細行に転記する 入力データ YES NO 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 ⑦ 各項目を明細行に転記する 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? YES M-YOSAN M-SYUTU M-RITU M-CCODE 080 080 000 0101 100,000 80,500 80 01:MAX 01:MIDASI 080 000 RITU <= MIN ? NO クラブ 予算額 支出額 執行率 01:MIN 080 999 999 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0101 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率
⑧ 明細行を印字する 入力データ YES NO 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 ⑧ 明細行を印字する 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? YES M-YOSAN M-SYUTU M-RITU M-CCODE 080 080 000 0101 100,000 80,500 80 01:MAX 01:MIDASI 000 080 RITU <= MIN ? NO クラブ 予算額 支出額 執行率 01:MIN 080 999 999 01:MAX-R 01:MAXXCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0101 01:MINCCODE 01:MIN-R 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG OFF 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率 0101 100,000 80,500 80
入力データ終了後の処理 以下の手続きがある。 ⑨最大値と最大となったクラブコードを 最大値行に転記する。 ⑩最大値行を印字する。 ⑪最小値と最小となったクラブコードを 最小値行に転記する。 ⑫最小値行を印字する。
⑨ 最大値と保存されていたクラブコードを 最大値行に転記する。 ⑨ 最大値と保存されていたクラブコードを 最大値行に転記する。 入力装置 入力データ 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? NO M-YOSAN M-SYUTU M-RITU M-CCODE 072 072 086 0101 100,000 80,500 80 01:MAX 01:MIDASI 000 086 RITU <= MIN ? NO クラブ 予算額 支出額 執行率 01:MIN 072 057 057 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0114 0114 86 01:MINCCODE 01:MIN-R 0117 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG ON 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率 0101 100,000 80,500 80
⑩ 最大値行を印字する。 入力データ NO NO 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 ⑩ 最大値行を印字する。 入力装置 入力データ 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? NO M-YOSAN M-SYUTU M-RITU M-CCODE 072 072 086 0101 100,000 80,500 80 01:MAX 01:MIDASI 086 000 RITU <= MIN ? NO クラブ 予算額 支出額 執行率 01:MIN 072 057 057 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0114 0114 86 01:MINCCODE 01:MIN-R 0117 最小クラブコード M-MINCODE 最小執行率 M-MIN 01:E-FLG ON 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率 0101 100,000 80,500 80 最大クラブコード 0114 最大執行率 86
⑪ 最小値と保存されていたクラブコードを 最小値行に転記する。 ⑪ 最小値と保存されていたクラブコードを 最小値行に転記する。 入力装置 入力データ 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? NO M-YOSAN M-SYUTU M-RITU M-CCODE 072 072 086 0101 100,000 80,500 80 01:MAX 01:MIDASI 086 000 RITU <= MIN ? NO クラブ 予算額 支出額 執行率 01:MIN 072 057 057 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0114 0114 86 01:MINCCODE 01:MIN-R 0117 最小クラブコード M-MINCODE 最小執行率 M-MIN 0117 57 01:E-FLG ON 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率 0101 100,000 80,500 80 最大クラブコード 0114 最大執行率 86
⑫ 最小値行を印字する。 入力データ NO NO 入力装置 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 ⑫ 最小値行を印字する。 入力装置 入力データ 記憶装置 演算装置 FD:YOSAN-F 01:YOSAN-R 入力領域 CCODE 0101 YOSAN 100000 SYUTU 080500 TU SYUTU * 100 / YOSAN 080500 100000 作業領域 01:MEISAI-R 01:RITU RITU >= MAX ? NO M-YOSAN M-SYUTU M-RITU M-CCODE 072 072 086 0101 100,000 80,500 80 01:MAX 01:MIDASI 000 086 RITU <= MIN ? NO クラブ 予算額 支出額 執行率 01:MIN 072 057 057 01:MAX-R 01:MAXCCODE 最大クラブコード M-MAXCODE 最大執行率 M-MAX 0114 0114 86 01:MINCCODE 01:MIN-R 0117 最小クラブコード M-MINCODE 最小執行率 M-MIN 0117 57 01:E-FLG ON 出力領域 FD:LIST-F 01:LIST-R クラブ 予算額 支出額 執行率 0101 100,000 80,500 80 最大クラブコード 0114 最大執行率 86 最小クラブコード 0117 最小執行率 57
入力ファイル・出力ファイルを閉じる COBOLのプログラムでは、最後の処理は入力用、出力用のファイルを閉じることである。