根据已知输出任意年份的日历

问题遇到的现象和发生背景

img


#include <stdio.h>

int fun(int y, int m);
int judge(int y, int m);

int main()
{

    int year, month, i;
    scanf("%d %d", &year, &month);
    printf("---------------------\n\
 Su Mo Tu We Th Fr Sa\n\
---------------------\n");

    // 判断当前从周几开始打印
    int start = fun(year, month);
    // printf("%d\n", start);
    int days = judge(year, month);

    for (i = 1; i <= days + start; i++)
    {
        if (i <= start)
            printf("   ");
        else
            printf("%3d", i - start);
        if (i % 7 == 0)
            printf("\n");
    }

    printf("\n---------------------\n");
}

int fun(int y, int m)
{
    int sum = 0, i;
    //先加本年到这个月为止之前的天数
    for (i = 1; i < m; i++)
        sum += judge(y, i);

    for (i = 2007; i < y; i++)
        if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
            sum += 366;
        else
            sum += 365;

    return (sum + 1) % 7; //注意2007 1 1是星期一
}

//根据传入的年份和月份判断当前月有多少天
int judge(int y, int m)
{
    if (m == 2 && ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0))
        return 29;
    else if (m == 2)
        return 28;
    else
        switch (m)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
            break;
        }
}

链接:[](https://blog.csdn.net/weixin_45761327/article/details/106922685)