Last active
January 30, 2023 08:22
-
-
Save Myoga1012/0700dad85f2a0354b399 to your computer and use it in GitHub Desktop.
COBOLでカレンダーを出力するソースコードです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
* 名前 : Myoga Screw-bright (旧名:Myoga S. Tomonaka) | |
* Twitter : https://twitter.com/Myoga1012 | |
* Calender for COBOL (OpenCOBOL) | |
IDENTIFICATION DIVISION. | |
PROGRAM-ID. Calender. | |
DATA DIVISION. | |
WORKING-STORAGE SECTION. | |
* 現在の日時を格納するためのデータ群です。 | |
01 NOW. | |
03 NDATE PIC 9(8). | |
03 NWEEK PIC 9(1). | |
03 NYEAR PIC 9(4). | |
03 NMD PIC 9(4). | |
03 NMONTH PIC 9(2). | |
03 NDAY PIC 9(2). | |
* カレンダーを出力するためのデータ群です。 | |
01 CAL. | |
03 FWEEK PIC 9(1). | |
03 LDAY PIC 9(2). | |
03 WRAP PIC 9(1). | |
* スペース1(2)桁と日付2(1)桁の計3桁分 | |
03 SQDAY PIC ZZZ. | |
* 繰り返し用変数です。 | |
77 SEQ PIC 9(2). | |
* 計算で一時的に格納するための変数です。 | |
77 ALFW PIC 9(2). | |
77 ALLD PIC 9(2). | |
77 TEMP PIC 9(2). | |
PROCEDURE DIVISION. | |
MAIN. | |
* 現在の日付と曜日を取得し、日付は年月日に分解します。 | |
ACCEPT NDATE FROM DATE YYYYMMDD. | |
ACCEPT NWEEK FROM DAY-OF-WEEK. | |
DIVIDE 10000 INTO NDATE GIVING NYEAR REMAINDER NMD. | |
DIVIDE 100 INTO NMD GIVING NMONTH REMAINDER NDAY. | |
DIVIDE 7 INTO NWEEK GIVING TEMP REMAINDER NWEEK. | |
* 当月1日の曜日を求めます。 | |
* [当月1日の曜日] = ( [今日の曜日] + 7 - ( [今日] - 1 ) mod 7 ) mod 7 | |
* 曜日は日曜日を0、月曜日を1、・・・、土曜日を6とします。 | |
COMPUTE ALFW = NDAY - 1. | |
DIVIDE 7 INTO ALFW GIVING TEMP REMAINDER ALFW. | |
COMPUTE ALFW = NWEEK + 7 - ALFW. | |
DIVIDE 7 INTO ALFW GIVING TEMP REMAINDER FWEEK. | |
* 当月末日を求めます。 | |
* 2月 | |
IF NMONTH = 2 THEN | |
DIVIDE 4 INTO NYEAR GIVING TEMP REMAINDER ALLD | |
IF ALLD = 0 THEN MOVE 29 TO LDAY | |
ELSE MOVE 28 TO LDAY | |
END-IF | |
ELSE | |
DIVIDE 2 INTO NMONTH GIVING TEMP REMAINDER ALLD | |
* 1、3、5、7、8、10、12月 | |
IF NMONTH <= 7 AND ALLD = 1 OR | |
NMONTH >= 8 AND ALLD = 0 THEN | |
MOVE 31 TO LDAY | |
* 4、6、9、11月 | |
ELSE MOVE 30 TO LDAY | |
END-IF | |
END-IF. | |
* 当月1日の曜日に合わせてオフセットします。 | |
PERFORM VARYING SEQ FROM 1 BY 1 UNTIL SEQ > FWEEK | |
DISPLAY " " UPON CONSOLE WITH NO ADVANCING | |
END-PERFORM. | |
* カレンダーを出力します。 | |
PERFORM VARYING SEQ FROM 1 BY 1 UNTIL SEQ > LDAY | |
MOVE SEQ TO SQDAY | |
DISPLAY "", SQDAY UPON CONSOLE WITH NO ADVANCING | |
COMPUTE TEMP = FWEEK + SEQ | |
DIVIDE 7 INTO TEMP GIVING TEMP REMAINDER WRAP | |
* 土曜日で改行します。 | |
IF WRAP = 0 THEN DISPLAY "", UPON CONSOLE | |
* 月末が土曜日以外の時は、月末の表示後に改行します。 | |
ELSE | |
IF SEQ = LDAY THEN DISPLAY "", UPON CONSOLE | |
ELSE DISPLAY "", UPON CONSOLE WITH NO ADVANCING | |
END-IF | |
END-IF | |
END-PERFORM. | |
STOP RUN. | |
* Calender.cob | |
* Copyright (c) 2014 Myoga-TN.net All Rights Reserved. | |
* This software is released under the MIT License. | |
* http://opensource.org/licenses/mit-license.php |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment