問8 次の COBOL プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
与えられた西暦年の年間カレンダーを作成する副プログラムである。
(1) 作成するカレンダーの例を次に示す。休日には“*”を付ける。
2000 1 JAN SUN MON TUE WED THU FRI SAT * 1 * 2 3 4 5 6 7 8 * 9 *10 11 12 13 14 15 *16 17 18 19 20 21 22 *23 24 25 26 27 28 29 *30 31 2000 2 FEB SUN MON TUE WED THU FRI SAT 1 2 3 4 5 * 6 7 8 9 10 *11 12 *13 14 15 16 17 18 19 *20 21 22 23 24 25 26 *27 28 29 : :
(2) 休日とは,日曜日,祝日及び祝日が日曜日のときの翌日とする。
(3) yyyy 年 mm 月 dd 日の曜日は,次に示す Zeller の公式によって求める (ただし,1 月,2 月は前年の 13 月,14 月として計算する)。
[n] は,n 以下で最大の整数を表す。
a mod b は,a を b で割った余りを表す。
計算結果が 0,1,2,3,4,5,6 のとき,それぞれ日,月,火,水,木,金,土を表す。
(4) 副プログラム MKSHUKU は,第 1 パラメタで西暦年を与えると, 第 2 パラメタに祝日の月日を表形式で返す。
(5) 各月のカレンダーの間には,空行を 1 行入れる。
〔プログラム〕
DATA DIVISION. FILE SECTION. FD CALENDAR-FILE. 01 C-REC PIC X(30). WORKING-STORAGE SECTION. 01 HYYYYMM. 02 HYEAR PIC 9(4). 02 FILLER PIC X. 02 HMONTH PIC Z(2). 02 FILLER PIC X. 02 HNAME PIC X(3). 01 HDAYS PIC X(27) VALUE "SUN MON TUE WED THU FRI SAT". 01 DAYS. 02 FILLER OCCURS 7. 03 DKYUJITSU PIC X. 03 DDAY PIC Z(2). 03 FILLER PIC X. 01 MONTH-INFO. 02 MNAME-INFO PIC X(36) VALUE "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". 02 MNAME-INFOR REDEFINES MNAME-INFO. 03 MNAME PIC X(3) OCCURS 12. 02 MMAXDATE. 03 MMAX PIC 9(2) OCCURS 12. 01 DATE-TABLE1 PIC X(24) VALUE "312831303130313130313031". 01 DATE-TABLE2 PIC X(24) VALUE "312931303130313130313031". 01 SHUKU-TABLE. 02 SIND PIC 9(2). 02 FILLER OCCURS 1 TO 30 DEPENDING ON SIND. 03 SMONTH PIC 9(2). 03 SDATE PIC 9(2). 01 WMONTH PIC 9(2). 01 WDAY PIC 9(2). 01 WYYYY PIC 9(4). 01 WMM PIC 9(2). 01 WDD PIC 9(2). 01 WDATE PIC 9(4). 01 WINDX PIC 9(2). 01 WINDY PIC 9(2). 01 WKYUJITSU PIC X VALUE SPACE. 01 WSHUKU PIC 9 VALUE ZERO. 01 WBKSHUKU PIC 9. LINKAGE SECTION. 01 YEAR PIC 9(4). PROCEDURE DIVISION USING YEAR. MAIN-SHORI. IF YEAR = (YEAR / 4) * 4 AND YEAR NOT = (YEAR / 100) * 100 OR YEAR = (YEAR / 400) * 400 MOVE DATE-TABLE2 TO MMAXDATE ELSE MOVE DATE-TABLE1 TO MMAXDATE END-IF. CALL "MKSHUKU" USING YEAR SHUKU-TABLE. MOVE SPACE TO HYYYYMM. MOVE YEAR TO HYEAR. OPEN OUTPUT CALENDAR-FILE. PERFORM VARYING WMONTH FROM 1 BY 1 UNTIL WMONTH > 12 MOVE WMONTH TO HMONTH MOVE MNAME(WMONTH) TO HNAME WRITE C-REC FROM HYYYYMM AFTER ADVANCING 2 WRITE C-REC FROM HDAYS AFTER ADVANCING 1 MOVE YEAR TO WYYYY MOVE WMONTH TO WMM MOVE 1 TO WDD PERFORM YOUBI-SHORI MOVE SPACE TO DAYS PERFORM VARYING WDAY FROM 1 BY 1 UNTIL MOVE WDAY TO DDAY(WDATE) PERFORM KYUJITSU-CHECK MOVE WKYUJITSU TO DKYUJITSU(WDATE) IF WDATE = 7 WRITE C-REC FROM DAYS AFTER ADVANCING 1 MOVE 1 TO WDATE MOVE SPACE TO DAYS ELSE END-IF END-PERFORM IF WDATE > 1 WRITE C-REC FROM DAYS AFTER ADVANCING 1 END-IF END-PERFORM. CLOSE CALENDAR-FILE. EXIT PROGRAM. YOUBI-SHORI. IF WMM <= 2 COMPUTE WYYYY = WYYYY - 1 END-IF. COMPUTE WDATE = WYYYY + (WYYYY / 4) - (WYYYY / 100) + (WYYYY / 400) + ((26 * WMM + 16) / 10) + WDD. . KYUJITSU-CHECK. MOVE WSHUKU TO WBKSHUKU. PERFORM VARYING WINDX FROM 1 BY 1 UNTIL WINDX > SIND OR WMONTH = SMONTH(WINDX) AND WDAY = SDATE(WINDX) CONTINUE END-PERFORM. IF WINDX <= SIND MOVE 1 TO WSHUKU ELSE MOVE 0 TO WSHUKU END-IF. IF MOVE "*" TO WKYUJITSU ELSE MOVE SPACE TO WKYUJITSU END-IF.
a,e に関する解答群
ア WDATE = 0 OR WSHUKU = 1
イ WDATE = 1 OR WSHUKU = 1 OR WDATE = 2 AND WBKSHUKU = 1
ウ WDAY = MMAX(WMONTH)
エ WDAY > MMAX(WMONTH)
オ WSHUKU = 1 OR WDATE = 2 AND WBKSHUKU = 1
b 〜 d に関する解答群
ア COMPUTE WDATE = WDATE + 1
イ COMPUTE WDATE = WDATE - (WDATE / 7) * 7
ウ COMPUTE WDATE = WDATE - (WDATE / 7) * 7 + 1
エ COMPUTE WDAY = WDATE - (WDATE / 7) * 7
オ COMPUTE WDAY = WDATE - (WDATE / 7) * 7 + 1
カ COMPUTE WDAY = WDAY + 1
キ COMPUTE WDD = WDD + 1
ク COMPUTE WMM = WMM + 1
ケ COMPUTE WMM = WMM + 12