这 个万年历有能用上下左右键来控制几号的改变和年份的改变!希望网友测出bug来!
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//判断是否为闰年
int Leap(int y)
{
int s=0;
if((y%4==0)&&(y%100!=0)||(y%400==0))
{
s=1;
}
return s;
}
int yue(int a,int b)
{
int d=0;
switch(b)
{
case 1: d=31 ;break;
case 2: d=Leap(a)==1?29:28;break;
case 3: d=31;break;
case 4: d=30;break;
case 5: d=31;break;
case 6: d=30;break;
case 7: d=31;break;
case 8: d=31;break;
case 9: d=30;break;
case 10: d=31;break;
case 11: d=30;break;
case 12: d=31;break;
default :printf("输入的月份有误!\n");
}
return d;
}
void face(int a,int b,int s,int h)
//a是一个月前偏移量(空格数),b是几月,s=1表示是闰年,s=0表示是平年
//h是几号
{
int c=a;//c用来保存空格数
int d=0;//用来表示是几月的
printf(" Su Mo Tu We Th Fr Sa\n");
while(a--)
{
printf(" ");
}
switch(b)
{
case 1: d=31 ;break;
case 2: d=s==1?29:28;break;
case 3: d=31;break;
case 4: d=30;break;
case 5: d=31;break;
case 6: d=30;break;
case 7: d=31;break;
case 8: d=31;break;
case 9: d=30;break;
case 10: d=31;break;
case 11: d=30;break;
case 12: d=31;break;
default :printf("输入的月份有误!\n");
}
if(h<=d)
{
for(int i=1;i<=d;i++)
{
if(i==h)//输入的几号
{
printf("[%2d]",i);
}
else
{
printf(" %2d ",i);
}
if((c+i)%7==0)
{
printf("\n");
}
}
}
else
{
printf("输入的天数错误!\n");
}
}
int xiqi(int a,int b)
//计算输入的年月的第一天,例如:2013年11月1号是星期几,也就是万年历上的偏移量
{
int p=0;//偏移量
int r=0,s=0;//分别表示闰年的个数和平年的个数
//int d=0;//存放月的月的天数
for(int i=1910;i<a;i++)
//这里是把1910年1月1号作为一个标准,它是星期六
{
if(Leap(i)==1)
{
r++;
}
else
{
s++;
}
}
// p=(366*r+365*s+6)%7;
//这里加6是1990,1,1为星期六
switch(b)
{
case 1: p=(366*r+365*s+6)%7;break;
case 2: p=(366*r+365*s+6+31)%7;break;
case 3: p=(366*r+365*s+6+(Leap(a)==1?29:28))%7;break;
case 4: p=(366*r+365*s+6+31)%7;break;
case 5: p=(366*r+365*s+6+30)%7;break;
case 6: p=(366*r+365*s+6+31)%7;break;
case 7: p=(366*r+365*s+6+30)%7;break;
case 8: p=(366*r+365*s+6+31)%7;break;
case 9: p=(366*r+365*s+6+31)%7;break;
case 10: p=(366*r+365*s+6+30)%7;break;
case 11: p=(366*r+365*s+6+31)%7;break;
case 12: p=(366*r+365*s+6+30)%7;break;
}
return p;
}
int main()
{
int a=0,b=0,c=0;
char s='y';
char o;
while(s=='y'||s=='Y')
{
printf("请输入年月日,格式为:(1992 11 29):\n");
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
printf("%d-%d-%d\n",a,b,c);
face(xiqi(a,b),b,Leap(a),c);
while(o!='a')
{
printf("\n你可以按上下左右键来控制万年历哦!\n");
getch();
o=getch();
if(o==0x4b) //左键
{
if(c==1&&b==1)
{
printf("%d-%d-%d\n",a-1,12,yue(a,b));
a--;
b=12;
face(xiqi(a,b),b,Leap(a), yue(a,b));
c=yue(a,b);
}
else
{
if(c==1)
{
printf("%d-%d-%d\n",a,b-1,yue(a,b));
b--;
face(xiqi(a,b),b,Leap(a), yue(a,b));
c=yue(a,b);
}
else
{
printf("%d-%d-%d\n",a,b,c-1);
face(xiqi(a,b),b,Leap(a),--c);
}
}
}
else if(o==0x4d) //右键
{
if(c==yue(a,b)&&b==12)
{
printf("%d-%d-%d\n",a+1,1,1);
a++;
b=1;
face(xiqi(a,b),b,Leap(a),1);
c=1;
}
else
{
if(c==yue(a,b))
{
printf("%d-%d-%d\n",a,b+1,1);
b++;
face(xiqi(a,b),b,Leap(a),1);
c=1;
}
else
{
printf("%d-%d-%d\n",a,b,c+1);
face(xiqi(a,b),b,Leap(a),++c);
}
}
}
else if(o==0x48)
{
a--;
printf("%d-%d-%d\n",a,b,c);
face(xiqi(a,b),b,Leap(a),c);
}
else if(o==0x50)
{
a++;
printf("%d-%d-%d\n",a,b,c);
face(xiqi(a,b),b,Leap(a),c);
}
else if(o=='a')
{
break;
}
}
printf("\n还想继续查询吗?(是(y),否(n)):\n");
s=getch();
}
system("Pause");
return 0;
}