How to make a Calendar in C
In the C tutorial “How to use Time and Date in C” some people asked questions in the comment section about determining dates and day of the week. That’s why we created this tutorial to show you what things you have to lookout for, such as leap years.
Gregorian Calendar and Leap Years
The Gregorian calendar is the internationally accepted calendar. In the Gregorian calendar there are leap years. If you take a period of four hundred years, there are 303 normal years and 97 leap years. Most people think that every fourth year is a leap year, but strictly speaking this isn’t true.
How to determine which leap years
If a year is divisible by 4, then it is a leap year. But if that year is divisible by 100, then it is not a leap year. However, if the year is also divisible by 400, then it is a leap year. So we can construct the following statement:
if(year% 4 == FALSE && year%100 != FALSE || year%400 == FALSE)
{
// It is a leap year and February has 29 days.
}
else
{
// It is not a leap year, so February has 28 days.
}
Complete Calendar Source-code Example
Below you’ll find the complete calendar example. The example asks the user to enter a year, for instance 2010.
// This calendar example is provided by:
// http://www.codingunit.com Programming Tutorials
#include<stdio.h>
#define TRUE 1
#define FALSE 0
int days_in_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char *months[]=
{
" ",
"\n\n\nJanuary",
"\n\n\nFebruary",
"\n\n\nMarch",
"\n\n\nApril",
"\n\n\nMay",
"\n\n\nJune",
"\n\n\nJuly",
"\n\n\nAugust",
"\n\n\nSeptember",
"\n\n\nOctober",
"\n\n\nNovember",
"\n\n\nDecember"
};
int inputyear(void)
{
int year;
printf("Please enter a year (example: 1999) : ");
scanf("%d", &year);
return year;
}
int determinedaycode(int year)
{
int daycode;
int d1, d2, d3;
d1 = (year - 1.)/ 4.0;
d2 = (year - 1.)/ 100.;
d3 = (year - 1.)/ 400.;
daycode = (year + d1 - d2 + d3) %7;
return daycode;
}
int determineleapyear(int year)
{
if(year% 4 == FALSE && year%100 != FALSE || year%400 == FALSE)
{
days_in_month[2] = 29;
return TRUE;
}
else
{
days_in_month[2] = 28;
return FALSE;
}
}
void calendar(int year, int daycode)
{
int month, day;
for ( month = 1; month <= 12; month++ )
{
printf("%s", months[month]);
printf("\n\nSun Mon Tue Wed Thu Fri Sat\n" );
// Correct the position for the first date
for ( day = 1; day <= 1 + daycode * 5; day++ )
{
printf(" ");
}
// Print all the dates for one month
for ( day = 1; day <= days_in_month[month]; day++ )
{
printf("%2d", day );
// Is day before Sat? Else start next line Sun.
if ( ( day + daycode ) % 7 > 0 )
printf(" " );
else
printf("\n " );
}
// Set position for next month
daycode = ( daycode + days_in_month[month] ) % 7;
}
}
int main(void)
{
int year, daycode, leapyear;
year = inputyear();
daycode = determinedaycode(year);
determineleapyear(year);
calendar(year, daycode);
printf("\n");
}
Download here the source code of this calendar example.
First we make two arrays; one with the number of days for a given month and one with all the month names. Note: in both arrays the first position is empty on purpose, we want to use 1 to 12 to keep things simple.
The first function inputyear() is used to get the user input. We ask the user to input a year. Note: that there is no input checking or error handling is performed to keep things simple.)
The next function determinedaycode() is used to get the day number of the first day in that year, so we can print the date on the correct position. (So it is only used for output purposes.)
The next function determineleapyear() is used to determine if input of the user is a leap year. If so, the number if days in February is changed to 29.
The last function calendar() is used to print each month onto the screen. The first for loop is used to loop through all months. We then print the month’s name and all the days of the week. We then use the daycode to position the prompt under the right weekday. Then we print all the dates for one month. The last thing we do is to set the position of the prompt on the right weekday.
That’s all for this C programming tutorial. We hope that you now better understand how to determine days-names or date in a year, month or week and that you can use the calendar example to create your own date/days-names functions.
-The- internationally recognized calendar is the -ISO- calendar, which is different from the Gregorian calendar in several ways.
1) it defines year 0 (the year before year 1 in the Gregorian calendar is year -1)
2) it defines the first day of the week to be Monday (the Gregorian calendar does define a week at all)
3) the first week of the year is the week which contains the first Thursday of the year. (the Gregorian calendar doesn’t define this as it doesn’t define what a week is).
The calendar implemented in this program is the standard US calendar, which is not the Gregorian calendar, but a calendar derived from it/extending it.
can yu please specify wat exactly is a day code..
n wat are the calculations been done to determine it.?
can you please explain on how to get the day code?
the formula confusing me…
codingunit is great website.we love members of coding unit.
How do I put the months side by side.
Like this:
Janunary February
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
March April
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
I’m trying to do this since last month but I simply can’t figure it out. Can anyone help me?
On my last post the months (February and April) should been a few spaces foward like the week day
Am trying to develop a program to output the date on requesting for a 30 days leave and when the leave will end. But it is not working out. some one to help me out.
This code:
int determinedaycode(int year)
{
int daycode;
int d1, d2, d3;
d1 = (year – 1.)/ 4.0;
d2 = (year – 1.)/ 100.;
d3 = (year – 1.)/ 400.;
daycode = (year + d1 – d2 + d3) %7;
return daycode;
}
compiled with PellesC generates a wrong daycode. The floats are causing it. If the decimals are removed it works fine and the code works fine as is compiled with MinGW.
This is a very nice program..
this code show only whole cal of 12 months but beside this i want, it will show the specipic day when i input date & month —how can i do it???? plz help
This program is difficult,but understand very easily.So thanks.
it is a big help for my project. tnx
how do i get a specific day in the calendar, example: u ask the users to enter a date and the outputs that specified date, example: 02/11/2011.
sir,i need output of this program
I want to implement in c# where the year,month and date are entered in individual textboxs by the user and the corresponding day has to be displayed in another textbox. how can i do it???? plz help me…. i have tried but am facing prob in coding it.
Argh!! my head’s gonna blow!! can’t understand a thing..I’m noob… T_T
I have a program, then you ask the user to input the month, day, year(MM/DD/YYYY), then if the user inputs the number of the month(1-12), the program will output the month in words(Jan to Dec), and if he inputs the day(1-7), the program will output in words(Mon to Sun), and if he inputs the year, the program will output if it is a leap year or not. Can someone help me with the codes? I can’t make mine work.
Thanks!
Very good example 🙂
hey admin thanks for making this article so useful……..
but bro one place i m stucked on one thing…..how did u determine the daycode……its completely beyond me to understand….plz sort my problme out…….expecting ur answer…….thank u so much….
@sandeep kosta
As stated in the text of this tutorial:
and later on in the text:
So for example for 2002 this is 2, so the printing is started on Tuesday.
In the year 2012 this first day is on Sunday, so the output of determinedaycode() will be 0 (zero).
Hope this helps!
CALENDER PROGRAM:: use the following Simple source code of calender program and reply me in the my email id: vikas.sidhi@gmail.com
This code is written by self me I am student of MCA(Master of Computer Application) II year.
#include
#include
void main()
{
int dd,mm,yy,ndd,dn,yr,rs,i,x,y,z,w,u,td,k,j,tm=0;
int mnth[12]={3,0,3,2,3,2,3,3,2,3,2,3};
char c;
clrscr();
do
{
printf(“\n Enter the any Date(dd/mm/yyyy):”);
scanf(“%d/%d/%d”,&dd,&mm,&yy);
if(yy30200)
printf(“\n :INVALID DATE:”);
else
{
if(mm12)
printf(“\n :INVALID DATE:”);
else
{
if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
if(dd31)
printf(“\n INVALID DATE:”);
else
goto agn;
else if(mm==4||mm==6||mm==9||mm==11)
if(dd30)
printf(“\n INVALID DATE:”);
else
goto agn;
else if(mm==2 && (yy%400==0||(yy%100!=0 && yy%4==0)))
if(dd29)
printf(“\n INVALID DATE:”);
else
goto agn;
else if(mm==2 && !(yy%400==0 || (yy%100!=0 && yy%4==0)))
if(dd28)
printf(“\n INVALID DATE:”);
else
goto agn;
else
{
agn:
yr=yy-1;
ndd=01;
if(yy%400==0||(yy%100!=0 && yy%4==0))
{
mnth[1]=1;
}
else
mnth[1]=0;
tm=0;
for(i=0;i<=mm-2;i++)
tm=tm+mnth[i];
x=yr%400;
y=x/100;
z=x%100;
w=z/4;
u=z%4;
td=y*5+w*5+u;
rs=(td+tm+ndd)%7;
printf("\n");
printf("\t**This Software Is Developed By: VIKAS TIWARI**\n\n");
if(mm==1)
printf("\t\tJanuary\t%d\n",yy);
if(mm==2)
printf("\t\tFebuary\t%d\n",yy);
if(mm==3)
printf("\t\tMarch\t%d\n",yy);
if(mm==4)
printf("\t\tApril\t%d\n",yy);
if(mm==5)
printf("\t\tMay\t%d\n",yy);
if(mm==6)
printf("\t\tJune\t%d\n",yy);
if(mm==7)
printf("\t\tJuly\t%d\n",yy);
if(mm==8)
printf("\t\tAugust\t%d\n",yy);
if(mm==9)
printf("\t\tSeptember\t%d\n",yy);
if(mm==10)
printf("\t\tOctoober\t%d\n",yy);
if(mm==11)
printf("\t\tNovember\t%d\n",yy);
if(mm==12)
printf("\t\tDecember\t%d\n",yy);
printf("\n Mon \tTue \tWed \tThu \tFri \tSat \tSun\n");
if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
dn=31;
if(mm==4||mm==6||mm==9||mm==11)
dn=30;
if(mm==2 && (yy%400==0||(yy%100!=0 && yy%4==0)))
dn=29;
if(mm==2 && !(yy%400==0||(yy%100!=0 && yy%4==0)))
dn=28;
if(rs==0)
{
printf("\t\t\t\t\t\t");
j=6;
}
if(rs==1)
{
j=0;
}
if(rs==2)
{
printf("\t");
j=8;
}
if(rs==3)
{
printf("\t\t");
j=9;
}
if(rs==4)
{
printf("\t\t\t");
j=10;
}
if(rs==5)
{
printf("\t\t\t\t");
j=11;
}
if(rs==6)
{
printf("\t\t\t\t\t");
j=12;
}
for(k=1;k30200)
yy=30200;
goto agn;
}
if(c==80)
{ clrscr();
yy=yy-1;
if(yy<1)
yy=1;
goto agn;
}
if(c==75)
{ clrscr();
–mm;
if(mm<1)
{
mm=12;
yy=yy-1;
if(yy12)
{
mm=1;
yy++;
if(yy>30200)
yy=30200;
}
goto agn;
}
}
}
} /*First else statemen */
printf(“\n Do You Want to Continue…..(y/n):”);
fflush(stdin);
c=getche();
}
while(c==’y’ || c==’Y’);
getch();
}
is there any extra things that we can add to calender so that it will replace the present day calender
Thanks for developing these type of programs in languages so usefull for professional students / learners.
It is very good code. I worked on it. It really help to me on daycode. Thank you very much!
genious baby
I want a program for my project that will count the number of days by inputting two distinct dates. Example: 1st date= 15/05/2013; 2nd date= 26/11/2013. the difference of days between these two dates is required.
This code:
for ( gun = 1; gun <= 1 + d * 5; gun++ )
{
printf(" ");
}
What does part of the this code task ? I can't understand. Can you help that issue ??
This program is difficult,but understand very easily.So thanks.
This site is really good for first time users I mean start users.The way it explains and codes is very basic and easy to understand.Thanks
How can i start week from any day let say from friday
hai,
I,need some reference from u. if we put today as a input(like 14/2/2014) how to get next day as output(15/2/2014) using for loop
hi,
Actually i need a help from you.
I am making a signup page and i want to add the calender to that for the DOB column, but i want to print an error if the age preceeds 18 year from now..
can any one help that how i can do this?