問10
次の COBOL プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
研修の申込みを登録した研修申込ファイルがある。 研修の申込みは,1 人につき 1 回だけであり,10 件まで申し込むことができる。 開催日が同一の研修を複数記載した申込者をエラーとし, エラーリストを印字するプログラムである。
(1) 研修申込ファイルのレコード様式は,次のとおりである。
同じ研修番号は,指定しないものとする。
研修の申込みは,研修番号の欄 1 から順次登録し,10 件に満たない場合は,残りの欄を空白とする。
研修番号は,研修開催ファイルに登録されているものとする。
(2) 研修の詳細を登録した研修開催ファイルのレコード様式は,次のとおりである。
研修番号4 けた
開催日 8 けた
教室番号10 けた
研修番号をキーとする索引ファイルである。
開催される研修は,すべて登録されている。
(3) このプログラムで開催日の重複確認のために利用しているテーブル CHK-TBL の例は,次のとおりである。
例 次の研修申込ファイルのデータ及び研修開催ファイルのデータが与えられたとする。
研修申込ファイルのデータ
研修開催ファイルのデータ
A001 B002 C003
20010411 20010412 20010411
TORAN-F801 TORAN-F801 TORAN-F802
このときテーブル CHK-TBL の内容は次のようになる。
このことからテーブル CHK-SEM-NO の 部分の A001 と C003 の開催日が重複していることが分かる。
(4) エラーリストの印字様式は,次のとおりである。
申込番号 申込者番号 開催日 研修番号 XXXXX XXXXX XXXXXXXX XXXX XXXX XXXX XXXX XXXXXXXX XXXX XXXX XXXX XXXX XXXXX XXXXX XXXXXXXX XXXX XXXX XXXX XXXX : : : : : : : XXXXX XXXXX XXXXXXXX XXXX XXXX XXXX XXXX XXXXX XXXXX XXXXXXXX XXXX XXXX XXXX XXXX
見出しは,あらかじめ印刷されている。
一つの申込番号で,同一の開催日の研修が複数あるときは,その研修番号すべてを 1 行に印字する。
一つの申込番号で に該当するものが複数組ある場合は, 開催日ごとに行を分けて印字する。 このとき,最初の行には,申込番号及び申込者番号を印字するが, 次の行からは印字しない。
〔プログラム〕 DATA DIVISION. FILE SECTION. FD APPLY-FILE. 01 APPLY-REC. 02 APP-NO PIC X(05). 02 APP-PSN-NO PIC X(05). 02 APP-SEM-NO OCCURS 10 PIC X(04). FD SEMINAR-FILE. 01 SEMINAR-REC. 02 SEM-NO PIC X(04). 02 SEM-YMD PIC X(08). 02 SEM-ROOM PIC X(10). FD CHECK-FILE. 01 CHECK-REC PIC X(85). WORKING-STORAGE SECTION. 01 INFILE-EOF PIC 9(01) VALUE 0. 01 PRINT-WRK. 02 PRI-NO PIC X(05). 02 PIC X(05). 02 PRI-PSN-NO PIC X(05). 02 PIC X(07). 02 PRI-YMD PIC X(08). 02 PIC X(01). 02 OCCURS 10. 03 PIC X(01). 03 PRI-SEM-NO PIC X(04). 01 CHK-TBL. 02 OCCURS 10. 03 CHK-NUM PIC 9(02). 03 CHK-YMD PIC X(08). 03 CHK-SEM-NO OCCURS 10 PIC X(04). 01 CHK-CNT PIC 9(02). 01 CHK-WK PIC 9(02). 01 CNT1 PIC 9(02). 01 CNT2 PIC 9(02). 01 CNT3 PIC 9(02). PROCEDURE DIVISION. MAIN-RTN. OPEN INPUT APPLY-FILE SEMINAR-FILE OUTPUT CHECK-FILE. PERFORM UNTIL INFILE-EOF = 1 READ APPLY-FILE AT END MOVE 1 TO INFILE-EOF NOT AT END PERFORM CHECK-RTN PERFORM PRINT-RTN END-READ END-PERFORM. CLOSE APPLY-FILE SEMINAR-FILE CHECK-FILE. STOP RUN. CHECK-RTN. INITIALIZE CHK-TBL CHK-CNT. PERFORM VARYING CNT1 FROM 1 BY 1 UNTIL CNT1 > 10 OR APP-SEM-NO (CNT1) = SPACE READ SEMINAR-FILE INVALID KEY DISPLAY "ケンシュウ バンゴウ エラー" NOT INVALID KEY PERFORM TABLE-SET-RTN END-READ END-PERFORM. TABLE-SET-RTN. MOVE 0 TO CNT3. PERFORM VARYING CNT2 FROM 1 BY 1 UNTIL IF SEM-YMD = CHK-YMD (CNT2) THEN END-IF END-PERFORM. IF CNT3 = 0 THEN COMPUTE CHK-CNT = CHK-CNT + 1 MOVE SEM-YMD TO CHK-YMD (CHK-CNT) MOVE CHK-CNT TO CNT3 END-IF. COMPUTE CHK-NUM (CNT3) = CHK-NUM (CNT3) + 1. MOVE CHK-NUM (CNT3) TO CHK-WK. MOVE APP-SEM-NO (CNT1) TO CHK-SEM-NO (CNT3 CHK-WK). PRINT-RTN. MOVE 0 TO CNT3. PERFORM VARYING CNT1 FROM 1 BY 1 UNTIL MOVE SPACE TO PRINT-WRK IF THEN IF CNT3 = 0 THEN MOVE APP-NO TO PRI-NO MOVE APP-PSN-NO TO PRI-PSN-NO MOVE 1 TO CNT3 END-IF MOVE CHK-YMD (CNT1) TO PRI-YMD PERFORM VARYING CNT2 FROM 1 BY 1 UNTIL CNT2 > CHK-NUM (CNT1) END-PERFORM WRITE CHECK-REC FROM PRINT-WRK AFTER 1 END-IF END-PERFORM.
〔プログラム〕
a,c に関する解答群
ア MOVE CNT1 TO CNT2 イ MOVE CNT1 TO SEM-NO
ウ MOVE CNT2 TO CNT1 エ MOVE CNT2 TO CNT3
オ MOVE CNT2 TO SEM-NO カ MOVE CNT3 TO CNT1
キ MOVE CNT3 TO CNT2 ク MOVE APP-SEM-NO TO CNT1
ケ MOVE SEM-NO TO PRI-SEM-NO (CNT1)
コ MOVE APP-SEM-NO (CNT1) TO SEM-NO
b,d に関する解答群
ア CHK-CNT > CNT1 イ CHK-CNT > CNT2
ウ CHK-CNT > CNT3 エ CHK-NUM (CNT1) > CNT2
オ CHK-NUM (CNT2) > CNT3 カ CNT1 > CHK-CNT
キ CNT2 > CHK-CNT ク CNT2 > CHK-NUM (CNT1)
ケ CNT3 > CHK-CNT コ CNT3 > CHK-NUM (CNT2)
e に関する解答群
ア CHK-NUM (CNT1) > 1 イ CHK-NUM (CNT1) > CNT1
ウ CHK-NUM (CNT3) > 1 エ CHK-NUM (CNT3) > CNT3
オ CNT1 > 1 カ CNT3 > 1
f に関する解答群
ア MOVE CHK-SEM-NO (CNT1 CNT2) TO PRI-SEM-NO (CNT1)
イ MOVE CHK-SEM-NO (CNT1 CNT2) TO PRI-SEM-NO (CNT2)
ウ MOVE CHK-SEM-NO (CNT1 CNT3) TO PRI-SEM-NO (CNT3)
エ MOVE CHK-SEM-NO (CNT2 CNT1) TO PRI-SEM-NO (CNT1)
オ MOVE CHK-SEM-NO (CNT2 CNT1) TO PRI-SEM-NO (CNT2)
カ MOVE CHK-SEM-NO (CNT2 CNT3) TO PRI-SEM-NO (CNT2)