Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions OpenCobol/HOLIDAY-README.md
Original file line number Diff line number Diff line change
@@ -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
Binary file added OpenCobol/HOLIDAY-SIMPLE
Binary file not shown.
107 changes: 107 additions & 0 deletions OpenCobol/HOLIDAY-SIMPLE.cbl
Original file line number Diff line number Diff line change
@@ -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.
Binary file added OpenCobol/HelloWorld
Binary file not shown.