这个程序最核心的地方在于计算当前日期是周几,然后才好显示万年历,因为输入只知道月,所以默认是1号。
通过这个日期我们就可以计算总天数,通过总天数进行%7运算,就能得到周几。
通过这个周几,在结合这个月有多少天,就能输出万年历了。
再一个难点就是输出格式。需要进行对其。
看代码:
void showWNL(int i_begin,int days)
{printf("*************************************\n");printf("MON TUE WEN THU FRI STA SUN \n");int i_index=i_begin;for(int i=0;i<i_begin*5;++i)printf(" ");for(int i=1;i<=days;++i){if(i_index==7){printf("\n");i_index=0;}if(i<10){printf("%d ",i);}else{printf("%d ",i);}i_index++;}printf("\n*************************************\n");}int main(int argc, char *argv[])
{//万年历int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};int year,month;char split;printf("请输入要查看的年月\n");scanf("%d%c%d",&year,&split,&month);if(year%400==0||(year%4==0&&year%100!=0))months[1]=29;elsemonths[1]=28;int sum=1;for(int i=1;i<month;++i){sum+=months[i-1];}for(int i=1;i<year;++i){sum+=365;if(i%400==0||(i%4==0&&i%100!=0))sum++;}//根据sum进行判断周几int day=sum%7;int i_start=0;switch(day){case 0:i_start=6;break;case 1:i_start=0;break;case 2:i_start=1;break;case 3:i_start=2;break;case 4:i_start=3;break;case 5:i_start=4;break;case 6:i_start=5;break;}showWNL(i_start,months[month-1]);
}
与正常日历显示一致。