UIT2024_Calendar/stu2024/软件2404王莫涵(1).cpp
2024-12-07 16:23:34 +08:00

383 lines
7.9 KiB
C++

#include<bits/stdc++.h>
using namespace std;
bool run(int year) {
if (year >= 1582)
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
else
return (year % 4 == 0);
}
bool Y(int year) {
if (year > 0 && year < 10000)
return true;
else
return false;
}
bool M(int month) {
if (month > 0 && month < 13)
return true;
else
return false;
}
bool D(int year, int month, int day) {
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (run(year))
m[2] = 29;
if (year == 1582 && month == 10 && day >= 5 && day < 15)
return false;
if (!(day > 0 && day <= m[month]))
return false;
return true;
}
int shu(char a[100]) {
int c, t = strlen(a);
for (int i = 0; i < t; i++) {
if (a[i] >= '0' && a[i] <= '9') {
c++;
} else {
return false;
}
}
if (c == t)
return true;
}
int zhou(int year, int month, int day) {
int a, b = 0;
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
if (year <= 1582) {
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 11) % 7;
}
if (run(year))
m[2] = 29;
if (year == 1582) {
m[10] = 21;
}
for (int i = 1; i < month; i++) {
a = (a + m[i]) % 7;
}
if (year == 1582 && month == 10 && day >= 15) {
b = (day - 10) % 7;
} else
b = (a + day - 1) % 7;
return b;
}
void one(int year, int month) {
printf("%6d年%6d月\n", year, month);
cout << "日 一 二 三 四 五 六\n";
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (run(year))
m[2] = 29;
int d1 = zhou(year, month, 1);
int day = 1;
for (int i = 1; i <= d1; i++) {
cout << " ";
}
while (day <= m[month]) {
if (year == 1582 && month == 10 && day == 5) {
day += 10;
d1 += 11;
}
cout << setw(2) << day << " ";
if ((day + d1 ) % 7 == 0 && day != m[month]) {
cout << "\n";
}
day++;
}
cout << "\n";
}
//双列
void two2(int year, int month, int *n) {
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (run(year))
m[2] = 29;
int i;
if (*n == 1) {
int z = zhou(year, month, 1);
//if(z==0)z=7;
for (i = 1; i <= z ; i++) {
cout << " ";
}
}
for (i = *n ; i <= m[month]; i++) {
printf ("%3d ", i);
if ((i + zhou(year, month, 1) ) % 7 == 0 || i == m[month] ) {
cout << "\n";
*n = i + 1;
break;
}
}
}
void two(int year, int month) {
int i, n = 1;
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (run(year))
m[2] = 29;
printf("%9d年%6d月", year, month);
printf("%35d年%6d月\n", year, month + 1);
printf(" 日 一 二 三 四 五 六 日 一 二 三 四 五 六 \n");
int z = zhou(year, month, 1);
//if (z == 0)z = 7;
for (i = 1; i <= z; i++) {
printf(" ");
}
for (i = 1; i <= m[month]; i++) {
printf("%3d ", i);
if ((i + zhou(year, month, 1) ) % 7 == 0 || i == m[month]) {
if (i == m[month]) {
int w;
w = 7 - ( (i + zhou(year, month, 1) ) % 7 );
if (w != 7) {
for (int i = 1; i <= w; i++)
printf(" ");
}
}
cout << " ";
two2(year, month + 1, &n);
}
}
printf(" ");
two2(year, month + 1, &n);
}
//菜单
int screen() {
char a[10000];
int b = 9;
cout << "万年历菜单:\n";
cout << "1.查询某年某月某日的日期是周几,该年是否为闰年\n";
cout << "2.输入年份,单列输出这一年的日历\n";
cout << "3.输入年份,双列输出这一年的日历\n";
cout << "4.输入 0 以结束程序\n";
cout << "请输入你的选择:";
cin >> a;
if (strlen(a) > 1) {
return b;
} else {
if (a[0] <= '9' && a[0] >= '0') {
system("cls");
b = a[0] - '0';
return b;
} else {
system("cls");
return b;
}
}
}
int main() {
int c;
char y[100] = {0}, m[100] = {0}, d[100] = {0};
do {
c = screen();
switch (c) {
case 1: {
int year, month, day;
cout << "请输入年份:";
cin >> y;
if (strlen(y) > 4) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (shu(y));
else {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (strlen(y) == 4)
year = 1000 * (y[0] - '0') + 100 * (y[1] - '0') + 10 * (y[2] - '0') + (y[3] - '0');
if (strlen(y) == 3)
year = 100 * (y[0] - '0') + 10 * (y[1] - '0') + 1 * (y[2] - '0');
if (strlen(y) == 2)
year = 10 * (y[0] - '0') + (y[1] - '0');
if (strlen(y) == 1)
year = 1 * (y[0] - '0');
if (!Y(year)) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
cout << "请输入月份:";
cin >> m;
if (strlen(m) > 2) {
cout << "月份输入错误,请重新输入。\n";
continue;
}
if (shu(m));
else {
cout << "月份输入错误,请重新输入。\n";
continue;
}
if (strlen(m) == 2)
month = (10 * (m[0] - '0') + (m[1] - '0'));
if (strlen(m) == 1)
month = (m[0] - '0');
if (!M(month)) {
cout << "月份输入错误,请重新输入。\n";
continue;
}
cout << "请输入日期:";
cin >> d;
if (strlen(d) > 2) {
cout << "日期输入错误,请重新输入。\n";
continue;
}
if (shu(d));
else {
cout << "日期输入错误,请重新输入。\n";
continue;
}
if (strlen(d) == 2)
day = (10 * (d[0] - '0') + (d[1] - '0'));
if (strlen(d) == 1)
day = (d[0] - '0');
if (!D(year, month, day)) {
cout << "日期输入错误,请重新输入。\n";
continue;
}
int z = zhou(year, month, day);
if (zhou(year, month, day) == 0)
z = 7;
cout << year << "" << month << "" << day << "日是星期"
<< z << "\n";
if (run(year)) {
cout << year << "年是闰年。\n";
break;
} else {
cout << year << "年不是闰年。\n";
break;
}
}
case 2: {
int year;
cout << "请输入年份:";
cin >> y;
if (strlen(y) > 4) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (shu(y));
else {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (strlen(y) == 4)
year = 1000 * (y[0] - '0') + 100 * (y[1] - '0') + 10 * (y[2] - '0') + (y[3] - '0');
if (strlen(y) == 3)
year = 100 * (y[0] - '0') + 10 * (y[1] - '0') + 1 * (y[2] - '0');
if (strlen(y) == 2)
year = 10 * (y[0] - '0') + (y[1] - '0');
if (strlen(y) == 1)
year = 1 * (y[0] - '0');
if (!Y(year)) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
for (int month = 1; month <= 12; month++) {
one(year, month);
}
break;
}
case 3: {
int year;
cout << "请输入年份:";
cin >> y;
if (strlen(y) > 4) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (shu(y));
else {
cout << "年份输入错误,请重新输入。\n";
continue;
}
if (strlen(y) == 4)
year = 1000 * (y[0] - '0') + 100 * (y[1] - '0') + 10 * (y[2] - '0') + (y[3] - '0');
if (strlen(y) == 3)
year = 100 * (y[0] - '0') + 10 * (y[1] - '0') + 1 * (y[2] - '0');
if (strlen(y) == 2)
year = 10 * (y[0] - '0') + (y[1] - '0');
if (strlen(y) == 1)
year = 1 * (y[0] - '0');
if (!Y(year)) {
cout << "年份输入错误,请重新输入。\n";
continue;
}
for (int month = 1; month <= 12; month += 2) {
if (year == 1582 && month == 9) {
month = 11;
cout << " 1582年 9月 1582年 10月\n 日 一 二 三 四 五 六 日 一 二 三 四 五 六 \n";
cout << " 1 1 2 3 4 15 16\n";
cout << " 2 3 4 5 6 7 8 17 18 19 20 21 22 23\n";
cout << " 9 10 11 12 13 14 15 24 25 26 27 28 29 30\n";
cout << " 16 17 18 19 20 21 22 31\n";
cout << " 23 24 25 26 27 28 29\n 30\n";
}
two(year, month);
printf("\n\n");
}
break;
}
case 0: {
return 0;
}
default:
cout << "请重新输入。\n";
}
} while (true);
}