打印指定年份的日历

打印指定年份的日历

输入年份,打印出该年的日历:

#include <stdio.h>
void PrintEnter(int mod);
void PrintSkip(int lastday);
void PrintTitle(int year,int month);
int JudgeDays(int year, int month);
void PrintMonth(int year, int mod, int lastday);
int main()
{
    int year;
    //每一个月的最后一天
    int lastday = 1;
    printf("请输入年份:");
    scanf("%d",&year);
    //判断这一年的第一天为星期几
    //公式: (5(year-1)/4-(year-1)/100+(year-1)/400)%7+1
    int flag = (5 * (year-1) / 4 - (year-1) / 100+(year-1)/400) % 7+1;

    //计算开头有几个	
    int skip = flag - 1;

    //判断是否需要换行 判断每月最后一天
    int mod = skip;

    //直接调用PrintMonth函数打印月历
    PrintMonth(year,mod,lastday);
    return 0;
}

/**
 * @brief JudgeDays 判断月份的天数
 * @param year      判断年份是否为闰年
 * @param month     需要判断的月份
 * @return          返回值为月份的天数
 */
int JudgeDays(int year, int month) {

        if(month==4||month==6||month==9||month==11)
            return 30;
        else if(month==2) {
            //判断年份是否为闰年
            if(year % 400 == 0 || (year % 100 !=0 && year % 4 == 0))
                return 29;
            else
                return  28;
        }
        else
            return 31;

}

/**
 * @brief PrintTitle    打印月份的开头
 * @param month         需要打印的月份
 */
void PrintTitle(int year, int month) {
    printf("
");
    printf("%d年%d月
",year,month);
    printf("--------------------------------
");
    printf("一   二   三   四   五   六   日
");
}

/**
 * @brief PrintSkip 解决每一月开头的空格问题
 * @param lastday   上一月份的最后一天
 */
void PrintSkip(int lastday) {
    int i;
    for(i = 0;i < lastday;i++) {
        printf("     ");
    }
}

/**
 * @brief PrintEnter    判断是否换行
 * @param mod           换行的标志(判断是否是七的倍数)
 */
void PrintEnter(int mod) {
    if(mod % 7 ==0)
        printf("
");
}

/**
 * @brief PrintMonth    打印月历
 * @param year          月历的年数
 * @param mod           换行的标志
 * @param lastday       每个月最后一天的标识
 */
void PrintMonth(int year, int mod, int lastday) {

    //打印月历的头
    PrintTitle(year,1);

    //打印空格
    PrintSkip(lastday);

    //打印一月月历
    int i;
    for(i = 1;i <= 31;i++) {
        mod++;
        printf("%-5d",i);

        //换行
        PrintEnter(mod);

        //判断一月的最后一天
        if(i == 31)
            lastday = mod % 7;
    }

    //每打印一个月换一行
    printf("
");
    int month;
    for(month = 2;month < 13;month++) {

        //打印月历的头
        PrintTitle(year,month);

        //打印空格
        PrintSkip(lastday);

        //打印二月到十二月的日历
        int i;
        for(i = 1;i <= JudgeDays(year, month);i++) {
            mod++;
            printf("%-5d",i);

            //换行问题
            PrintEnter(mod);

            //判断每月的最后一天
            if(i == JudgeDays(year, month))
                lastday = mod % 7;
        }
        //每打印一个月换一行
        printf("
");
    }
}