打印日历

任务描述

要求根据输入的年份和月份来输出该年月的日历。

先验知识

日历的格式如下图所示:
C++:打印日历
上图中每个汉字(一、二…日)占四个字节,右对齐,由于汉字显示本身就占2个字节,所以只需要在汉字前面多输出两个空格就好了。每个日期数字占4个字节,也是右对齐,这样能使输出的日历上下对齐。

测试样例

测试输入:
2017 6
预期输出:
C++:打印日历

测试输入:
2000 2
预期输出:
C++:打印日历

解题思路

判断是否为闰年的函数实现

int leapYear(int y)
{
    if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        return 1;
    return 0;
}

获得该月第一天是星期几

int whatDay(int year, int month)
{
    // 1年月日是星期一
    int w = 1;
    int i;

    // 1到year-1都是全年
    for(i = 1; i < year; i++)
    {
        if(leapYear(i))
            w += 366;
        else
            w += 365;
    }
    switch(month)
    {
    case 12: // 加月的
        w += 30;
    case 11: // 加月的
        w += 31;
    case 10: // 加月的
        w += 30;
    case 9:  // 加月的
        w += 31;
    case 8:  // 加月的
        w += 31;
    case 7:  // 加月的
        w += 30;
    case 6:  // 加月的
        w += 31;
    case 5:  // 加月的
        w += 30;
    case 4:  // 加月的
        w += 31;
    case 3:  // 加月的
        if(leapYear(year))
            w += 29;
        else
            w += 28;
    case 2:  // 加月的天
        w += 31;
    case 1:  // 1月不加了
        ;
    }

    // 得到-6,其中为星期天
    w = w % 7;

    // 调整星期天
    if(w == 0)
        w = 7;
    return w;
}

确定这个月有多少天

int day_month;
    if(month == 12 || month == 10 || month == 8 || month == 7 || month == 5 || month == 3 || month == 1)
        day_month =31;
    if(month == 11 || month == 9 || month == 6 || month == 4)
        day_month = 30;
    if(month == 2){
        if(leapYear(year)){
            day_month =29;
        }
        else day_month = 28;
    }

打印出日历表头

 printf("  一  二  三  四  五  六  日\n");

输出日历

输出日历的时候要注意格式的控制。
先输出1号前面的空格
然后用order来标记每行输出的个数
当order == 8 时 需要输出换行,并令其从新等于1。

int day = 1;
    int order = week_n;
    for(int j=1;j<week_n;j++){
        printf("%4s"," ");
    }
    for(int i = 0;i<day_month;i++){ //打印所有的日期
        printf("%4d",day);
        day++;
        order++;
        if(order==8){
            printf("\n");
            order=1;
        }
        
    }
    printf("\n");

运行效果

C++:打印日历

GitHub源码地址
本文到此结束,欢迎指正交流!

相关文章: