C program to display month by month calendar for a given year

Last Updated : 8 Sep, 2026

Given a year, we can generate its calendar by finding the starting day and number of days for each month. In C, this can be done using functions to calculate the day of the week, month name, and number of days in a month.

  • The program handles leap years while calculating the number of days in February.
  • The calendar is printed month by month with days arranged according to the day of the week.

Example:

For the year 2016, the program prints the calendar for all 12 months.

For example, January 1, 2016 was a Friday, so the calendar starts as:

------------January-------------
Sun Mon Tue Wed Thu Fri Sat
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
...

Approach

  • Find the starting day of January using dayNumber().
  • Iterate through all 12 months.
  • Find the number of days in the current month using numberOfDays().
  • Print the month name and day headings using getMonthName().
  • Print spaces before the first day according to the month's starting day.
  • Print all days of the month and update the starting day for the next month.
C
#include <stdio.h> 

// Function that returns the index of the 
// day for date DD/MM/YYYY 
int dayNumber(int day, int month, int year) 
{ 

    static int t[] = { 0, 3, 2, 5, 0, 3, 
                    5, 1, 4, 6, 2, 4 }; 
    year -= month < 3; 
    return (year + year / 4 
            - year / 100 
            + year / 400 
            + t[month - 1] + day) 
        % 7; 
} 

// Function that returns the name of the 
// month for the given month Number 
// January - 0, February - 1 and so on 
char* getMonthName(int monthNumber) 
{ 
    char* month; 

    switch (monthNumber) { 
    case 0: 
        month = "January"; 
        break; 
    case 1: 
        month = "February"; 
        break; 
    case 2: 
        month = "March"; 
        break; 
    case 3: 
        month = "April"; 
        break; 
    case 4: 
        month = "May"; 
        break; 
    case 5: 
        month = "June"; 
        break; 
    case 6: 
        month = "July"; 
        break; 
    case 7: 
        month = "August"; 
        break; 
    case 8: 
        month = "September"; 
        break; 
    case 9: 
        month = "October"; 
        break; 
    case 10: 
        month = "November"; 
        break; 
    case 11: 
        month = "December"; 
        break; 
    default:
        month = "Invalid"; // Warning: Improper usage of function can lead to undefined behavior.
        break;

    } 
    return month; 
} 

// Function to return the number of days 
// in a month 
int numberOfDays(int monthNumber, int year) 
{ 
    // January 
    if (monthNumber == 0) 
        return (31); 

    // February 
    if (monthNumber == 1) { 
        // If the year is leap then Feb 
        // has 29 days 
        if (year % 400 == 0 
            || (year % 4 == 0 
                && year % 100 != 0)) 
            return (29); 
        else
            return (28); 
    } 

    // March 
    if (monthNumber == 2) 
        return (31); 

    // April 
    if (monthNumber == 3) 
        return (30); 

    // May 
    if (monthNumber == 4) 
        return (31); 

    // June 
    if (monthNumber == 5) 
        return (30); 

    // July 
    if (monthNumber == 6) 
        return (31); 

    // August 
    if (monthNumber == 7) 
        return (31); 

    // September 
    if (monthNumber == 8) 
        return (30); 

    // October 
    if (monthNumber == 9) 
        return (31); 

    // November 
    if (monthNumber == 10) 
        return (30); 

    // December 
    if (monthNumber == 11) 
        return (31);
} 

// Function to print the calendar of 
// the given year 
void printCalendar(int year) 
{ 
    printf("     Calendar - %d\n\n", year); 
    int days; 

    // Index of the day from 0 to 6 
    int current = dayNumber(1, 1, year); 

    // i for Iterate through months 
    // j for Iterate through days 
    // of the month - i 
    for (int i = 0; i < 12; i++) { 
        days = numberOfDays(i, year); 

        // Print the current month name 
        printf("\n ------------%s-------------\n", 
            getMonthName(i)); 

        // Print the columns 
        printf(" Sun Mon Tue Wed Thu Fri Sat\n"); 

        // Print appropriate spaces 
        int k; 
        for (k = 0; k < current; k++) 
            printf("     "); 

        for (int j = 1; j <= days; j++) { 
            printf("%5d", j); 

            if (++k > 6) { 
                k = 0; 
                printf("\n"); 
            } 
        } 

        if (k) 
            printf("\n"); 

        current = k; 
    } 

    return; 
} 

// Driver Code 
int main() 
{ 
    int year = 2016; // Warning: For beginners, it may not be clear how to input a custom year.
                     // Suggest replacing this with a scanf() for user input.

    // Function Call 
    printCalendar(year); 
    return 0; 
} 

Output

     Calendar - 2016


------------January-------------
Sun Mon Tue Wed Thu Fri Sat
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

------------February-------------
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29

------------March-------------
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

And similarly, it continues for April through December.

Comment