欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

打印指定年份的日历

程序员文章站 2022-06-16 20:36:58
输入年份,打印出该年的日历: #include void PrintEnter(int mod); void PrintSkip(int lastday); void PrintTitle(int year,int month); int JudgeDays(int year, ......

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

#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;

    //计算开头有几个\t
    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("\n");
    printf("%d年%d月\n",year,month);
    printf("--------------------------------\n");
    printf("一   二   三   四   五   六   日\n");
}

/**
 * @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("\n");
}

/**
 * @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("\n");
    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("\n");
    }
}

 

打印指定年份的日历