diff --git a/OpenCobol/HOLIDAY-README.md b/OpenCobol/HOLIDAY-README.md new file mode 100644 index 0000000..13c6d69 --- /dev/null +++ b/OpenCobol/HOLIDAY-README.md @@ -0,0 +1,88 @@ +# Holiday Calculator - COBOL Program + +## Overview +The Holiday Calculator is an OpenCobol program that determines what day of the week holidays fall on for any given year. It supports historical calculations going back to 1806 and forward to the year 3000. + +## Features +- Interactive menu-driven interface +- Calculate day of week for major holidays +- Historical date support (1806-3000) +- Input validation and error handling +- User-friendly output format + +## Supported Holidays +1. **New Year's Day** - January 1st +2. **Independence Day** - July 4th +3. **Halloween** - October 31st +4. **Christmas Day** - December 25th + +## Program Details +- **File**: `HOLIDAY-SIMPLE.cbl` +- **Program ID**: `HOLIDAY-CALC` +- **Language**: OpenCobol/GnuCOBOL +- **Year Range**: 1806 - 3000 +- **Algorithm**: Uses COBOL intrinsic functions `INTEGER-OF-DATE` and `MOD` for precise day-of-week calculations + +## Compilation +```bash +cobc -x HOLIDAY-SIMPLE.cbl +``` + +## Usage +```bash +./HOLIDAY-SIMPLE +``` + +### Sample Session +``` +================================================= + HOLIDAY DAY CALCULATOR + What day does your holiday fall on? +================================================= + +1. New Years Day (January 1) +2. Independence Day (July 4) +3. Halloween (October 31) +4. Christmas (December 25) + +Enter holiday (1-4): 4 +Enter year (1806-3000): 2025 +Christmas 2025 +falls on: +FRIDAY + +Check another? (Y/N): N +Goodbye! +``` + +## Example Calculations +- **Christmas 2025**: Friday +- **Independence Day 2025**: Saturday +- **New Year's Day 2000**: Sunday +- **Christmas 1850**: Thursday (historical date) + +## Technical Implementation +- Uses standard COBOL date functions for accuracy +- Formats dates in YYYYMMDD format for calculations +- Converts to integer date representation +- Calculates day of week using modulo arithmetic +- Maps numeric day (1-7) to day names (Monday-Sunday) + +## Testing +The program has been tested with: +- Current year dates (2025) +- Historical dates (1850) +- Future dates (2999) +- All supported holidays +- Input validation (invalid years, holiday numbers) + +## Future Enhancements +- Additional holidays (Easter, Thanksgiving, etc.) +- Holiday descriptions and historical context +- Export results to file +- Batch processing mode for multiple years + +--- +**Created**: January 25, 2025 +**Author**: AI Assistant +**Version**: 1.0 \ No newline at end of file diff --git a/OpenCobol/HOLIDAY-SIMPLE b/OpenCobol/HOLIDAY-SIMPLE new file mode 100755 index 0000000..4138000 Binary files /dev/null and b/OpenCobol/HOLIDAY-SIMPLE differ diff --git a/OpenCobol/HOLIDAY-SIMPLE.cbl b/OpenCobol/HOLIDAY-SIMPLE.cbl new file mode 100644 index 0000000..6fa78b9 --- /dev/null +++ b/OpenCobol/HOLIDAY-SIMPLE.cbl @@ -0,0 +1,107 @@ + ****************************************************************** + * Author: AI Assistant * + * Date: 25/01/2025 * + * Holiday Day Calculator - Simple version * + ****************************************************************** + IDENTIFICATION DIVISION. + PROGRAM-ID. HOLIDAY-CALC. + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + INPUT-OUTPUT SECTION. + DATA DIVISION. + FILE SECTION. + WORKING-STORAGE SECTION. + 01 WS-INPUT-YEAR PIC 9(4) VALUE ZEROS. + 01 WS-HOLIDAY-CHOICE PIC 9(1) VALUE ZEROS. + 01 WS-CONTINUE-FLAG PIC X(1) VALUE 'Y'. + 01 WS-ERROR-FLAG PIC X(1) VALUE 'N'. + 01 WS-FORMATTED-DATE PIC X(8). + 01 WS-DATE-NUM PIC 9(8). + 01 WS-DAY-RESULT PIC 9(1). + + PROCEDURE DIVISION. + MAIN-PROCEDURE. + PERFORM SHOW-MENU. + PERFORM UNTIL WS-CONTINUE-FLAG = 'N' + PERFORM GET-INPUT + IF WS-ERROR-FLAG = 'N' + PERFORM CALC-HOLIDAY + END-IF + PERFORM ASK-AGAIN + END-PERFORM. + DISPLAY 'Goodbye!'. + STOP RUN. + + SHOW-MENU. + DISPLAY ' '. + DISPLAY '=================================================' + DISPLAY ' HOLIDAY DAY CALCULATOR' + DISPLAY ' What day does your holiday fall on?' + DISPLAY '=================================================' + DISPLAY ' '. + DISPLAY '1. New Years Day (January 1)' + DISPLAY '2. Independence Day (July 4)' + DISPLAY '3. Halloween (October 31)' + DISPLAY '4. Christmas (December 25)' + DISPLAY ' '. + + GET-INPUT. + MOVE 'N' TO WS-ERROR-FLAG. + + DISPLAY 'Enter holiday (1-4): ' WITH NO ADVANCING. + ACCEPT WS-HOLIDAY-CHOICE. + + IF WS-HOLIDAY-CHOICE < 1 OR WS-HOLIDAY-CHOICE > 4 + DISPLAY 'Please enter 1, 2, 3, or 4' + MOVE 'Y' TO WS-ERROR-FLAG + EXIT PARAGRAPH + END-IF. + + DISPLAY 'Enter year (1806-3000): ' WITH NO ADVANCING. + ACCEPT WS-INPUT-YEAR. + + IF WS-INPUT-YEAR < 1806 OR WS-INPUT-YEAR > 3000 + DISPLAY 'Year must be 1806-3000' + MOVE 'Y' TO WS-ERROR-FLAG + END-IF. + + CALC-HOLIDAY. + EVALUATE WS-HOLIDAY-CHOICE + WHEN 1 + STRING WS-INPUT-YEAR '0101' INTO WS-FORMATTED-DATE + DISPLAY 'New Years Day ' WS-INPUT-YEAR + WHEN 2 + STRING WS-INPUT-YEAR '0704' INTO WS-FORMATTED-DATE + DISPLAY 'Independence Day ' WS-INPUT-YEAR + WHEN 3 + STRING WS-INPUT-YEAR '1031' INTO WS-FORMATTED-DATE + DISPLAY 'Halloween ' WS-INPUT-YEAR + WHEN 4 + STRING WS-INPUT-YEAR '1225' INTO WS-FORMATTED-DATE + DISPLAY 'Christmas ' WS-INPUT-YEAR + END-EVALUATE. + + COMPUTE WS-DATE-NUM = FUNCTION NUMVAL(WS-FORMATTED-DATE). + COMPUTE WS-DAY-RESULT = FUNCTION MOD( + FUNCTION INTEGER-OF-DATE(WS-DATE-NUM), 7) + 1. + + DISPLAY 'falls on:' + EVALUATE WS-DAY-RESULT + WHEN 1 DISPLAY 'MONDAY' + WHEN 2 DISPLAY 'TUESDAY' + WHEN 3 DISPLAY 'WEDNESDAY' + WHEN 4 DISPLAY 'THURSDAY' + WHEN 5 DISPLAY 'FRIDAY' + WHEN 6 DISPLAY 'SATURDAY' + WHEN 7 DISPLAY 'SUNDAY' + END-EVALUATE. + DISPLAY ' '. + + ASK-AGAIN. + DISPLAY 'Check another? (Y/N): ' WITH NO ADVANCING. + ACCEPT WS-CONTINUE-FLAG. + IF WS-CONTINUE-FLAG = 'y' + MOVE 'Y' TO WS-CONTINUE-FLAG + END-IF. + + END PROGRAM HOLIDAY-CALC. diff --git a/OpenCobol/HelloWorld b/OpenCobol/HelloWorld new file mode 100755 index 0000000..129560d Binary files /dev/null and b/OpenCobol/HelloWorld differ