383 lines
7.9 KiB
C++
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);
|
|
}
|