• 打印指定年份的日历


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

    #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("
    ");
        }
    }

  • 相关阅读:
    N-Queens And N-Queens II [LeetCode] + Generate Parentheses[LeetCode] + 回溯法
    详细解释VB连接access几种方法数据库
    至少原则平方多项式曲线拟合和实施
    .net在arraylist用法
    Microsoft.AlphaImageLoader过滤评论
    总理推理算法(高效率
    mysql三学习sql声明学习
    1第一个Android应用程序
    软件架构学习总结
    ORACLE在表中添加的目光凝视和读取列
  • 原文地址:https://www.cnblogs.com/TomHe789/p/12423209.html
Copyright © 2020-2023  润新知