我挑了第二个试着写了一下,但最后的数对不太整齐,搞了很久也搞不好。
重要是从 2000年1月1日为星期六 这个条件求出输入年份的1月1号是星期几,要注意考虑是否是闰年。
程序代码:
#include<stdio.h>
#define N 6
#define M 2000
void MAX_Day(int);
int Day; //存放总的天数
int main(void)
{
int year,week = N,y = M; //week是用于表示星期几 0表示星期天。
int i ,num, month, da, row = 0; //row是由于判断换行的
printf("请输入年份:");
scanf("%d",&year);
if(year >= y)
{
while(y < year)
MAX_Day(y++);
week = (Day+N)%7; //求出该年1月1号是星期几(大于2000的求法)
}
else
{
while(year < y)
MAX_Day(year++);
week = Day%7;
week = (6-week)%7;//求出该年1月1号是星期几(小于2000的求法)
}
for(month = 1; month <= 12; month++)
{
printf("\n\n %d 月份\n",month);
printf("Monday Tuesday Wednesday Thursday Friday Saturday Sunday \n");
if(0 == week) week = 7; //week==0 的话代表1号是星期日,所以把7放入week中
for(num = 1; num < week ; num++)
row += printf(" "); //9个空格的位置,printf返回值用于判断什么时候换行
switch(month)
{
case 1: da = 31;break;
case 3: da = 31;break;
case 5: da = 31;break;
case 7: da = 31;break;
case 8: da = 31;break;
case 10: da = 31;break;
case 12: da = 31; break;
case 2: if((year%4 == 0 && year%100 != 0 )|| year%400 == 0)
da = 29;
else
da = 28;
break;
default: da = 30;
}
for(i =1; i <= da; ++i)
{ row += printf("%-d ",i);//八个空格
if(row >= 63) //判断换行
{row = 0;printf("\n");}
}
week = (week+da)%7; //取得下个月1号是星期几
row = 0;
}
return 0;
}
void MAX_Day(int year)
{
if((year%4 == 0 && year%100 != 0 )|| year%400 == 0)
Day += 366;
else
Day += 365;
return;
}
写的不怎么好,你可参考一下。不过我不懂怎么把数据完全对齐,我是通过printf函数返回值开判断什么时候换行的,不怎么准确。你自己可以改进一下。