题目要求:2007年1月1日为星期一,编写一个函数,输出2007年任意月份的日历
这道题我是个人的做法,有个别地方可能有些绕。
#include<stdio.h>
int main()
{
int month,WEEKDAY,count,month_days,width;
int isWhatDay(int month); //声明计算的函数
printf("Please enter a month:\n");
scanf("%d",&month);
WEEKDAY = isWhatDay(month); //将函数返回值赋给WEEKDAY
printf("Calendar 2007 - %d\n",month);
printf("----------------------------\n");
printf(" Su Mo Tu We Th Fr Sa\n"); //空白处是两个空格
//下面是赋各个月份的天数
if(month == 1||month == 3||month == 5||month == 7||month ==8||month == 10||month == 12)
month_days = 31;
else if(month == 2)
month_days = 28;
else
month_days = 30;
width = 4 * WEEKDAY;
/*此处计算width可能一开始看不懂,实际上是为了打印空格,
空格不printf到第一天的前一位是因为下面输出是%4d,其前三位是空格了。*/
for(count = 1;count <= width;count++)
printf(" ");
for(count = 1;count <= month_days;count++)
{
printf("%4d",count);
if(WEEKDAY + (count - 1) % 7 == 6)
//这个if是因为到星期六就换行所以我从这个出发写出的等式
printf("\n");
}
printf("\n----------------------------\n");
return 0;
}
int isWhatDay(int month)
{
int weekday,distance;
int days = 0;
switch(month)
/*没有break,是为了求出输入月份的第一天的前一天
距这一年第一天有多少天,以便打出相应空格*/
{
case 12: days += 30;
case 11: days += 31;
case 10: days += 30;
case 9: days += 31;
case 8: days += 31;
case 7: days += 30;
case 6: days += 31;
case 5: days += 30;
case 4: days += 31;
case 3: days += 28;
case 2: days += 31; //注意:没有1月。
}
distance = days % 7;
switch(distance) //余0即表明上个月最后一天即星期一,余6即星期六
{
case 0: weekday = 1; break;
case 1: weekday = 2; break;
case 2: weekday = 3; break;
case 3: weekday = 4; break;
case 4: weekday = 5; break;
case 5: weekday = 6; break;
case 6: weekday = 0; break;
}
return weekday; //return打印相应空格
}
另外,加上年份其实也不难,仅需要加上个闰年判断,int i = 0; 二月是28 + i;如果是闰年i = 1即可。
欢迎交流探讨。
谢谢。