実 習 4 2次元テーブルの利用
2次元テーブルの利用 実習4 第7図のような回答データを読み、処理条件にしたがってアンケート集計 第7図のような回答データを読み、処理条件にしたがってアンケート集計 テーブルへ集計し、第8図のように印字するプログラムを作成しなさい。 入力形式 入力ファイル名: KAITO-FILE 入力レコード名: KAITO-REC 出力形式 出力ファイル名: OUT-FILE 出力レコード名: OUT-REC 問1回答 KAI(1) 9(1) 問1回答 KAI(2) 9(1) 問1回答 KAI(3) 9(1) 問1回答 KAI(4) 9(1) 問1 問2 問3 問4 (回答1) ZZZZZ9 ZZZZZ9 ZZZZZ9 ZZZZZ9 (回答2) ZZZZZ9 ZZZZZ9 ZZZZZ9 ZZZZZ9 (回答5) ZZZZZ9 ZZZZZ9 ZZZZZ9 ZZZZZ9 ~ ~ ~ ~ ~ (第7図) 処理条件 (第8図) (1)入力データはアンケートデータであり、問1から問4まで それぞれ1から5のうちのいずれかの回答が記録されている。 (2)入力データにエラーはない。 (3)二次元テーブル SYU-Tを第9図のように用意し、たとえ ば問1で2と答えた人数はSYU-T(2 1)に、問2で5と答え た人数はSYU-T(5 2)というようにして回答数を集計する。 (4)データが終わりになったら、各問の1から5までの回答人 数をそれぞれ印字して処理を終わる。 SYU-T(集計テーブル) (1) (2) (3) (4) (5) (第9図)
入力データ ファイル名:実習4data.txt 1 2 3 4 5 1 2 3 4 5 KAI(1) KAI(2) KAI(3)
入力形式・出力形式・処理条件 から記憶領域を定義する
記憶領域の定義 記憶装置 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 9 KAI(2) 9 KAI(3) XX 01:E-FLG 01:N 01:J 作業領域 XXX 9 9 01:TAB TBL(1) SYU-T (1 1) 99 (1 2) (1 3) (1 4) TBL(2) ・・・・・ TBL(5) SYU-T (2 1) 99 SYU-T (2 2) 99 SYU-T (2 3) 99 SYU-T (2 4) 99 SYU-T (5 1) 99 SYU-T (5 2) 99 SYU-T (5 3) 99 SYU-T (5 4) 99 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI (1) ZZZZZ9 MEI (2) MEI (3) MEI (4) 出力領域 FD:LIST-F 01:LIST-R X(72)
記憶領域の定義から データ部の記述をする
データ部の記述① DATA DIVISION. FILE SECTION. FD KAITO-FILE. 01 KAITO-REC. 02 KAI PIC 9(1) OCCURS 4. 02 PIC X(2). FD OUT-FILE. 01 OUT-REC PIC X(72). 入力領域 出力 領域
データ部の記述② WORKING-STORAGE SECTION. 01 E-FLG PIC X(3). 01 N PIC 9(1). 01 J PIC 9(1). 01 TAB. 02 TBL OCCURS 5. 03 SYU-T PIC 9(2) OCCURS 4. 独立項目の記述 作 業 領 域
データ部の記述③ 01 MIDASI. 02 PIC X(3) VALUE SPACE. 02 PIC X(4) VALUE "問1". 01 MEISAI. 02 MEI PIC ZZZZZ9 OCCURS 4. 見出行の記述 作 業 領 域 明細行の記述
処理手順を考える
入力ファイル・出力ファイルを開く COBOLのプログラムでは、最初の処理は入力用、出力用のファイルを開くことである。 ファイルを開くとは、ファイルを使用できる状態にすることである。
① 初期値を設定する 初期値”OFF” 初期値 0 OFF 00 00 00 00 00 入力装置 記憶装置 演算装置 ① 初期値を設定する 入力装置 記憶装置 演算装置 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) KAI(2) KAI(3) KAI(4) 01:E-FLG 01:N 01:J 作業領域 OFF 初期値”OFF” 01:TAB TBL(1) SYU-T (1 1) 00 (1 2) (1 3) (1 4) ・・・・・ TBL(5) SYU-T (5 1) 00 SYU-T (5 2) 00 SYU-T (5 3) 00 SYU-T (5 4) 00 初期値 0 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI (1) MEI (2) MEI (3) MEI (4) 出力領域 FD:LIST-F 01:LIST-R X(72)
② 見出行を印字する 1 3 4 5 OFF 00 00 00 00 00 入力装置 記憶装置 演算装置 ② 見出行を印字する 入力装置 記憶装置 演算装置 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 1 KAI(2) 3 KAI(3) 4 KAI(4) 5 01:E-FLG 01:N 01:J 作業領域 OFF 01:TAB TBL(1) SYU-T (1 1) 00 (1 2) (1 3) (1 4) ・・・・・ TBL(5) SYU-T (5 1) 00 SYU-T (5 2) 00 SYU-T (5 3) 00 SYU-T (5 4) 00 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI (1) MEI (2) MEI (3) MEI (4) 出力領域 FD:LIST-F 01:LIST-R X(72) 問1 問2 問3 問4
繰り返し処理 入力データを読み終えるまで(E-FLG = “ON”となるまで) 以下の手続きを繰り返す。 ③入力データを読む。 処理を行う。 ⑤回答の内容を添字Jに転記する。 ⑥添字JとNを利用しテーブルの要素SYUーT(J N) にカウントする。
③ 入力データを読む 入力データ 1 3 4 5 OFF 00 00 00 00 00 入力装置 記憶装置 演算装置 ③ 入力データを読む 入力装置 入力データ 記憶装置 演算装置 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 1 KAI(2) 3 KAI(3) 4 KAI(4) 5 01:E-FLG 01:N 01:J 作業領域 OFF 01:TAB TBL(1) SYU-T (1 1) 00 (1 2) (1 3) (1 4) ・・・・・ TBL(5) SYU-T (5 1) 00 SYU-T (5 2) 00 SYU-T (5 3) 00 SYU-T (5 4) 00 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI (1) MEI (2) MEI (3) MEI (4) 出力領域 FD:LIST-F 01:LIST-R X(72) 問1 問2 問3 問4
2次元テーブルは2次元の表にして考える 例えば SYU-T(2 3)は、 2行目の3列目になる (1) (2) (3) (4) (5) 01 TAB TBL(1) TBL(2) TBL(3) TBL(4) TBL(5) SYU-T (1 1) (1 2) (1 3) (1 4) SYU-T (2 1) (2 2) (2 3) (2 4) SYU-T (3 1) (3 2) (3 3) (3 4) SYU-T (4 1) (4 2) (4 3) (4 4) SYU-T (5 1) (5 2) (5 3) (5 5) 例えば SYU-T(2 3)は、 2行目の3列目になる (1) (2) (3) (4) (5) 問1 問2 問3 問4 回答1 回答2 回答3 回答4 回答5
④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 入力装置 入力データ ④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 記憶装置 FD:KAITO-FILE 01:KAITO-REC Nが1の場合 入力領域 KAI(1) 1 KAI(2) 3 KAI(3) 4 KAI(4) 5 問1の回答は1であることがわかる! 回答した番号の1をJに転記! 作業領域 01:E-FLG 01:N 01:J テーブルの1行1列目にカウントする OFF 1 SYU-T(J N) + 1 → SYU-T(J N) 1 1 00 01 1 列の添字 問1 問2 問3 問4 SYU-T(J N) (1) (2) (3) (4) 00 (5) 回答1 01 行の添字 回答2 回答3 回答4 回答5
④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 入力装置 入力データ ④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 記憶装置 FD:KAITO-FILE 01:KAITO-REC Nが1増え2となる 入力領域 KAI(1) 1 KAI(2) 3 KAI(3) 4 KAI(4) 5 問2の回答は3であることがわかる! 回答した番号の3をJに転記! 作業領域 01:E-FLG 01:N 01:J テーブルの3行2列目にカウントする OFF 2 1 3 SYU-T(J N) + 1 → SYU-T(J N) 3 2 00 01 3 2 列の添字 問1 問2 問3 問4 SYU-T(J N) (1) (2) (3) (4) 01 00 (5) 回答1 行の添字 回答2 回答3 01 回答4 回答5
④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 入力装置 入力データ ④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 記憶装置 FD:KAITO-FILE 01:KAITO-REC Nが1増え3となる 入力領域 KAI(1) 1 KAI(2) 3 KAI(3) 4 KAI(4) 5 問3の回答は4であることがわかる! 回答した番号の4をJに転記! 作業領域 01:E-FLG 01:N 01:J テーブルの4行3列目にカウントする SYU-T(J N) + 1 → SYU-T(J N) 4 3 OFF 3 3 4 00 01 4 3 列の添字 問1 問2 問3 問4 SYU-T(J N) (1) (2) (3) (4) 01 00 (5) 回答1 行の添字 回答2 回答3 回答4 01 回答5
④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 入力装置 入力データ ④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 記憶装置 FD:KAITO-FILE 01:KAITO-REC Nが1増え4となる 入力領域 KAI(1) 1 KAI(2) 3 KAI(3) 4 KAI(4) 5 問4の回答は5であることがわかる! 回答した番号の5をJに転記! 作業領域 01:E-FLG 01:N 01:J テーブルの5行4列目にカウントする OFF 4 4 5 SYU-T(J N) + 1 → SYU-T(J N) 5 4 00 01 5 4 列の添字 問1 問2 問3 問4 SYU-T(J N) (1) (2) (3) (4) 01 00 (5) 回答1 行の添字 回答2 回答3 回答4 回答5 01
④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 入力装置 入力データ ④ 添字Nを1から1ずつ増やし4を超える まで処理を繰り返す 記憶装置 FD:KAITO-FILE 01:KAITO-REC Nが1増え5となる 入力領域 KAI(1) 1 KAI(2) 3 KAI(3) 4 KAI(4) 5 Nが4を超えたので繰り返しを終了する 次の入力データを入力する 作業領域 01:E-FLG 01:N 01:J OFF 5 4 5 列の添字 問1 問2 問3 問4 SYU-T(J N) (1) (2) (3) (4) 01 00 (5) 回答1 行の添字 回答2 回答3 回答4 回答5
⑤ 入力データが終了した場合は、 E-FLGに“ON”という文字列を転記する 入力装置 入力データ ⑤ 入力データが終了した場合は、 E-FLGに“ON”という文字列を転記する 記憶装置 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 2 KAI(2) 2 KAI(3) 2 KAI(4) 5 作業領域 01:E-FLG 01:N 01:J OFF ON 5 4 5 列の添字 問1 問2 問3 問4 SYU-T(J N) (1) (2) (3) (4) 21 01 11 02 08 16 09 14 05 06 04 10 (5) 12 回答1 行の添字 回答2 回答3 回答4 回答5
入力データ終了後の処理 以下の手続きがある。 ⑥集計テーブルの行の添字Jを1から1ずつ 増やし5を超えるまで以下の処理を行う。 増やし5を超えるまで以下の処理を行う。 ⑦集計テーブルの列の添字Nを1から1ずつ 増やし4を超えるまで以下の処理を行う。 ⑧テーブルの要素SYU-Tの内容を 明細行の項目MEIへ順に転記する。 ⑨1行分を転記したら明細行を印字する。
⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 ⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 入力装置 入力データ 記憶装置 ⑦ 列の添字Nを1から1ずつ増やし4を超える まで処理を繰り返す N=1 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 2 KAI(2) 2 KAI(3) 2 KAI(4) 5 ⑧ テーブルの要素を明細行に転記 01:E-FLG 01:N 01:J SYU-T(J N) 作業領域 (1) (2) (3) (4) 21 01 11 02 08 16 09 14 05 06 04 10 (5) 12 1 1 ON 5 5 1 1 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI(1) MEI(2) MEI(3) MEI(4) 21 1 MEI(N) 出力領域 FD:LIST-F 01:LIST-R X(72) 問1 問2 問3 問4
⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 ⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 入力装置 入力データ 記憶装置 ⑦ 列の添字Nを1から1ずつ増やし4を超える まで処理を繰り返す N=2 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 2 KAI(2) 2 KAI(3) 2 KAI(4) 5 ⑧ テーブルの要素を明細行に転記 01:E-FLG 01:N 01:J SYU-T(J N) 作業領域 (1) (2) (3) (4) 21 01 11 02 08 16 09 14 05 06 04 10 (5) 12 1 2 ON 1 5 1 2 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI(1) MEI(2) MEI(3) MEI(4) 21 1 2 MEI(N) 出力領域 FD:LIST-F 01:LIST-R X(72) 問1 問2 問3 問4
⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 ⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 入力装置 入力データ 記憶装置 ⑦ 列の添字Nを1から1ずつ増やし4を超える まで処理を繰り返す N=3 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 2 KAI(2) 2 KAI(3) 2 KAI(4) 5 ⑧ テーブルの要素を明細行に転記 01:E-FLG 01:N 01:J SYU-T(J N) 作業領域 (1) (2) (3) (4) 21 01 11 02 08 16 09 14 05 06 04 10 (5) 12 1 3 ON 2 5 1 3 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI(1) MEI(2) MEI(3) MEI(4) 21 1 11 3 MEI(N) 出力領域 FD:LIST-F 01:LIST-R X(72) 問1 問2 問3 問4
⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 ⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 入力装置 入力データ 記憶装置 ⑦ 列の添字Nを1から1ずつ増やし4を超える まで処理を繰り返す N=4 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 2 KAI(2) 2 KAI(3) 2 KAI(4) 5 ⑧ テーブルの要素を明細行に転記 01:E-FLG 01:N 01:J SYU-T(J N) 作業領域 (1) (2) (3) (4) 21 01 11 02 08 16 09 14 05 06 04 10 (5) 12 1 4 ON 3 5 1 4 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI(1) MEI(2) MEI(3) MEI(4) 21 1 11 2 4 MEI(N) 出力領域 FD:LIST-F 01:LIST-R X(72) 問1 問2 問3 問4
⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 ⑥ 行の添字Jを1から1つずつ増やし5を超える まで処理を繰り返す J=1 入力装置 入力データ 記憶装置 ⑦ N=5となり4を超えたので繰り返しを終了 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 2 KAI(2) 2 KAI(3) 2 KAI(4) 5 ⑨ 明細行を印字 01:E-FLG 01:N 01:J 作業領域 (1) (2) (3) (4) 21 01 11 02 08 16 09 14 05 06 04 10 (5) 12 ON 4 5 1 5 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI(1) MEI(2) MEI(3) MEI(4) 21 1 11 2 出力領域 FD:LIST-F 01:LIST-R X(72) 問1 問2 問3 問4 21 1 11 2
⑥ 行の添字Jを2,3,4,5と増やし5を超える まで同様の処理を繰り返す ⑥ 行の添字Jを2,3,4,5と増やし5を超える まで同様の処理を繰り返す 入力装置 入力データ 記憶装置 FD:KAITO-FILE 01:KAITO-REC 入力領域 KAI(1) 2 KAI(2) 2 KAI(3) 2 KAI(4) 5 01:E-FLG 01:N 01:J 作業領域 (1) (2) (3) (4) 21 01 11 02 08 16 09 14 05 06 04 10 (5) 12 ON 5 1 5 4 3 1 2 1 3 2 4 3 4 5 2 3 5 3 1 2 5 1 6 2 4 5 4 01:MIDASI 問1 問2 問3 問4 01:MEISAI MEI(1) MEI(2) MEI(3) MEI(4) 21 16 14 2 4 1 10 11 1 8 1 2 5 9 6 14 12 1 8 2 出力領域 FD:LIST-F 01:LIST-R X(72) 問1 問2 問3 問4 21 1 11 2 8 16 9 14 5 14 6 1 2 4 10 8 1 2 1 12
入力ファイル・出力ファイルを閉じる COBOLのプログラムでは、最後の処理は入力用、出力用のファイルを閉じることである。