UIT2024_Calendar/stu2024/计科2402 胡深然.cpp
2024-12-07 16:23:34 +08:00

455 lines
7.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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");
}
}
}