这个程序最核心的地方在于计算当前日期是周几,然后才好显示万年历,因为输入只知道月,所以默认是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;
else
months[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]);
}
与正常日历显示一致。