455 lines
7.8 KiB
C++
455 lines
7.8 KiB
C++
#include<stdio.h>
|
||
|
||
|
||
int run (int y);
|
||
void search (void);
|
||
int pand(int a,int b,int c);
|
||
void input(int *a,int *b,int *c);
|
||
void rls(void);
|
||
void rld (void);
|
||
void choice(void);
|
||
|
||
int main ()
|
||
{
|
||
int xz;
|
||
printf("请选择所需要的功能:\n");
|
||
printf("1.查询某年某月某日为星期几,并判断是否为闰年\n");
|
||
printf("2.输出这一年的日历\n");
|
||
printf("请输入:1 or 2\n");
|
||
scanf("%ld",&xz);
|
||
if (xz==1)
|
||
search();
|
||
else if (xz==2)
|
||
choice();
|
||
else
|
||
printf("输入有误请重开");
|
||
|
||
}
|
||
|
||
//输入年月日并判断
|
||
void input( int *pa,int *pb,int *pc)
|
||
{
|
||
printf("请输入年:\n");
|
||
scanf("%ld",pa);
|
||
printf("请输入月:\n");
|
||
scanf("%ld",pb);
|
||
printf("请输入日:\n");
|
||
scanf("%ld",pc);
|
||
}
|
||
|
||
|
||
//((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7
|
||
|
||
int run(int x)
|
||
{
|
||
if((x%4)==0&&(x%100)!=0||(x%400)==0)
|
||
return 1;
|
||
else
|
||
return 0;
|
||
}
|
||
|
||
|
||
//判断输入是否有误
|
||
int pand(int a,int b,int c)
|
||
{
|
||
int i=0;
|
||
int j[12]={31,28,31,30,31,30,31,31,30,31,30,31};
|
||
if(a>0&&a<99999)
|
||
i=0;
|
||
else
|
||
i=-1;
|
||
if(b>=1&&b<=12)
|
||
i=0;
|
||
else
|
||
i=-1;
|
||
if(run(a))
|
||
j[2]=29;
|
||
if(j[b-1]>=c&&j[b-1]>=1)
|
||
i=0;
|
||
else
|
||
i=-1;
|
||
return i;
|
||
}
|
||
|
||
//查询某年某月某日为星期几,并判断是否为闰年
|
||
void search()
|
||
{
|
||
int year,mouth,day;
|
||
|
||
input(&year,&mouth,&day);
|
||
int a,b,c;
|
||
b=mouth;
|
||
c=day;
|
||
char s[10];
|
||
a=pand(year,mouth,day);
|
||
if(a==-1)
|
||
printf("输入有误,请重开");
|
||
else
|
||
{
|
||
int i=0,j=year/100,y=year%100;
|
||
if(year<1582||year==1582&&mouth<10||year==1582&&mouth==10&&c<3)
|
||
{
|
||
if(mouth==1||mouth==2)
|
||
{
|
||
mouth+=12;
|
||
y--;
|
||
}
|
||
i=(y+(y/4)+(j/4)-2*j+(13*(b+1)/5)+c+2)%7;
|
||
}
|
||
else
|
||
{
|
||
if(mouth==1||mouth==2)
|
||
{
|
||
mouth+=12;
|
||
y--;
|
||
}
|
||
i=((j/4)-2*j+y+(y/4)+(13*(b+1)/5)+c-1)% 7;
|
||
}
|
||
|
||
switch(i)
|
||
{
|
||
case 0:printf("是星期日");break;
|
||
case 1:printf("是星期一");break;
|
||
case 2:printf("是星期二");break;
|
||
case 3:printf("是星期三");break;
|
||
case 4:printf("是星期四");break;
|
||
case 5:printf("是星期五");break;
|
||
case 6:printf("是星期六");
|
||
}
|
||
if(run(year))
|
||
printf("\n今年是闰年");
|
||
else
|
||
printf("\n今年不是闰年");
|
||
}
|
||
|
||
return ;
|
||
}
|
||
void choice()
|
||
{
|
||
int s;
|
||
printf("请选择输出格式\n");
|
||
printf("1.单列 or 2.双列 :");
|
||
scanf("%ld",&s);
|
||
printf("\n");
|
||
if(s==1)
|
||
rld();
|
||
else if(s==2)
|
||
rls();
|
||
else
|
||
printf("输入有误请重开");
|
||
}
|
||
|
||
//输出这一年的日历
|
||
void rld()
|
||
{
|
||
int year,mouth,day;
|
||
input(&year,&mouth,&day);
|
||
|
||
//printf("请选择")
|
||
int u=pand(year,mouth,day);
|
||
if(u==-1)
|
||
printf("输入有误,请重开");
|
||
else
|
||
{
|
||
|
||
int i,j,n=0,leap;
|
||
leap=(year%4==0&&year%100!=0)||(year%100==0);
|
||
int k=year/100,y=(year%100)-1;
|
||
if(year<=1582)
|
||
{
|
||
n=(y+(y/4)+(k/4)-2*k+(13*14/5)+3)%7;
|
||
}
|
||
else
|
||
{
|
||
n=((k/4)-2*k+y+(y/4)+(13*14/5))% 7;
|
||
}
|
||
|
||
//printf("%d",n);
|
||
|
||
for(mouth=1;mouth<=12;mouth++)
|
||
{
|
||
switch(mouth)
|
||
{
|
||
case 1:
|
||
day=31;
|
||
printf("一月\t\t%d\n",year);
|
||
break;
|
||
case 2:
|
||
if(leap)
|
||
day=29;
|
||
else
|
||
day=28;
|
||
printf("二月\t\t%d\n",year);
|
||
break;
|
||
case 3:
|
||
day=31;
|
||
printf("三月\t\t%d\n",year);
|
||
break;
|
||
case 4:
|
||
day=30;
|
||
printf("四月\t\t%d\n",year);
|
||
break;
|
||
case 5:
|
||
day=31;
|
||
printf("五月\t\t%d\n",year);
|
||
break;
|
||
case 6:
|
||
day=30;
|
||
printf("六月\t\t%d\n",year);
|
||
break;
|
||
case 7:
|
||
day=31;
|
||
printf("七月\t\t%d\n",year);
|
||
break;
|
||
case 8:
|
||
day=31;
|
||
printf("八月\t\t%d\n",year);
|
||
break;
|
||
case 9:
|
||
day=30;
|
||
printf("九月\t\t%d\n",year);
|
||
break;
|
||
case 10:
|
||
day=31;
|
||
printf("十月\t\t%d\n",year);
|
||
break;
|
||
case 11:
|
||
day=30;
|
||
printf("十一月\t\t%d\n",year);
|
||
break;
|
||
case 12:
|
||
day=31;
|
||
printf("十二月\t\t%d\n",year);
|
||
break;
|
||
|
||
}
|
||
printf("----------------------------------------------------\n");
|
||
printf(" SUN MON TUE WED THD FRI SAT\n");
|
||
|
||
switch(n)
|
||
{
|
||
case 1:
|
||
printf("%5c",'\40');
|
||
break;
|
||
case 2:
|
||
printf("%10c",'\40');
|
||
break;
|
||
case 3:
|
||
printf("%15c",'\40');
|
||
break;
|
||
case 4:
|
||
printf("%20c",'\40');
|
||
break;
|
||
case 5:
|
||
printf("%25c",'\40');
|
||
break;
|
||
case 6:
|
||
printf("%30c",'\40');
|
||
break;
|
||
}
|
||
|
||
for(i=1,j=n;i<=day;i++,j++)
|
||
{
|
||
printf("%5d",i);
|
||
|
||
if(j%7==6)
|
||
printf("\n");
|
||
}
|
||
|
||
n=(n+day)%7;
|
||
printf("\n----------------------------------------------------");
|
||
|
||
printf("\n");
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
void rls()
|
||
{
|
||
int year,mouth,day;
|
||
input(&year,&mouth,&day);
|
||
int u=pand(year,mouth,day);
|
||
if(u==-1)
|
||
printf("输入有误,请重开");
|
||
else
|
||
{
|
||
int i,j,n1=0,leap;
|
||
leap=(year%4==0&&year%100!=0)||(year%100==0);
|
||
int day1,day2;
|
||
int k=year/100,y=(year%100)-1;
|
||
if(year<=1582)
|
||
{
|
||
n1=(y+(y/4)+(k/4)-2*k+(13*14/5)+3)%7;
|
||
}
|
||
else
|
||
{
|
||
n1=((k/4)-2*k+y+(y/4)+(13*14/5))% 7;
|
||
}
|
||
for(mouth=1;mouth<=12;mouth+=2)
|
||
{
|
||
switch(mouth)
|
||
{
|
||
case 1:
|
||
day1=31;
|
||
printf("一月\t\t%d",year);
|
||
if(leap)
|
||
day2=29;
|
||
else
|
||
day2=28;
|
||
printf("\t\t\t\t\t二月\t\t%d\n",year);
|
||
break;
|
||
case 3:
|
||
day1=31;
|
||
printf("三月\t\t%d",year);
|
||
day2=30;
|
||
printf("\t\t\t\t\t四月\t\t%d\n",year);
|
||
break;
|
||
case 5:
|
||
day1=31;
|
||
printf("五月\t\t%d",year);
|
||
day2=30;
|
||
printf("\t\t\t\t\t六月\t\t%d\n",year);
|
||
break;
|
||
case 7:
|
||
day1=31;
|
||
printf("七月\t\t%d",year);
|
||
day2=31;
|
||
printf("\t\t\t\t\t八月\t\t%d\n",year);
|
||
break;
|
||
case 9:
|
||
day1=30;
|
||
printf("九月\t\t%d",year);
|
||
day2=31;
|
||
printf("\t\t\t\t\t十月\t\t%d\n",year);
|
||
break;
|
||
case 11:
|
||
day1=30;
|
||
printf("十一月\t\t%d",year);
|
||
day2=31;
|
||
printf("\t\t\t\t\t十二月\t\t%d\n",year);
|
||
break;
|
||
|
||
}
|
||
printf("--------------------------------------------------------------------------------------------------------\n");
|
||
printf(" SUN MON TUE WED THD FRI SAT\t\t SUN MON TUE WED THD FRI SAT\n");
|
||
|
||
int n2=(n1+day1)%7;
|
||
|
||
switch(n1)
|
||
{
|
||
case 1:
|
||
printf("%5c",'\40');
|
||
break;
|
||
case 2:
|
||
printf("%10c",'\40');
|
||
break;
|
||
case 3:
|
||
printf("%15c",'\40');
|
||
break;
|
||
case 4:
|
||
printf("%20c",'\40');
|
||
break;
|
||
case 5:
|
||
printf("%25c",'\40');
|
||
break;
|
||
case 6:
|
||
printf("%30c",'\40');
|
||
break;
|
||
}
|
||
|
||
int x=1,y=n2;
|
||
for(i=1,j=n1;i<=50;i++)
|
||
{
|
||
if(i<=day1)
|
||
printf("%5d",i);
|
||
if(i==day1)
|
||
{
|
||
switch((n1+day1)%7)
|
||
{
|
||
|
||
case 1:
|
||
printf("%30c",'\40');
|
||
break;
|
||
case 2:
|
||
printf("%25c",'\40');
|
||
break;
|
||
case 3:
|
||
printf("%20c",'\40');
|
||
break;
|
||
case 4:
|
||
printf("%15c",'\40');
|
||
break;
|
||
case 5:
|
||
printf("%10c",'\40');
|
||
break;
|
||
case 6:
|
||
printf("%5c",'\40');
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(j%7==6||i==day1&&x!=day2)
|
||
{
|
||
printf("\t\t");
|
||
if(j==6)
|
||
{
|
||
switch(n2)
|
||
{
|
||
case 1:
|
||
printf("%5c",'\40');
|
||
break;
|
||
case 2:
|
||
printf("%10c",'\40');
|
||
break;
|
||
case 3:
|
||
printf("%15c",'\40');
|
||
break;
|
||
case 4:
|
||
printf("%20c",'\40');
|
||
break;
|
||
case 5:
|
||
printf("%25c",'\40');
|
||
break;
|
||
case 6:
|
||
printf("%30c",'\40');
|
||
break;
|
||
}
|
||
}
|
||
|
||
while(x<=day2)
|
||
{
|
||
printf("%5d",x);
|
||
if(y%7==6)
|
||
{
|
||
x+=1;
|
||
y+=1;
|
||
break;
|
||
}
|
||
x++;
|
||
y++;
|
||
}
|
||
printf("\n");
|
||
}
|
||
|
||
j++;
|
||
|
||
}
|
||
|
||
int temp=n1;
|
||
n1=(n2+day)%7;
|
||
n2=(temp+day)%7;
|
||
printf("\n--------------------------------------------------------------------------------------------------------\n");
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|