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

In this article, you will learn how to write a C program to display a month-by-month calendar for a given year. I have already written a code to display a calendar for the given month and year. This code compiles in Code Blocks with the GCC compiler.

 

The following is a C program to display a month-by-month calendar for a given year.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//check leap year
#define IS_LEAP_YEAR(Year) \
((Year%4==0 && Year%100 != 0)||Year%400==0)



/*Function returns the index of the days
of the given month and year using ZELLER'S ALGORITHM
  For e.g-
  Index     Day
  0         Sunday
  1         Monday
  2         Tuesday
  3         Wednesday
  4         Thursday
  5         Friday
  6         Saturday*/
int getZeller(int Month,int Year)
{
    int Day = 1, ZMonth, ZYear, Zeller;
    if(Month < 3)
        ZMonth = Month+10;
    else
        ZMonth = Month-2;
    if(ZMonth > 10)
        ZYear = Year-1;
    else
        ZYear = Year;
    Zeller = ((int)((13*ZMonth-1)/5)+Day+ZYear%100+
              (int)((ZYear%100)/4)-2*(int)(ZYear/100)+
              (int)(ZYear/400)+77)%7;
    return Zeller;
}
/* A Function to return the number of days in
   a month
  Month Number     Name        Number of Days
  0                January     31
  1                February    28 (non-leap) / 29 (leap)
  2                March       31
  3                April       30
  4                May         31
  5                June        30
  6                July        31
  7                August      31
  8                September   30
  9                October     31
  10               November    30
  11               December    31
*/
int getNumberOfDays(int monthNumber, int year)
{
    int MonthDay[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    MonthDay[monthNumber-1] += (IS_LEAP_YEAR(year) && (monthNumber == 2));
    return (MonthDay[monthNumber-1]);
}

//Align the message
void printMessageCenter(const char* message)
{
    int len =0;
    int pos = 0;
    //calculate how many space need to print
    len = (78 - strlen(message))/2;
    printf("\t\t\t");
    for(pos =0 ; pos < len ; pos++)
    {
        //print space
        printf(" ");
    }
    //print message
    printf("%s",message);
}


// Function to print the calendar of the given year
void printCalendar(int month,int year)
{
//get month name
    char * months[] = {"January", "February", "March",
                       "April", "May", "June",
                       "July", "August", "September",
                       "October", "November", "December"
                      };
    int j,k;
    int days;
    // Index of the day from 0 to 6
    int current = getZeller(month,year);
    days = getNumberOfDays (month, year);
    printf("\n\n\t\t%s\n", months[month-1]);
    // Print days in the columns
    printf("  Sun  Mon  Tue  Wed  Thu  Fri  Sat\n");
    // Print appropriate spaces
    for (k = 0; k < current; k++)
        printf("     ");
    //print days as per the month
    for (j= 1; j <= days; j++)
    {
        printf("%5d", j);
        ++k; //change new line for each week
        if (k > 6)
        {
            k = 0;
            printf("\n");
        }
    }
    if (k)
        printf("\n");
    current = k;
}


void headMessage(const char *message)
{
    system("cls");
    printf("\t\t\t#################################################################");
    printf("\n\t\t\t############                                         ############");
    printf("\n\t\t\t############   C Project: Calendar For Given Month.  ############");
    printf("\n\t\t\t############                                              #######");
    printf("\n\t\t\t#################################################################");
    printf("\n\t\t\t------------------------------------------------------------------\n");
    printMessageCenter(message);
    printf("\n\t\t\t-------------------------------------------------------------------");
}

void welcomeMessage()
{
    headMessage("www.aticleworld.com");
    printf("\n\n\n\n\n");
    printf("\n\t\t\t  **-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**\n");
    printf("\n\t\t\t        =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
    printf("\n\t\t\t        =                  Program                  =");
    printf("\n\t\t\t        =                   Shows                   =");
    printf("\n\t\t\t        =               calendar of a               =");
    printf("\n\t\t\t        =                Given Month                =");
    printf("\n\t\t\t        =                                           =");
    printf("\n\t\t\t        =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
    printf("\n\t\t\t  **-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**\n");
    printf("\n\n\n\t\t\t Enter any key to continue.....");
    getchar();
    system("cls");
    printf("\n\tThis program shows calendar of a given month.\n\n");
}

void printCalendarGivenYear(int year)
{
    int month;
    const int monthInYear = 12;
    char buf[32] = {0};
    sprintf(buf,"%s%d\n\n","Calendar - ",year);
    printMessageCenter(buf);

    for(month = 1; month < monthInYear; ++month)
    {
        printCalendar(month,year);
    }
}

int main()
{
    int Month, Year;
    welcomeMessage();
    //validate input
    while(1)
    {
        fflush(stdin);
        printf("Enter the Year YYYY = ");
        scanf("%d",&Year);
        if(Year < 0)
        {
            printf("\nInvalid year value...");
            continue;
        }
        if(Year < 100)
            Year += 1900;
        if(Year < 1582 || Year > 4902)
        {
            printf("\nInvalid year value...\n");
            printf("Enter the Year between 1582-4902\n\n");
            continue;
        }
        break;
    }  /*Break loop after valid input*/
    //clean console
    system("cls");
    do
    {
        printCalendarGivenYear(Year);
        //Display message
        printf("\n\n\t\t(*) Press Up Arrow for Next Year.");
        printf("\n\n\t\t(*) Press Down Arrow for Previous Year.");
        printf("\n\n\t\t(*) Press ESC for Exit.\n\n\n\t\t");
        char KeyCode = getchar();         /* getting Key Code */
        if(KeyCode == 72)           /* Up Arrow */
            Year++;
        if(KeyCode == 80)           /* Down Arrow */
            Year--;

        if(KeyCode == 27)            /* Esc button */
        {
            system("cls");
            printf("\n\n\n\n\n\t\tBye Bye ...");
            printf("\n\t\tThanks for reading Aticleworld\n\n\n\n\n\n");
            exit(1);
        }
        system("cls");
    }
    while(1);
    return (0);
}

Output:

                                                   Calendar - 2023



              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


              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


              April
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


              May
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


              June
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


              July
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


              August
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


              September
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


              October
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


              November
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


              (*) Press Up Arrow for Next Year.

              (*) Press Down Arrow for Previous Year.

              (*) Press ESC for Exit.

 

Recommended Post: