int GetYear(char *str);
int RunNian(int year);
int WeekNum(int year);
void OutPut(int n, int leap);
int main(int argc, char *argv[])
{
int year;
int n, leap = 0; // leap=1表示闰年
//判断输入格式是否正确
if(argc != 2)
{
printf("Use this program like this :Calendar 2003");
exit (0);
}
year = GetYear(argv[1]);
if(year == -1)
{
printf("command line argument must be a intager");
exit (0);
}
//判断该年份是否为闰年
leap = RunNian(year);
//计算该年份1月1日是星期几,星期天用0表示
//已知2003年1月1日是星期三
n = WeekNum(year);
//打印出结果
OutPut(n, leap);
return 0;
}
int GetYear(char *str)
{
int k, i = 0;
while (str[i] != 0)
{
if(str[i] < '0' || str[i] > '9')
return (-1);
else
i++;
}
k = atoi (str);
return (k);
}
int WeekNum(int year)
{
int y=2003;
int i, t, n;
int tag = 0; //如果所输入年份小于2003,那么tag=1。
long m = 0;
if(year < 2003)
{
t = year;
year = y;
y = t;
tag = 1;
}
for(i = y; i < year; i++)
{
if(i % 4 == 0)
{
if(i % 4 == 0)
{
if(i % 100 != 0 || i % 400 == 0)
m += 366;
else
m += 365;
}
}
else
m += 365;
}
if(tag == 0)
{
n = m % 7 + 3;
if(n > 6)
n = n % 7;
}
else
{
n = 3 - m % 7;
if(n < 0)
n = n + 7;
}
return(n);
}
void OutPut(int n, int leap)
{
int i, j, k;
int a[12][31];
int days;
char month[12][10] = {"JUNUARY", "FEBUARY", "MARCH", "APRIL",
"MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER",
"OCTOBER", "NOVEMBER", "DECEMBER" };
for(i = 0; i < 12; i++)
{
switch(i+1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: days = 31; break;
case 4:
case 6:
case 9:
case 11: days = 30; break;
case 2: if(leap == 1)
days = 29;
else days = 28;
break;
}
printf(" ==========%s==========\n",month[i]);
printf(" Sun Mon Tues Wed Thur Fri Sat\n");
for(k = 0; k < n; k++)
printf(" ");
for(j = 0; j < days; j++)
{
printf("%6d",j+1);
n++;
if(n == 7)
{
printf("\n");
n = 0;
}
}
printf("\n");
printf("\n");
}
}