编辑代码

#include <stdio.h>

// 函数声明
int isLeapYear(int year);
int getMonthDays(int year, int month);
void printMonth(int year, int month);
void printYear(int year);

int main() {
int studentID, year;
printf("请输入你的学号:");
scanf("%d", &studentID);
year = 2000 + studentID % 100; // 取学号后两位,并转换为21世纪的年份

if (year < 2001 || year > 2100) {
printf("年份不在21世纪内。\n");
return 1;
}

printYear(year); // 打印全年日历
return 0;
}

// 判断是否为闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 获取月份的天数
int getMonthDays(int year, int month) {
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
return 31;
case 4: case 6: case 9: case 11:
return 30;
case 2:
return isLeapYear(year) ? 29 : 28;
default:
return 0;
}
}

// 打印一个月的日历
void printMonth(int year, int month) {
int days = getMonthDays(year, month);
int firstDayOfWeek; // 每个月第一天是星期几

// 计算第一天是星期几,这里使用2000年1月1日是星期六作为基准
int dayOfYear = (year - 2000) * 365 + (year - 2001) / 4 - (year - 2001) / 100 + (year - 2001) / 400;
for (int m = 1; m < month; m++) {
dayOfYear += getMonthDays(year, m);
}
firstDayOfWeek = (dayOfYear + 6) % 7 + 1; // 2000年1月1日是星期六,对应数字6

// 打印月份
printf("\n%d年%d月的日历:\n", year, month);
printf("日 一 二 三 四 五 六\n");

// 打印空格直到第一天
for (int i = 1; i < firstDayOfWeek; i++) {
printf(" ");
}

// 打印天数
for (int day = 1; day <= days; day++) {
printf("%2d ", day);
if ((firstDayOfWeek + day - 1) % 7 == 0) {
printf("\n");
}
}
// 如果不是星期六结束,打印换行
if ((firstDayOfWeek + days) % 7 != 1) {
printf("\n");
}
}

// 打印一年的日历
void printYear(int year) {
for (int month = 1; month <= 12; month++) {
printMonth(year, month);
}