C語言:已知任意的年份和月份顯示當月的日曆

已知任意的年份和月份顯示日曆表

根據基姆拉爾森計算公式,算法如下:
w = (day+2month+3(month-1)/5+year+year/4-year/100+year/400)%7;

解釋:公式中的日期中的日數,month表示日期中的月份數,year代表日期中的年份數
其中:公元元年爲參考,公元元年1月1日爲星期一,把1月和2月看成上一年的十三月和是四月

代碼如下:

#include <stdio.h>
#include <stdlib.h>

//判斷是否閏年
int leapyear(int year)
{
	if((year % 4 ==0 && year % 100 !=0)||year %400 == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int main(void)
{
	int year,month;
	printf("input year:");
	scanf("%d",&year);
	printf("input month:");
	scanf("%d",&month);
	if(month == 1||month == 2)
	{
		month += 12;
		year--;
	}

	//每月的天數隨月份的不同而不同
	int daycount = 0;
	switch(month)
	{
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
	case 13:
		daycount = 31;
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		daycount = 31;
		break;
	case 14:
		{
			if(leapyear(year))
			{
				daycount = 29;
			}
			else
			{
				daycount = 28;
			}
			break;
		}
	default:
		break;
	}

	
	int blank = 0;
	blank = (1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
	if(month > 12)
	{
		month = month -12;
		year++;
	}
	printf("-------------------%d,%d----------------\n",year,month);
	printf("Mon\tTue\tWed\tThr\tFri\tSat\tSun\n");
	int i = 0;
	for(i = 0;i<blank;i++)
	{
		printf("\t");
	}


	for(i = 1;i<=daycount;i++)
	{
		printf("%d\t",i);
		if((i+blank)%7 == 0)
		{
			printf("\n");
		}
	}

}

總結:分清楚每月的1號是星期幾即可。所以算法:
w = (day+2month+3(month-1)/5+year+year/4-year/100+year/400)%7;中的 day = 1.即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章