打印日历。
#include<stdio.h>#define Sunday 0
#define Monday 1
#define Tuesday 2
#define Wednesday 3
#define Thursday 4
#define Friday 5
#define Saturday 6
int input_year();
void prt_calendar(int year);
void prt_month_calendar(int month,int year);
char *month_name(int month);
int month_days(int month,int year);
int first_day_of_month(int month,int year);
void print_space(int weekday);
int is_leapyear(int year);
int main(void)
{
int year;
year=input_year();
prt_calendar(year);
return 0;
}
/* 输入年份 */
int input_year()
{
int year;
while(1)
{
printf("Which year:");
scanf("%d",&year);
if(year>=1900)
return year;
else
printf("The year must be at least 1900.\n");
}
}
/* 打印year年的日历*/
void prt_calendar(int year)
{
int month;
for(month=1;month<=12;month++)
{
prt_month_calendar(month,year);
printf("\n");
}
}
/* 打印某个月的日历*/
void prt_month_calendar(int month,int year)
{
int weekday,ndays,day;
printf(" %s %d\n",month_name(month),year);
printf(" Su Mo Tu We Th Fr Sa\n");
ndays=month_days(month,year); /* 计算某年某月的天数 */
weekday=first_day_of_month(month,year); /* 计算某年某月第一天是星期几 */
print_space(weekday); /* 打印某月第一天以前的空格 */
/* 在星期表上打印日期 */
for(day=1;day<=ndays;day++)
{
printf(" %2d",day);
if(weekday == Saturday)
printf("\n"); /* 当打印星期六的日后换行 */
weekday=(weekday+1)%7; /* 计算下一天是星期几 */
}
if(weekday != Sunday) /* 最后一行为星期的开头时不需要换行 */
printf("\n");
}
/* 打印月份的名称*/
char *month_name(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("Deccember");
default: return("Illegal month");
}
}
/* 计算year年month月的天数的函数*/
int month_days(int month,int year)
{
switch(month)
{
case 2:
if(is_leapyear(year)) /* 调用判断是否闰年函数*/
return 29; /* 闰年2月为29天 */
else
return 28; /* 非闰年2月为28天 */
break;
case 4:
case 6:
case 9:
case 11: return 30; break; /* 第4、6、9、11月为30天 */
default: return 31; break; /* 第1、3、5、7、8、10、12月为31天 */
}
}
/* 计算year年month月第一天是星期几。*/
int first_day_of_month(int month,int year)
{
int weekday,i;
weekday=Monday; /* 1900年1月1日为星期一 */
for(i=1900;i<year;i++)
{
weekday=(weekday+365)%7; /* 计算某年的1月1日为星期几 */
if(is_leapyear(i))
weekday=(weekday+1)%7; /* 闰年时一年要加1为366天 */
}
for(i=1;i<month;i++)
weekday=(weekday+month_days(i,year))%7; /* 计算本年某月的第一天是星期几 */
return weekday;
}
/* 打印某月打一天以前的空格函数,weekday 为该月第一天的星期 */
void print_space(int weekday)
{
int i;
for(i=0;i<weekday;i++)
printf(" "); /* 一次打印三个空格 */
}
/* 判断是否为闰年 */
int is_leapyear(int year)
{
return (((year%4==0)&&(year%100==0)) || (year%400==0));
}
输入2006的时候,输出的结果不对,例如:2006年1月1日是星期日,但是它输出的是星期4.我觉得是计算year年month月第一天是星期几的函数没写对,但是不知道怎么改,麻烦懂的人指教一下。。。谢谢