#include // 判断闰年 int isLeapYear(int year) { return ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0); } // 计算给定日期是周几(蔡氏公式) int dayOfWeek(int year, int month, int day) { if (month < 3) { year--; month += 12; } int c = year / 100; int y = year % 100; int d = (day + (13 * (month + 1) / 5) + y + (y / 4) + (c / 4) + (5 * c)) % 7; return d; } // 输出单列日历 void printSingleColumnCalendar(int year) {//printSingleColumnCalendar打印单个月日历空间 char *months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//储存一年每月的天数 if (isLeapYear(year)) { daysInMonth[1] = 29;//特殊年份 } for (int m = 0; m < 12; m++) {//输出一年的月份 printf("%s %d\n", months[m], year); printf("Sun Mon Tue Wed Thu Fri Sat\n"); int weekDay = dayOfWeek(year, m + 1, 1); for (int i = 0; i < weekDay; i++) { printf(" "); } for (int d = 1; d <= daysInMonth[m]; d++) { printf("%3d ", d); if ((weekDay + d) % 7 == 0) { printf("\n"); } } printf("\n\n"); } } // 输出双列日历 void printDoubleColumnCalendar(int year) {//printDoubleColumnCalendar打印并排月的日历 char *months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (isLeapYear(year)) { daysInMonth[1] = 29; } for (int m = 0; m < 12; m++) { printf("%s %d\t\t", months[m], year); if (m % 2 == 0) { printf("\n"); } printf("Sun Mon Tue Wed Thu Fri Sat\t\tSun Mon Tue Wed Thu Fri Sat\n"); int weekDay = dayOfWeek(year, m + 1, 1); for (int i = 0; i < weekDay; i++) { printf(" "); } for (int d = 1; d <= daysInMonth[m]; d++) { printf("%3d ", d); if ((weekDay + d) % 7 == 0) { printf("\n"); } } printf("\n\n"); } } // 菜单显示 void menu() { int choice, year,a; printf("1.输出对应年份全年的日历:\n"); printf("2.判断输入年份是否为闰年:\n"); printf("3.对应日期为周几:\n"); printf("4.退出:\n"); scanf("%d",&a); if(a==1) { printf("1. 输出单列日历\n2. 输出双列日历\n3. 退出\n: "); scanf("%d", &choice); if (choice == 1 || choice == 2) { printf("请输入年份: "); scanf("%d", &year); if (year < 1900 || year > 2100) {//报错范围 printf("年份超出范围,请重新输入\n"); menu(); return; } if (choice == 1) { printSingleColumnCalendar(year);//选择单列 } else { printDoubleColumnCalendar(year);//选择双列 } } else if (choice == 3) { return; } else { printf("无效选择,请重新选择\n"); menu(); } } else if(a==2) { printf("请输入年份:\n"); scanf("%d",&year); if((year % 4 == 0 && year % 100!= 0) || year % 400 == 0) printf("闰年"); else printf("平年"); } else if(a==3) { } } int main() { menu(); return 0; }