問12 次の COBOL プログラムの説明及びプログラムを読んで,設問 1,2 に答えよ。
〔プログラムの説明〕
ある国の累積輸出記録ファイルを読み込んで,輸出年月から 3 年以上経過したレコードを 削除して,新累積輸出記録ファイルを作成するプログラムである。
(1) 累積輸出記録ファイル,新累積輸出記録ファイルのレコード様式は,次のとおりで ある。
輸出年月
4 けた
製品コード
5 けた
数量
6 けた
輸出年月は,西暦の下 2 けたの年と 2 けたの月からなる。
例:1999 年 4 月ならば“9904”となる。
(2) このプログラムを実行した時点で,輸出年月から 3 年以上経過したレコードを 削除する。
例:プログラム実行年月が 99 年 4 月のとき,輸出年月が 96 年 4 月以前のレコードを 削除する。
〔プログラム〕 (行番号) 01 DATA DIVISION. 02 FILE SECTION. 03 FD YUSYUTU-FILE. 04 01 YUSYUTU-REC. 05 03 Y-HIZUKE. 06 05 Y-NEN PIC 9(2). 07 05 Y-TUKI PIC 9(2). 08 03 Y-SEIHIN PIC X(5). 09 03 Y-SURYO PIC 9(6). 10 FD N-YUSYUTU-FILE. 11 01 N-YUSYUTU-REC PIC X(15). 12 WORKING-STORAGE SECTION. 13 01 EOF-FLAG PIC X(1) VALUE SPACE. 14 01 SYORI-BI. 15 03 MUKO-HIZUKE. 16 05 M-NEN PIC 9(2). 17 05 M-TUKI PIC 9(2). 18 03 PIC 9(2). 19 PROCEDURE DIVISION. 20 KAISI. 21 ACCEPT SYORI-BI FROM DATE. 22 COMPUTE M-NEN = M-NEN - 3. 23 MAIN-SYORI. 24 OPEN INPUT YUSYUTU-FILE. 25 OPEN OUTPUT N-YUSYUTU-FILE. 26 READ YUSYUTU-FILE AT END 27 MOVE "E" TO EOF-FLAG 28 END-READ. 29 PERFORM UNTIL EOF-FLAG = "E" 30 IF Y-HIZUKE > MUKO-HIZUKE 31 WRITE N-YUSYUTU-REC FROM YUSYUTU-REC 32 END-IF 33 READ YUSYUTU-FILE AT END 34 MOVE "E" TO EOF-FLAG 35 END-READ 36 END-PERFORM. 37 CLOSE YUSYUTU-FILE N-YUSYUTU-FILE. 38 STOP RUN.
設問1 次の記述中の に入れる正しい答えを,解答群の中から選べ。
このプログラムは,年が西暦の下 2 けたで表現されているので,西暦 2000 年以降では正しく動作しない。つまり,年を西暦の下 2 けたで表現する と 1999 年は“99”,2000 年は“00”となり,日付の大小の逆転や期間計算 の誤処理などが発生する。この“2000年問題”の対処方法として,“4 けた拡 張法”と“ウィンドウ法”がある。
“4 けた拡張法”とは,プログラムとファイルの中の年をすべて 4 けたに 変更する方法である。正攻法と言えるが,既存のファイルをすべて作り直す必 要があるので,関連するすべてのプログラムと同期をとって一括移行しなけれ ばならない。
“ウィンドウ法”とは,ファイル中の年は 2 けたのままにしておき,プロ グラム中の比較処理などを 4 けたの年に変換して行う方法である。変換は, 境界年と呼ばれる値を設定して,境界年未満の値には 2000 を,境界年以上の 値には 1900 を加えて 4 けたの年とする。例えば,境界年を 60 とすれば, 00〜59 は 2000〜2059 に,60〜99 は 1960〜1999 に変換する。この方法では, 処理する範囲が 100 年を超えるデータは処理できない。しかし,既存のファ イルを変更しないので,プログラム単位に順次移行が可能である。
(1) このプログラムを“4 けた拡張法”で修正するには,次の変更が必要である。
累積輸出記録ファイルの輸出年月の年を 2 けたから 4 けたに変更する。6 行目と 11 行目をそれぞれ次のとおりに変える。
06 05 Y-NEN PIC 9(4). 11 01 N-YUSYUTU-REC PIC X().
16 行目の年を格納する作業領域の長さを, 4 けたに変える。
16 05 M-NEN PIC 9(4).
21 行目の ACCEPT 文では 2 けたの年しか 取得できない。この行を 4 けたの年,2 けたの月,2 けたの日を取得できる関数] CURRENT-DATE”を使用するように変更する。
21 MOVE FUNCTION CURRENT-DATE TO SYORI-BI.
(2) このプログラムを“ウィンドウ法”で修正するには,次の変更が必要である。
境界年を 60 として格納した領域を 18 行目と 19 行目の間に追加する。
01 KYOKAI PIC 9(2) VALUE 60.
2 けたの年を含む Y-HIZUKE と MUKO-HIZUKE を 4 けたの年に変換した Y-HIZUKE-Y2K と MUKO-HIZUKE-Y2K を に続けて 追加する。
01 Y-HIZUKE-Y2K. 03 Y-NEN-Y2K PIC 9(4). 03 Y-TUKI-Y2K PIC 9(2). 01 MUKO-HIZUKE-Y2K. 03 M-NEN-Y2K PIC 9(4). 03 M-TUKI-Y2K PIC 9(2).
年の変換処理で使用する変換前後の年を 入れる領域を に続けて追加する。
01 W-NEN2-Y2K PIC 9(2). 01 W-NEN4-Y2K PIC 9(4).
22 行目の処理を 4 けたの年で行うように 変更する。
MOVE M-NEN TO W-NEN2-Y2K. PERFORM CONVERT-DATE-RTN. MOVE W-NEN4-Y2K TO M-NEN-Y2K. MOVE M-TUKI TO M-TUKI-Y2K. COMPUTE M-NEN-Y2K = M-NEN-Y2K - 3.
次の処理を 行目の直後に追加する。
MOVE Y-NEN TO W-NEN2-Y2K PERFORM CONVERT-DATE-RTN MOVE W-NEN4-Y2K TO Y-NEN-Y2K MOVE Y-TUKI TO Y-TUKI-Y2K
30 行目の処理を 4 けたの年で行うように 変更する。
IF
38 行目の後に年の変換処理を追加する。
CONVERT-DATE-RTN. IF COMPUTE W-NEN4-Y2K = 2000 + W-NEN2-Y2K ELSE COMPUTE W-NEN4-Y2K = 1900 + W-NEN2-Y2K END-IF.
a に関する解答群
ア 4 イ 5 ウ 8
エ 10 オ 15 カ 17
b に関する解答群
ア 20 イ 23 ウ 25
エ 28 オ 29 カ 35
c,d に関する解答群
ア KYOKAI < W-NEN2-Y2K
イ KYOKAI < W-NEN4-Y2K
ウ MUKO-HIZUKE > Y-HIZUKE
エ MUKO-HIZUKE-Y2K > Y-HIZUKE-Y2K
オ M-NEN-Y2K > Y-NEN-Y2K
カ Y-HIZUKE > MUKO-HIZUKE
キ Y-HIZUKE-Y2K > MUKO-HIZUKE-Y2K
ク Y-NEN-Y2K > M-NEN-Y2K
ケ W-NEN2-Y2K < KYOKAI
コ W-NEN4-Y2K < KYOKAI
設問2 次の記述中の に入れる正しい答えを,解答群の中から選べ。
このプログラムを設問 1 で説明した“ウィンドウ法”で修正した。次に示 す 20 レコードからなる累積輸出記録ファイルを指定して,プログラムを西暦 2000 年 4 月 18日に実行したとすると,年の変換処理(CONVERT-DATE-RTN) は 回呼び出さ れ,演算命令(COMPUTE W-NEN4-Y2K = 2000 + W-NEN2-Y2K)は 回実行される。
累積輸出記録ファイル
9703A1234001345 9703B1234002567 9706A1234001823 9706B1234002600 9712A1234002543 9712B1234002578 9803A1234002832 9803B1234002345 9806A1234003223 9806B1234002243 9812A1234003667 9812B1234001823 9903A1234003800 9903B1234002321 9912A1234004278 9912B1234002532 0002A1234004345 0002B1234002223 0003A1234004832 0003B1234002340
解答群
ア 4 イ 5 ウ 6 エ 7 オ 16
カ 17 キ 18 ク 19 ケ 20 コ 21