219 lines
3.8 KiB
C++
219 lines
3.8 KiB
C++
#include<stdio.h>
|
|
#include<stdlib.h>
|
|
void caidan(void)
|
|
{
|
|
printf("1.查询对应年份的日历\n");
|
|
printf("2.查询对应日期的星期\n");
|
|
printf("3.查询对应年份是否为闰年\n");
|
|
printf("4.退出\n\n");
|
|
}
|
|
int fang()
|
|
{
|
|
int t;
|
|
while(scanf("%d",&t)!=1)
|
|
{
|
|
printf("请重新输入\n");
|
|
while(getchar()!='\n');
|
|
}
|
|
return t;
|
|
}
|
|
void riqi()
|
|
{
|
|
int y,m,d,q,xingqi;
|
|
printf("请输入日期:");
|
|
scanf("%d",&y);
|
|
scanf("%d",&m);
|
|
scanf("%d",&d);
|
|
if(y<1||y>10000||m<1||m>12||d<1||((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&d>31)||((m==4||m==6||m==9||m==11)&&d>30)||(m==2&&d>29))
|
|
{
|
|
printf("请重新输入\n");
|
|
while(scanf("%d",&y)!=1||scanf("%d",&m)!=1||scanf("%d",&d)!=1)
|
|
{
|
|
printf("请重新输入\n");
|
|
while(getchar()!='\n');
|
|
}
|
|
}
|
|
|
|
xingqi=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
|
|
xingqi++;
|
|
switch(xingqi)
|
|
{
|
|
case 1:printf("星期一");break;
|
|
case 2:printf("星期二");break;
|
|
case 3:printf("星期三");break;
|
|
case 4:printf("星期四");break;
|
|
case 5:printf("星期五");break;
|
|
case 6:printf("星期六");break;
|
|
case 7:printf("星期日");break;
|
|
}
|
|
}
|
|
int runnian()
|
|
{
|
|
int year;
|
|
printf("请输入查询的年份:");
|
|
year=fang();
|
|
if(year<0||year>100)
|
|
{
|
|
printf("请重新输入\n");
|
|
year=fang();
|
|
}
|
|
if((year%4==0&&year%100!=0)||year%400==0)
|
|
printf("%d年是闰年",year);
|
|
else
|
|
printf("%d年不是闰年",year);
|
|
return year;
|
|
}
|
|
int yihao(int year,int month)
|
|
{
|
|
if(month<3)
|
|
{
|
|
year--;
|
|
month+=12;
|
|
}
|
|
int d=(1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
|
|
d++;
|
|
return d;
|
|
}
|
|
|
|
int danrili(int year)
|
|
{
|
|
int month;
|
|
int x,n,s;
|
|
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
|
|
if((year%100!=0&&year%4==0)||year%400==0)
|
|
{
|
|
a[2]=29;
|
|
}
|
|
for(month=1;month<=12;month++)
|
|
{
|
|
printf("%2d月\n",month);
|
|
printf(" 日 一 二 三 四 五 六\n");
|
|
x=yihao(year,month);
|
|
if(year==1582&&month==10)
|
|
x=1;
|
|
for(int i=0;i<x;i++)
|
|
{
|
|
if(x!=7)
|
|
printf(" ");
|
|
}
|
|
for(int j=1;j<=a[month];j++)
|
|
{
|
|
printf("%3d",j);
|
|
if(year==1582)
|
|
{
|
|
if(month==10)
|
|
{
|
|
if(j==4)
|
|
j+=10;
|
|
if(j==16||j==23||j==30||j==a[month])
|
|
{
|
|
printf("\n");
|
|
}
|
|
}
|
|
else if((j+x)%7==0||j==a[month])
|
|
{
|
|
printf("\n");
|
|
}
|
|
}
|
|
else if((j+x)%7==0||j==a[month])
|
|
{
|
|
printf("\n");
|
|
}
|
|
}
|
|
printf("\n");
|
|
printf("\n");
|
|
}
|
|
}
|
|
int shuangrili(int year)
|
|
{
|
|
int month;
|
|
int z,x,c,v,b,k,j;
|
|
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
|
|
if((year%100!=0&&year%4==0)||year%400==0)
|
|
{
|
|
a[2]=29;
|
|
}
|
|
for(month=1;month<=12;month+=2)
|
|
{
|
|
int y1=1,y2=1;
|
|
z=yihao(year,month);
|
|
x=yihao(year,month+1);
|
|
c=(a[month]+z-1)/7+1;
|
|
v=(a[month+1]+x-1)/7+1;
|
|
if(z==7)
|
|
z=0;
|
|
if(x==7)
|
|
x=0;
|
|
if(c>v)
|
|
b=c;
|
|
else
|
|
b=v;
|
|
printf(" %2d月 %2d月\n",month,month+1);
|
|
printf(" 日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
|
|
for(j=0;j<b;j++)
|
|
{
|
|
for(int i=0;i<7;i++)
|
|
{
|
|
if(j==0&&i<z)
|
|
printf(" ");
|
|
else if(y1<=a[month])
|
|
printf("%3d",y1++);
|
|
else
|
|
printf(" ");
|
|
}
|
|
printf(" ");
|
|
for(int i=0;i<7;i++)
|
|
{
|
|
if(j==0&&i<x)
|
|
printf(" ");
|
|
else if(y2<=a[month+1])
|
|
printf("%3d",y2++);
|
|
else
|
|
printf(" ");
|
|
}
|
|
printf("\n");
|
|
}
|
|
}
|
|
printf("\n");
|
|
return b;
|
|
}
|
|
int rili()
|
|
{
|
|
int p,o;
|
|
printf("请输入年份:");
|
|
while(scanf("%d",&p)!=1||p<0||p>10000)
|
|
{
|
|
printf("请重新输入\n");
|
|
while(getchar()!='\n');
|
|
}
|
|
printf("单列输出1\n双列输出2\n");
|
|
while(scanf("%d",&o)!=1||o<1||o>2)
|
|
{
|
|
printf("请重新输入\n");
|
|
while(getchar()!='\n');
|
|
}
|
|
switch(o)
|
|
{
|
|
case 1:danrili(p);break;
|
|
case 2:shuangrili(p);break;
|
|
}
|
|
}
|
|
int main()
|
|
{
|
|
int n,year,month,day;
|
|
caidan();
|
|
while(scanf("%d",&n)!=1||n<1||n>4)
|
|
{
|
|
printf("请重新输入\n");
|
|
while(getchar()!='\n');
|
|
}
|
|
switch(n)
|
|
{
|
|
case 1:rili();break;
|
|
case 2:riqi();break;
|
|
case 3:runnian();break;
|
|
case 4:break;
|
|
}
|
|
return 0;
|
|
}
|