#include "stdio.h"
//functions define
void outputcalendar(void);
void outputtitle(int);
void outputbody(int *, int maxday);
int *getweek(int, int, int);
//variables and constants
const char CON_STR4SPACE[5] = " ";
const char CON_STR1SPACE[2] = " ";
const int CON_DAYCOUNTS31 = 31;
const int CON_DAYCOUNTS30 = 30;
int daycountsofFeb;
//function main
int main()
{
outputcalendar();
return 0;
}
//functions
void outputcalendar(void)
{
while(true)
{
int year,month;
int *weekp;
printf("please input year:");
scanf("%d",&year);
if(year < 0 || year > 9999)
{
printf("the input year must between 0 to 9999!\n",year);
continue;
}
//get week the first day of year
weekp = getweek(year,1,1);
//get the days of Feb
daycountsofFeb = 28;
if(year%4==0 && year%100!=0 || year%400==0)
daycountsofFeb++;
printf("[Calendar Of Year %d]\n",year);
for(month=1; month<13; ++month)
{
outputtitle(month);
switch (month)
{
case 1:
/*no break;*/
case 3:
/*no break;*/
case 5:
/*no break;*/
case 7:
/*no break;*/
case 8:
/*no break;*/
case 10:
/*no break;*/
case 12:
outputbody(weekp, 31);
break;
case 2:
outputbody(weekp, daycountsofFeb);
break;
case 4:
/*no break;*/
case 6:
/*no break;*/
case 9:
/*no break;*/
case 11:
outputbody(weekp, 30);
break;
}//end of switch
printf("\n");
}//end of For
printf("\n");
}//end of while
}//end of function
void outputtitle(int month)
{
char *monthname[4] ;
switch (month)
{
case 1:
*monthname = "Jan";
break;
case 2:
*monthname = "Feb";
break;
case 3:
*monthname = "Mar";
break;
case 4:
*monthname = "Apr";
break;
case 5:
*monthname = "May";
break;
case 6:
*monthname = "Jun";
break;
case 7:
*monthname = "Jul";
break;
case 8:
*monthname = "Aug";
break;
case 9:
*monthname = "Sep";
break;
case 10:
*monthname = "Oct";
break;
case 11:
*monthname = "Nov";
break;
case 12:
*monthname = "Dec";
break;
}//end of switch
printf("------------%s------------\n",*monthname);
printf(" S- -1- -2- -3- -4- -5- -6\n");
}
void outputbody(int *m, int maxday)
{
int i,c = 0;
for(i=1; i<=*m; i++)
{
c++;
printf(CON_STR4SPACE);
}
for(i=1; i<=maxday; i++)
{
c++;
if(c%7-1==0 && c!=1)
printf("\n");
if(i<10)
printf(CON_STR1SPACE);
printf(" %d ",i);
*m = ++(*m)%7;
}
}
int *getweek(int year, int month, int day)
{
static int week;
int *p;
int lastyear, i, days = 0;
int mont[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//char wek[][9] = { {'S','u','n','d','a','y'},
// {'M','o','n','d','a','y'},
// {'T','u','e','s','d','a','y'},
// {'W','e','d','n','s','d','a','y'},
// {'T','h','u','r','s','d','a','y'},
// {'F','r','i','d','a','y'},
// {'S','a','t','u','r','d','a','y'}
// };
if (year%4==0||year%100==0||year%400==0)
mont[2] += 1;
if ((year < 0 || year > 9999) ||
(month < 1 || month > 12) ||
(day > mont[month] || day < 1)
)
{
//error date return -1
week = -1;
p = &week;
return p;
}
for (i=1;i<month;i++)
days += mont[i];
days += day;
lastyear = year - 1;
days += lastyear*365 + (int)(lastyear/4) - (int)(lastyear/100) + (int)(lastyear/400);
week = days % 7;
p = &week;
return p;
}