请打印出任意年份的日历
这个题目理解起来很简单,也没什么高深的算法,就是有一点点“啰嗦”。
#include <stdio.h>
int print_mon(int year,int mon ,int week)
{
int day;
int i;
if(mon < 1 || mon > 12 || week < 0 || week > 6)//出现不可能的值退出程序
{
exit(1);
}
switch(mon) //每个月的日期不同
{
case 1:
{
printf("1\n");
day = 31;
break;
}
case 2:
{
printf("2\n");
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
day = 29;
}
else
{
day = 28;
}
break;
}
case 3:
{
printf("3\n");
day = 31;
break;
}
case 4:
{
printf("4\n");
day = 30;
break;
}
case 5:
{
printf("5\n");
day = 31;
break;
}
case 6:
{
printf("6\n");
day = 30;
break;
}
case 7:
{
printf("7\n");
day = 31;
break;
}
case 8:
{
printf("8\n");
day = 31;
break;
}
case 9:
{
printf("9\n");
day = 30;
break;
}
case 10:
{
printf("10\n");
day = 31;
break;
}
case 11:
{
printf("11\n");
day = 30;
break;
}
case 12:
{
printf("12\n");
day = 31;
break;
}
default:
{
exit(1);
}
}
printf("Sun Mon Tue Wed Thu Fir Sat\n");
for(i = 0;i < week * 4;i++)//判断第一天星期几,输出空格
{
printf(" ");
}
for(i = 1;i <= day;i++)
{
if(i < 10)//对齐
{
printf(" ");
}
printf("%d ",i);
if((i + week - 1) % 7 == 6)//输出周六后换行
{
printf("\n");
}
}
printf("\n\n");
return (day + week) % 7;//返回下个月第一天星期几
}
int main()
{
int year;
int mon;
int week;
printf("please input the year\n");
scanf("%d",&year);
week = (year + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 ) % 7;//本年第一天星期几
for(mon = 1;mon <= 12;mon++)//12个月循环
{
week = print_mon(year,mon,week);
}
return 0;
}
这个程序理解起来简单,但总觉得会有更好的算法。
一个在努力中的未来程序员,如果有更好的想法,欢迎评论。