#include #include // 判断是否为闰年 int isLeapYear(int year) { return (year % 4 == 0 && year % 100!= 0) || (year % 400 == 0); } // 计算某月有多少天 int daysInMonth(int year, int month) { int days[] = {31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return days[month - 1]; } // 计算1900年1月1日到给定日期的总天数 int totalDays(int year, int month, int day) { int total = 0; int y; for (y = 1900; y < year; y++) { total += 365 + isLeapYear(y); } int m; for (m = 0; m < month; m++) { total += daysInMonth(year, m); } total += day; return total; } // 打印日历 void printCalendar(int year, int singleColumn) { int startDay = (totalDays(year, 1, 1) + 1) % 7; printf("Calendar - %d\n", year); if (singleColumn) { int month; for ( month = 1; month <= 12; month++) { int days = daysInMonth(year, month); printf("\n\t%d月\n", month); printf("\tMon\tTue\tWed\tThu\tFri\tSat\tSun\n"); int i; for (i = 0; i < startDay; i++) printf("\t"); int day; for (day = 1; day <= days; day++) { printf("\t%d", day); if ((startDay + day) % 7 == 0) printf("\n"); } if ((startDay + days) % 7!= 0) printf("\n"); startDay = (startDay + days) % 7; } } else { printf("\tMon\tTue\tWed\tThu\tFri\tSat\tSun\t\tMon\tTue\tWed\tThu\tFri\tSat\tSun\n"); int month; for (month = 1; month <= 12; month++) { int days = daysInMonth(year, month); int currentStartDay = (totalDays(year, month, 1) + 1) % 7; int i; for (i = 0; i < currentStartDay; i++) printf("\t"); int day; for (day = 1; day <= days; day++) { printf("\t%d", day); if ((currentStartDay + day) % 7 == 0) printf("\t\t"); } printf("\n"); } } } // 查询某日期是周几 void queryDay() { int year, month, day; printf("请输入日期(年 月 日):"); scanf("%d %d %d", &year, &month, &day); int total = totalDays(year, month, day); int weekDay = (total - 1) % 7; char *weekDays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat","Sun"}; printf("%d年%d月%d日是 %s\n", year, month, day, weekDays[weekDay]); printf("该年是 %s年\n", isLeapYear(year)? "闰" : "平"); } // 菜单 void menu() { int choice; int year; int singleColumn = 1; while (1) { printf("\n1. 查询某日期是周几并判断是否为闰年\n"); printf("2. 打印某一年的日历(单列)\n"); printf("3. 打印某一年的日历(双列)\n"); printf("4. 退出\n"); printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 1: queryDay(); break; case 2: printf("请输入年份:"); scanf("%d", &year); printCalendar(year, singleColumn); break; case 3: singleColumn = 0; printf("请输入年份:"); scanf("%d", &year); printCalendar(year, singleColumn); singleColumn = 1; break; case 4: exit(0); default: printf("无效的选择,请重新选择\n"); } } } int main() { menu(); return 0; }