2009년 11월 18일 수요일

[Cobol] 해당년도의 몇번째 날인지 구하는 서브프로그램

간단한 서브프로그램을 만들어보았다. 조금만 안하면 내 머리속의 지우개
프로그램의 용도는 JULIAN DATE 비슷한것 ㅠㅠ(이왕이면 JULIAN DATE를 짜던가 퍽!)
78901234567890123456789012345678901234567890123456789012345678901234567890
*---------------------------------------------------------
 IDENTIFICATION  DIVISION.
 PROGRAM-ID.     JULDATE.
*---------------------------------------------------------
 ENVIRONMENT     DIVISION.
*---------------------------------------------------------
 DATA            DIVISION.
 WORKING-STORAGE SECTION.
 
 77  WK-MOK      PIC 9(4)  VALUE ZERO.
 77  WK-NAM      PIC 9(2)  VALUE ZERO.
 77  WK-II       PIC 9(2)  VALUE ZERO.
 
 01  WK-DATE.
     10  WK-YYYY PIC 9(4)  VALUE ZERO.
     10  WK-MM   PIC 9(2)  VALUE ZERO.
     10  WK-DD   PIC 9(2)  VALUE ZERO.
 
 01  WK-MM1 OCCURS 12.
     10  MON-DAY PIC 9(2).
 
 LINKAGE         SECTION.
 01  DATE-INPUT.
     10  IN-YYYY PIC 9(4).
     10  IN-MM   PIC 9(2).
     10  IN-DD   PIC 9(2).
 
 01  JLAN-OUTPUT.
     10  RESULT.
         20  RE-YYYY   PIC 9(4)  VALUE ZERO.
         20  RE-JULIAN PIC 9(3)  VALUE ZERO.
     10  CHECK   PIC X(1)  VALUE SPACE.
     10  ERRMSG  PIC X(30) VALUE SPACE.
*---------------------------------------------------------
 PROCEDURE       DIVISION USING DATE-INPUT JLAN-OUTPUT.
 
 00000-JULDATE-START.
     PERFORM 10000-STR.
     PERFORM 20000-MID.
     PERFORM 30000-END.
*---------------------------------------------------------
 10000-STR.
     MOVE IN-YYYY TO WK-YYYY.
     MOVE IN-MM   TO WK-MM.
     MOVE IN-DD   TO WK-DD.
     
     MOVE ZERO    TO RESULT.
     MOVE SPACE   TO CHECK.
     MOVE SPACE   TO ERRMSG.

* 월의 최대 날짜
     MOVE 31 TO MON-DAY(01).
     MOVE 28 TO MON-DAY(02).
     MOVE 31 TO MON-DAY(03).
     MOVE 30 TO MON-DAY(04).
     MOVE 31 TO MON-DAY(05).
     MOVE 30 TO MON-DAY(06).
     MOVE 31 TO MON-DAY(07).
     MOVE 31 TO MON-DAY(08).
     MOVE 30 TO MON-DAY(09).
     MOVE 31 TO MON-DAY(10).
     MOVE 30 TO MON-DAY(11).
     MOVE 31 TO MON-DAY(12).

* 2월달 윤달체크
     DIVIDE WK-YYYY BY 4   GIVING WK-MOK
                           REMAINDER WK-NAM.
     IF  WK-NAM = 0
         MOVE 29 TO MON-DAY(2)
     END-IF.
     
     DIVIDE WK-YYYY BY 100 GIVING WK-MOK
                           REMAINDER WK-NAM.
     IF  WK-NAM = 0
         MOVE 28 TO MON-DAY(2)
     END-IF.
     
     DIVIDE WK-YYYY BY 400 GIVING WK-MOK
                           REMAINDER WK-NAM.
     IF  WK-NAM = 0
         MOVE 29 TO MON-DAY(2)
     END-IF.
     
* 월 체크
     IF  WK-MM > 12 OR WK-MM < 1 OR WK-MM NOT NUMERIC
         MOVE "E" TO CHECK
         MOVE "해당 월이 비정상입니다." TO ERRMSG
         PERFORM 30000-END
     END-IF.

* 날짜 체크
     IF  WK-DD > MON-DAY(WK-MM) OR WK-DD < 1 OR WK-DD NOT NUMERIC
         MOVE "E" TO CHECK
         MOVE "해당 날짜가 비정상입니다." TO ERRMSG
         PERFORM 30000-END
     END-IF.
 
 20000-MID.
     MOVE WK-YYYY TO RE-YYYY.
     MOVE 0       TO RE-JULIAN.
     
     INITIALIZE   WK-II.
     
     PERFORM WK-II FROM 1 BY +1 UNTIL WK-II >= WK-MM
         ADD MON-DAY(WK-II) TO RE-JULIAN
     END-PERFORM.
     
     ADD WK-DD TO RE-JULIAN.
     
 30000-END.
     EXIT PROGRAM.

0 개의 댓글:

댓글 쓰기