#include #include #include int yearstartday(int Year); bool isLeapYear(int Year); int monthDays(int Year, int Month); int getWeekDay(int Year, int Month, int Day); void outMonthDays(int Year, int Month); void outMonthDays1582(int Year, int Month); void menu(); void MenuChoice(int Choice); void printYearCalendar(int Year); const char* weekDays[] = {"日", "一", "二", "三", "四", "五", "六"}; int main() { menu(); return 0; } int yearstartday(int Year) { int detayear, corday, weekstartday, detaday; detayear = Year - 2000; if (detayear > 0) { corday = 2; detayear -= 1; } else { corday = 0; if (detayear <= -418) { corday = -3; if (detayear <= -2000) { corday = -1; } } } detaday = (detayear / 400) * 2 - detayear / 100 + detayear / 4 + detayear + corday; weekstartday = (6 + detaday % 7) % 7; return weekstartday; } bool isLeapYear(int Year) { return (Year % 4 == 0 && Year % 100 != 0) || (Year % 400 == 0); } int monthDays(int Year, int Month) { if (Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12) { return 31; } else if (Month == 4 || Month == 6 || Month == 9 || Month == 11) { return 30; } else { return isLeapYear(Year) ? 29 : 28; } } int getWeekDay(int Year, int Month, int Day) { int i, temp, weekday, Days = 0; for (i = 1; i <= Month - 1; i++) { Days += monthDays(Year, i); } Days = Days + Day - 1; temp = yearstartday(Year) + Days; weekday = temp % 7; if (Year == 1582 && Month > 10) { weekday -= 3; } return weekday; } void outMonthDays(int Year, int Month) { int i, j, weekday; printf(" %d月日历\n", Month); printf(" 日 一 二 三 四 五 六\n"); weekday = getWeekDay(Year, Month, 1); for (i = 0; i < weekday; i++) { printf(" "); } for (j = 1; j <= monthDays(Year, Month); j++) { printf("%4d", j); if ((j + weekday) % 7 == 0) { printf("\n"); } } printf("\n"); printf("-------------------------------------\n"); } void outMonthDays1582(int Year, int Month) { int i, j, weekday; printf(" %d月日历\n", Month); printf(" 日 一 二 三 四 五 六\n"); weekday = getWeekDay(Year, Month, 1); for (i = 0; i < weekday; i++) { printf(" "); } for (j = 1; j <= monthDays(Year, Month); j++) { if (Month == 10) { if (j > 4 && j < 15) { } else { printf("%4d", j); if (j == 16 || j == 23 || j == 30) { printf("\n"); } } } else { printf("%4d", j); if ((j + weekday) % 7 == 0) { printf("\n"); } } } printf("\n"); printf("-------------------------------------\n"); } void printYearCalendar(int Year) { printf("Calendar for %d\n\n", Year); for (int month = 1; month <= 12; month += 2) { outMonthDays(Year, month); printf("\n"); if (month + 1 <= 12) { outMonthDays(Year, month + 1); printf("\n"); } } } void menu() { int choice; while (1) { printf("万年历\n1. 输入年月日输出星期几\n"); printf("2. 判断闰平年\n"); printf("3. 单列输出某年日历\n"); printf("4. 双列输出某年日历\n"); printf("5. 退出\n"); printf("请输入选择:"); scanf("%d", &choice); MenuChoice(choice); } } void MenuChoice(int Choice) { int Year, Month, Day; switch (Choice) { case 1: printf("请输入年 月 日:"); scanf("%d %d %d", &Year, &Month, &Day); if (Year == 1582 && Month == 10 && Day > 4 && Day < 15) { printf("1582年10月5日至10月14日不存在\n"); } else { int weekday = getWeekDay(Year, Month, Day); printf("%d年%d月%d日是星期%s\n", Year, Month, Day, weekDays[weekday]); } break; case 2: printf("请输入年份:"); scanf("%d", &Year); if (isLeapYear(Year)) { printf("%d年是闰年\n", Year); } else { printf("%d年是平年\n", Year); } break; case 3: printf("请输入年份:"); scanf("%d", &Year); if (Year == 0) { printf("输入错误,没有公元零年\n"); } else { if (Year > 0) { printf(" 公元%d年日历为:\n", Year); } else { printf(" 公元前%d年日历为:\n", -Year); } printf("=====================================\n"); if (Year != 1582) { for (Month = 1; Month <= 12; Month++) { outMonthDays(Year, Month); } } else { for (Month = 1; Month <= 12; Month++) { outMonthDays1582(Year, Month); } } } break; case 4: printf("请输入年份:"); scanf("%d", &Year); if (Year == 0) { printf("输入错误,没有公元零年\n"); } else { printYearCalendar(Year); } break; case 5: printf("退出程序\n"); exit(0); default: printf("无效的选择\n"); } }