VC编译实现万年历的输出
具体功能:输入任意年份,输出日历(主要是对其星期的排列问题)。
主要算法:基姆拉尔森计算公式(计算任意日期的星期 )
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7+1。
具体实现方面:
先预备月份(注意闰年,加上闰年判断函数),
最需注意的是日期输出部分的问题,真正的实现就是靠输出间隔来进行星期的确定。
代码:
#include
#include
#include
#include
#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
{
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;
}
调试结果: