#include<stdio.h>
#define Sunday 0
#define Monday 1
#define Tuesday 2
#define Wednesday 3
#define Thursday 4
#define Firday 5
#define Saturday 6
void giveinstructions();
int getyearfromuser();
void printcalendar(int year);
void printcalendarmonth(int month,int year);
void indentfirstline(int weekday);
int monthdays(int month,int year);
int firstdayofmonth(int month,int year);
char* monthname(int month);
int isleapyear(int year);
main()
{
int year;
clrscr();
giveinstructions();
year=getyearfromuser();
printcalendar(year);
getch();
}
void giveinstructions()
{
printf("This program displays a calender for a full./n");
printf("这个程序输出20世纪的日历,所以你只需输入两位数字的年份就可以了./n");
printf("例如你输入94,我们将显示1994的日历表。/n");
}
int getyearfromuser()
{
int year;
while(1)
{
printf("Which year?");
scanf("%d",&year);
if((year>=0)&&(year<100))
return (year+1900);
printf("The year must be between [0,100)./n");
}
}
void printcalendar(int year)
{
int month;
for(month=1;month<=12;month++)
{
printcalendarmonth(month,year);
printf("/n");
}
}
void printcalendarmonth(int month,int year)
{
int weekday,ndays,day;
printf(" %s %d/n",monthname(month),year);
printf(" Su Mo Tu We Th Fr Sa/n");
ndays=monthdays(month,year);
weekday=firstdayofmonth(month,year);
indentfirstline(weekday);
for(day=1;day<=ndays;day++)
{
printf(" %2d",day);
if(weekday==Saturday)printf("/n");
weekday=(weekday+1)%7;
}
if(weekday!=Sunday)printf("/n");
}
void indentfirstline(int weekday)
{
int i;
for(i=0;i<weekday;i++)
{
printf(" ");
}
}
int monthdays(int month,int year)
{
switch(month)
{
case 2:
if(isleapyear(year)==1)return(29);
return(28);
case 4: case 6: case 9: case 11:
return(30);
default:
return(31);
}
}
int firstdayofmonth(int month,int year)
{
int weekday,i;
weekday=Monday;
if(year>=1900)
for(i=1900;i<year;i++)
{
weekday=(weekday+365)%7;
if(isleapyear(i)==1) weekday=(weekday+1)%7;
}
for(i=1;i<month;i++)
{
weekday=(weekday+monthdays(i,year))%7;
}
return(weekday);
}
char* monthname(int month)
{
switch(month)
{
case 1:return("January");
case 2:return("February");
case 3:return("March");
case 4:return("April");
case 5:return("May");
case 6:return("June");
case 7:return("July");
case 8:return("August");
case 9:return("September");
case 10:return("October");
case 11:return("November");
case 12:return("December");
default:return("Illegal month");
}
}
int isleapyear(int year)
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))
return 1;
return 0;
}
#define Sunday 0
#define Monday 1
#define Tuesday 2
#define Wednesday 3
#define Thursday 4
#define Firday 5
#define Saturday 6
void giveinstructions();
int getyearfromuser();
void printcalendar(int year);
void printcalendarmonth(int month,int year);
void indentfirstline(int weekday);
int monthdays(int month,int year);
int firstdayofmonth(int month,int year);
char* monthname(int month);
int isleapyear(int year);
main()
{
int year;
clrscr();
giveinstructions();
year=getyearfromuser();
printcalendar(year);
getch();
}
void giveinstructions()
{
printf("This program displays a calender for a full./n");
printf("这个程序输出20世纪的日历,所以你只需输入两位数字的年份就可以了./n");
printf("例如你输入94,我们将显示1994的日历表。/n");
}
int getyearfromuser()
{
int year;
while(1)
{
printf("Which year?");
scanf("%d",&year);
if((year>=0)&&(year<100))
return (year+1900);
printf("The year must be between [0,100)./n");
}
}
void printcalendar(int year)
{
int month;
for(month=1;month<=12;month++)
{
printcalendarmonth(month,year);
printf("/n");
}
}
void printcalendarmonth(int month,int year)
{
int weekday,ndays,day;
printf(" %s %d/n",monthname(month),year);
printf(" Su Mo Tu We Th Fr Sa/n");
ndays=monthdays(month,year);
weekday=firstdayofmonth(month,year);
indentfirstline(weekday);
for(day=1;day<=ndays;day++)
{
printf(" %2d",day);
if(weekday==Saturday)printf("/n");
weekday=(weekday+1)%7;
}
if(weekday!=Sunday)printf("/n");
}
void indentfirstline(int weekday)
{
int i;
for(i=0;i<weekday;i++)
{
printf(" ");
}
}
int monthdays(int month,int year)
{
switch(month)
{
case 2:
if(isleapyear(year)==1)return(29);
return(28);
case 4: case 6: case 9: case 11:
return(30);
default:
return(31);
}
}
int firstdayofmonth(int month,int year)
{
int weekday,i;
weekday=Monday;
if(year>=1900)
for(i=1900;i<year;i++)
{
weekday=(weekday+365)%7;
if(isleapyear(i)==1) weekday=(weekday+1)%7;
}
for(i=1;i<month;i++)
{
weekday=(weekday+monthdays(i,year))%7;
}
return(weekday);
}
char* monthname(int month)
{
switch(month)
{
case 1:return("January");
case 2:return("February");
case 3:return("March");
case 4:return("April");
case 5:return("May");
case 6:return("June");
case 7:return("July");
case 8:return("August");
case 9:return("September");
case 10:return("October");
case 11:return("November");
case 12:return("December");
default:return("Illegal month");
}
}
int isleapyear(int year)
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))
return 1;
return 0;
}