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