编辑代码

#include <stdio.h>

// 计算指定日期的星期几(0表示星期日)
int get_weekday(int year, int month, int day) {
    // 如果是1月或2月,要看成上一年的13月或14月
    if (month == 1 || month == 2) {
        month += 12;
        year--;
    }
    // 使用基姆拉尔森公式计算星期几
    int w = (day + 2*month + 3*(month+1)/5 + year + year/4 - year/100 + year/400) % 7;
    return w;
}

// 打印指定月份的日历
void print_calendar(int year, int month) {
    // 计算指定月份的天数
    int days_in_month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) {
        days_in_month[2] = 29;
    }

    // 计算指定月份的第一天是星期几(0表示星期日)
    int first_day_of_month = get_weekday(year, month, 1);

    // 输出月份标题
    const char *month_names[] = {"", "January", "February", "March", "April", "May", "June",
                                 "July", "August", "September", "October", "November", "December"};
    printf("%s %d\n", month_names[month], year);

    // 输出星期标题
    printf("Su Mo Tu We Th Fr Sa\n");

    // 输出日历
    int day = 1;
    while (day <= days_in_month[month]) {
        // 输出一周的日期
        for (int i = 0; i < 7; i++) {
            (i < first_day_of_month || day > days_in_month[month]) ? printf("   ") : printf("%2d ", day++);
        }
        // 输出换行符
        printf("\n");
        // 调整第一天是星期几的值
        first_day_of_month = 0;
    }
    printf("\n");
}

int main() {
    int year, month;
    printf("请输入年份和月份:");
    scanf("%d%d", &year, &month);

    print_calendar(year, month);
    return 0;
}