#include // 判断是否为闰年 (考虑1582年前后差异) int isLeapYear(int year) { if (year >= 1582) { if ((year%4 ==0 && year%100!=0) || year%400==0) { return 1; } return 0; } else { if (year % 4 == 0) { return 1; } return 0; } } // 检查输入是否为数字 int isnumber(char input[]) { int i = 0; while (input[i]!= '\0') { if (input[i] < '0' || input[i] > '9') { return 0; } i++; } return 1; } // 检查日期是否有效 int Dateisture(int year, int month, int day) { if (year == 1582 && month == 10 && (day > 4 && day <= 14)) { return 0; } int daysInMonth[] = {0, 31, 28, 31, 32, 30, 31, 30, 31, 30, 31, 30, 31}; if (isLeapYear(year)) { daysInMonth[2] = 29; } if(year>=1 && month>=1 && month<=12 && day>=1 && day<=daysInMonth[month]){ return 1; } return 0; } // 计算给定日期是星期几(考虑1582年前后差异) int dayOfWeek(int year, int month, int day) { if (year >= 1582) { if (month < 3) { year--; month += 12; } int c = year / 100; int y = year % 100; int week = (c / 4 - 2 * c + y + y / 4 + 13 * (month + 1) / 5 + day - 1) % 7; if (week < 0) { week += 7; } return week; } else { int a = (14 - month) / 12; int y = year - a; int m = month + 12 * a - 2; int week = (day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12) % 7; return week; } } // 输出(单列) void Single(int year) { int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (isLeapYear(year)) { daysInMonth[2] = 29; } printf("%d年的日历(单列):\n", year); int dayOfWeekJan1 = dayOfWeek(year, 1, 1); for (int month = 1; month <= 12; month++) { printf("Mon Tue Wed Thu Fri Sat Sun\n"); for (int day = 1; day <= daysInMonth[month]; day++) { printf("%3d ", day); if ((dayOfWeekJan1 + day) % 7 == 0 && day!= daysInMonth[month]) { printf("\n"); } }printf("\n"); } printf("\n"); } // 输出(双列) void Double(int year) { int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (isLeapYear(year)) { daysInMonth[2] = 29; } printf("%d年的日历(双列):\n", year); int dayOfWeekJan1 = dayOfWeek(year, 1, 1); for (int month = 1; month <= 12; month++) { printf("Mon Tue Wed Thu Fri Sat Sun \t Mon Tue Wed Thu Fri Sat Sun"); for (int day = 1; day <= daysInMonth[month]; day++) { printf("%3d ", day); if ((dayOfWeekJan1 + day) % 7 == 0 && day!= daysInMonth[month]) { printf("\n"); } }printf("\n"); } printf("\n"); } int main() { char choice[10]; int zh; do{ printf("1. 我想查询某年某月某日是星期几,该年是否为闰年\n"); printf("2. 我想查询某年的日历\n"); printf("3. 上个厕所\n"); printf("请选择: "); scanf("%9s",choice); if(!isnumber(choice)){ printf("输入错误,请重新输入\n"); continue; } zh=choice[0]-'0'; switch(zh){ case 1: char years[10], months[10], days[10]; int year, month, day; while (1) { printf("请输入年份: "); scanf("%s", years); if (!isnumber(years)) { printf("错误,重新开始\n"); continue; } year = atoi(years); printf("请输入月份: "); scanf("%s", months); if (!isnumber(months)) { printf("请误,重新开始\n"); continue; } month = atoi(months); printf("请输入日期: "); scanf("%s", days); if (!isnumber(days)) { printf("请误,重新开始\n"); continue; } day = atoi(days); if (!Dateisture(year, month, day)) { printf("输入错误,请重新输入\n"); continue; } int weekDay = dayOfWeek(year, month, day); char weekDayNames[][10] = {"周一", "周二", "周三", "周四", "周五", "周六", "周天"}; printf("%d-%02d-%02d是%s\n", year, month, day, weekDayNames[weekDay]); if (isLeapYear(year)) { printf("%d年是闰年\n", year); } else { printf("%d年不是闰年\n", year); } break; } case 2: char yearss[10]; while (1) { printf("请输入年份: "); scanf("%s", yearss); if (!isnumber(yearss)) { printf("请输入正确的年份\n"); continue; } year = atoi(yearss); Single(year); Double(year); break; } case 3:printf("不行");break; default:printf("请选择正确选项\n"); continue; } }while(zh!=3); }