UIT2024_Calendar/stu2024/数技2402季界通.cpp
2024-12-07 16:23:34 +08:00

360 lines
8.5 KiB
C++

#include <stdio.h>
#include <stdlib.h>
/*闰年函数*/
int isLeapYear(int year)
{
if (year == 1582)
{
return 0;
}
return ((year % 4 == 0 && year % 100!= 0) || (year % 400 == 0));
}
int getFirstDayOfYear(int year)
{
int d = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
if (year > 1582)
{
if (year == 1583)
{
d -= 10;
}
}
return d % 7;
}
/*计算给定日期是星期几的函数*/
int getDayOfWeek(int year, int month, int day)
{
int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
if (month < 3)
{
year--;
}
return (year + year / 4 - year / 100 + year / 400 + t[month - 1] + day) % 7;
}
/*单列日历函数*/
int danlie(int year)
{
int c[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if((year%4==0&&year%100!=0)||year%400==0)
c[1]++;
int sum=(year-1)*365;
if(year>1582)
sum-=10;
for(int i=1;i<year;i++)
if((i%4==0&&i%100!=0)||i%400==0)
sum++;
int b=sum%7;
int a1[7]={4,5,6,7,1,2,3};
int fd=a1[b];
if(year==1582)
{
for(int y=1;y<=12;y++)
{
printf("\n\n%18d-%d\n",year,y);
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
for(int z=1;z<=fd;z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
if(y==10&&x==5)
{
x=15;
fd=5;
}
if(fd==7)
{
fd=0;
printf("\n");
}
printf("%5d",x);
fd++;
}
}
}
else
{
for(int y=1;y<=12;y++)
{
printf("\n\n%18d-%d\n",year,y);
printf(" Sun Mon Tue Wed Thu Fri Sat\n");
for(int z=1;z<=fd;z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
if(fd==7)
{
fd=0;
printf("\n");
}
printf("%5d",x);
fd++;
}
}
}
printf("\n");
}
/*双列日历函数*/
int shuanglie(int a)
{
int c[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if((a%4==0&&a%100!=0)||a%400==0)
c[1]++;
int sum=(a-1)*365;
if(a>1582)
sum-=10;
for(int i=1;i<a;i++)
if((i%4==0&&i%100!=0)||i%400==0)
sum++;
int b=sum%7;
int a1[7]={4,5,6,7,1,2,3};
int fd=a1[b],d1,d2;
int m[12];
for(int x=0;x<12;x++)
{
if(x==0)
m[0]=fd;
else if(x==1)
m[1]=(fd+31)%7;
else
m[x]=(m[x-1]+c[x-1])%7;
} //这个月第一天=上个月的第一天加上上个月的天数再除以七
if(a==1582)
{
for(int y=1;y<12;y+=2)
{
int r=0;
d1=m[y-1],d2=m[y];
printf("\n\n%18d-%d %5d-%d\n",a,y,a,y+1);
printf(" Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat\n");
for(int z=1;z<=m[y-1];z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
int z,l;
if(x==1)
z=1;
printf("%5d",x);
d1++;
if(x==c[y-1])
for(d1;d1<7;d1++)
printf(" ");
if(d1==7)
{
d1=0;
printf(" ");
if(x<8) //这边是为了让第一行只有一天的情况正常输出
{
d2=m[y];
for(int z=1;z<=d2;z++)
printf(" ");
}
for(l=z;l<=c[y];l++)
{
if(y==9&&l==5)
{
l=15;
d2=5;
}
if(l==c[y]&&r!=0)
break;
else if(l==c[y]&&r==0)
r++; //让1582正常输出
printf("%5d",l);
d2++;
if(d2==7)
{
z=l+1;
d2=0;
if(x==c[y-1]&&z<c[y])
{
printf("\n");
printf(" ");
for(z;z<=c[y];z++)
printf("%5d",z);
}
break;
}
}
printf("\n");
}
}
for(int z=1;z<=m[y+1];z++)
printf(" \n");
}
}
else
{
for(int y=1;y<12;y+=2) //y代表月份
{
int r=0;
d1=m[y-1],d2=m[y]; //d1代表单数月的第一天 d2代表双数月的第一天
printf("\n\n%18d-%d %5d-%d\n",a,y,a,y+1);
printf(" Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat\n");
for(int z=1;z<=m[y-1];z++)
printf(" ");
for(int x=1;x<=c[y-1];x++)
{
int z,l;
if(x==1)
z=1;
printf("%5d",x);
d1++;
if(x==c[y-1])
for(d1;d1<7;d1++)
printf(" ");
if(x==c[y-1]&&d2!=0)
break;
if(d1==7)
{
d1=0;
printf(" ");
if(x<8)
{
d2=m[y];
for(int z=1;z<=d2;z++)
printf(" ");
}
for(l=z;l<=c[y];l++) //l为偶数月日期
{
printf("%5d",l);
d2++;
if(x==c[y-1]&&l<c[y]&&d2==7)
{
printf("\n");
for(int v=z+7;v<=c[y];v++)
printf(" %5d",v);
printf("\n");
break;
}
if(d2==7)
{
z=l+1;
d2=0;
break;
}
}
printf("\n");
}
}
for(int z=1;z<=m[y+1];z++)
printf(" \n");
}
}
return 0;
}
void ShowMenu()
{
printf("1.公主是想查询某天是星期几及该年是否是闰年吗?\n\n");
printf("2.公主是想输出某一年的日历吗?(单列)\n\n");
printf("3.公主是想输出某一年的日历吗?(双列)\n\n");
printf("4.公主是想退出吗?\n\n");
printf("公主请输入你的选择: ");
}
int main()
{
int choice;
do {
ShowMenu();
if (scanf("%d", &choice)!= 1)
{
printf("你要不看看你输的是啥?重输!!\n");
while (getchar()!= '\n');
continue;
}
switch (choice)
{
case 1:
{
int year, month, day;
printf("请输入年 月 日(用空格隔开): ");
if (scanf("%d %d %d", &year, &month, &day)!= 3)
{
printf("啊哦 输入不对哦,请重新输入正确的年、月、日。\n");
while (getchar()!= '\n');
continue;
}
int weekday = getDayOfWeek(year, month, day);
printf("%d年%d月%d日是星期", year, month, day);
switch (weekday)
{
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(""); break;
}
printf(" , ");
if (isLeapYear(year))
{
printf("%d是闰年\n", year);
}
else
{
printf("%d不是闰年\n", year);
}
break;
}
case 2:
{
int year;
printf("公主请输入年份: ");
if (scanf("%d", &year)!= 1)
{
printf("你要不看看你输的是啥,请重输正确的年份!!\n");
while (getchar()!= '\n');
continue;
}
danlie(year);
break;
}
case 3:
{
int a;
printf("公主请输入年份吧: ");
if (scanf("%d", &a)!= 1)
{
printf("你要不看看你输的是啥,重输正确的年份!!\n");
while (getchar()!= '\n');
continue;
}
shuanglie(a);
break;
}
case 4:
printf("退出程序\n");
break;
default:
printf("你要不看看你输的是啥?重输!!\n");
}
} while (choice!= 4);
return 0;
}