360 lines
8.5 KiB
C++
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;
|
|
}
|
|
|