初学,C语言日历制作

VC编译实现万年历的输出

具体功能:输入任意年份,输出日历(主要是对其星期的排列问题)。

主要算法:基姆拉尔森计算公式(计算任意日期的星期 )

W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7+1

具体实现方面:

先预备月份(注意闰年,加上闰年判断函数),

最需注意的是日期输出部分的问题,真正的实现就是靠输出间隔来进行星期的确定。

代码:

#include <graphics.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>

#define PI 3.1415926535

int week_analysis(int y,int m,int d)				//计算星期
{
	 /*基姆拉尔森计算公式
	W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7计算任意日期的星期 */
	if(m==1||m==2)
	{
		y-=1;
		m+=12;
	}
	return((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1);
}
int leap_year(int y)				//闰年判断函数
{
	return(y%4==0&&y%100||y%400==0);
}
void printmonth(int j)
{ 
	switch(j+1)				//注意j的数值问题                                         
	{
	case 1:
		printf("Jan\n");break;
	case 2:
		printf("Feb\n");break;
	case 3:
		printf("Mar\n");break;
	case 4:
		printf("Apr\n");break;
	case 5:
		printf("May\n");break;
	case 6:
		printf("Jun\n");break;
	case 7:
		printf("Jul\n");break;
	case 8:
		printf("Aug\n");break;
	case 9:
		printf("Sep\n");break;
	case 10:
		printf("Oct\n");break;
	case 11:
		printf("Nov\n");break;
	case 12:
		printf("Dec\n");break;
	}
}





int main()
{
	int y;
	int date[2][12]={{31,28,31,30,30,30,31,31,30,31,30,31},
	{31,28,31,30,3,30,31,31,30,31,30,31}};				//储存两组月份数据(闰年)
	int i=0,j=0,k=0,mv,l;								//mv为偏移量
	printf("Please input the year whose calendar you want to know: ");
	scanf("%d",&y);
	i=leap_year(y);
	printf("---------the calendar of %d  ------------\n",y);
	printf("  MON TUE WED THU FRI SAT SUN \n");
	for(j=0;j<=12;j++)
	{
		mv=week_analysis(y,j+1,1);				//注意j的数值问题                          
		printmonth(j);
		for(l=1;l<mv;l++)
		{
			printf("    ");
		}
		for(k=1;k<=date[i][j];k++)
		{
			printf("%4d",k);						//注意输出本身的偏移量
			if((mv+k-1)%7==0) 
			{
				printf("\n");
			}
		}
		printf("\n");
	}
	printf("Press any key to end.\n");
	_getch();
	return 0;
}


调试结果:



初学,C语言日历制作_第1张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C语言)