#define _CRT_SECURE_NO_WARNINGS #include int menu() { char g; int h; printf("1. 查询星期\n"); printf("2. 打印日历\n"); printf("输入x退出\n"); printf("请输入选项:"); scanf(" %c", &g); if (g >= '1' && g <= '2') { h = g - '0'; // 将字符 '1' 或 '2' 转换为整数 1 或 2 } else if (g == 'x' || g == 'X') { h = -2; // 表示退出程序 } else { h = -1; // 表示无效输入 } return h; } //------------------------------------------------------ int main() { int n; int m[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //一年的月份 for (;;) { //无限循环程序 mjq:; n = menu();//用n替换h的值 if (n == -2) break; //退出程序 else if (n == 1) { int year, a = 0, b, i, j; printf("输入年份 月份 日期\n输入-1返回上一级\n"); scanf("%d", &year); if (year == -1) goto mjq;//返回首页 if (year < 0 || year>9999)//检测输入合法 万年历真的只有一万年哇! printf("输入错误\n\n"); else { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) //判断闰年 是的话将月份中的二月换成29天 m[2] = 29; scanf("%d", &m[0]); scanf("%d", &b); if (year == 1582 && m[0] == 10 && b > 4 && b < 15) //1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过 printf("输入错误\n1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过。\n\n"); else if (year < 0 || m[0] < 0 || m[0]>12 || b < 0 || b>31) { //检查年份、月份和日期是否在有效范围内 printf("输入错误\n\n"); } else if (m[2] == 28 && b > 28 || m[2] == 29 && b > 29)//检查日期是否超过了该月的天数 闰年29天 printf("输入错误\n\n"); else if ((m[0] == 1 || m[0] == 3 || m[0] == 5 || m[0] == 7 || m[0] == 8 || m[0] == 10 || m[0] == 12) && b > 31)//如果这些月份是输入值大于31天则错误 printf("输入错误\n\n"); else { j = b; if (year == 1582) { m[10] -= 10; //1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过 减去 if (b >= 15) //调整当月的日期 b -= 10; } if (year >= 2000) a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;//计算从公元1年到year-1年(包括year年如果它是闰年的话)之间的闰年总数 %7计算当天是星期几 else a = (year / 100) / 4 - 2 * (year / 100) + year % 100 + (year % 100) / 4 + (13 * 12 / 5); for (i = 1; i < m[0]; i++) { b += m[i]; } a += b - 1; a = a % 7; if (a == 0) a = 7; //如果a=0 a就是星期天 if (year == 1582) { if (b >= 15) //同上 b -= 10; } printf("%d年%d月%d日是星期%d\n", year, m[0], j, a); if (m[2] == 29) printf("%d年是闰年\n\n", year); else printf("%d年不是闰年\n", year); } } } else if (n == 2) { int year, a = 0, i, j, b, f; cxk:; printf("输入年份\n输入-1返回上一级\n"); scanf("%d", &year); if (year == -1) goto cxk; if (year < 0 && year > 9999) printf("输入错误\n\n"); else { printf("1.单列输出\n2.双列输出\n输入-1返回上一级\n输入需要的序号\n"); scanf("%d", &n); if (n == -1) goto cxk; if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) m[2] = 29; if (year >= 2000) a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7; else a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7; if (a == 0) a = 7; if (n == 1) { printf("======================%.4d======================\n\n\n", year); //输出查询年份表头 for (i = 1; i <= 12; i++) { printf("=======================%.2d=======================\n", i); //单列输出 printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天\n"); for (b = 1; b < a; b++) //输出每个月空着的天数 printf(" "); for (j = 1; j <= m[i]; j++) { if (year == 1582 && i == 10) { if (j == 5) //将5跳到15号 j = 15; } printf(" %.2d ", j); a++; if (a > 7) { printf("\n"); a = 1; } }printf("\n"); } } else if (n == 2) { int x1, x2, x3, x4; printf("===============================================%.4d===============================================\n\n\n", year); for (i = 1; i <= 12; i += 2) { x2 = 1, x3 = 1; printf("=======================%.2d======================= ", i); //双列输出 printf("=======================%.2d=======================\n", i + 1); printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天 "); printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天\n"); for (b = 1; b < a; b++) printf(" "); f = (a + m[i]) % 7; if (f == 0) f = 7; x1 = 1; for (j = 1; j <= 40; j++) { if (j <= m[i]) printf(" %.2d ", j); else if (x3 > m[i + 1]) { break; } else printf(" "); a++; if (a > 7) { if (x1 == 1) { for (b = 1; b < f; b++) printf(" "); x1 = 0; x2 = f, x4 = f; } for (x2; x2 <= 38; x2++) { if (year == 1582 && (i + 1) == 10) { if (x3 == 5) x3 = 15; } if (x3 <= m[i + 1]) { printf(" %.2d ", x3); x3++; } x4++; if (x4 > 7) { printf("\n"); a = 1; x2++; x4 = 1; break; } } } } if (year == 1582 && (i + 1) == 10) { m[10] -= 10; } a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7; int x5; for (x5 = 1; x5 <= i + 1; x5++) a += m[x5]; a = a % 7; if (a == 0) a = 7; printf("\n"); } } else { printf("输入错误\n\n"); } } } else { printf("\n\n"); } } }