打印一年内任意月份的日历(C语言)

题目要求: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即可。

欢迎交流探讨。
谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_44009743/article/details/84880943