東京理科大学 infoserv[更新日]2000.10.23


問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


東京理科大学 infoserv 戻る 次頁:問09