Skip to content

Instantly share code, notes, and snippets.

@Myoga1012
Last active January 30, 2023 08:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Myoga1012/0700dad85f2a0354b399 to your computer and use it in GitHub Desktop.
Save Myoga1012/0700dad85f2a0354b399 to your computer and use it in GitHub Desktop.
COBOLでカレンダーを出力するソースコードです。
* 名前 : 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