第4关:打印日历

任务描述

本关任务:根据输入的年份和月份来输出该年月的日历。

编程要求

在右侧编辑器中的Begin-End之间补充代码,根据输入的年月(函数printMonth 的两个参数)打印该年该月的日历。日历输出格式要求如下:

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

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:2017 6
预期输出:

  一  二  三  四  五  六  日
               1   2   3   4
   5   6   7   8   9  10  11
  12  13  14  15  16  17  18
  19  20  21  22  23  24  25
  26  27  28  29  30

测试输入:2000 2
预期输出:

  一  二  三  四  五  六  日
       1   2   3   4   5   6
   7   8   9  10  11  12  13
  14  15  16  17  18  19  20
  21  22  23  24  25  26  27
  28  29

最终代码

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>

using namespace std;

// 函数printMonth:按要求的格式打印某年某月的日历
// 参数:year-年,month-月
// 返回值:无
void printMonth(int year, int month);

void printBlank();

// leapYear:判断闰年
// 参数:y-年
// 返回值:1-是闰年,0-不是闰年
int leapYear(int y) {
    if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
        return 1;
    return 0;
}

// 函数whatDay:计算某年某月的1号是星期几
// 参数:year-年,month-月
// 返回值:1到7--星期1到星期日
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;
}

// 请在下面补充代码,实现函数printMonth
/*************** Begin **************/
void printMonth(int year, int month) {
    printf("  一  二  三  四  五  六  日\n");
    // 打印 1 号之前空的几天
    for (int i = 1; i < whatDay(year, month); ++i) {
        printBlank();
    }
    // 计算这个月有多少天
    int day = 0;
    switch (month) {
        case 12:
            day += 31;
            break;
        case 11:
            day += 30;
            break;
        case 10:
            day += 31;
            break;
        case 9:
            day += 30;
            break;
        case 8:
            day += 31;
            break;
        case 7:
            day += 31;
            break;
        case 6:
            day += 30;
            break;
        case 5:
            day += 31;
            break;
        case 4:
            day += 30;
            break;
        case 3:
            day += 31;
            break;
        case 2:
            if (leapYear(year))
                day += 29;
            else
                day += 28;
            break;
        case 1:
            day += 31;
            break;
        default:
            break;
    }
    // 打印月份表
    for (int i = 1; i <= day; ++i) {
        printf("%4d", i);
        // 打印换行符
        if (i % 7 == 8 - whatDay(year, month)) {
            cout << endl;
        }
    }
}

/**
 * 打印四个空格
 */
void printBlank() {
    printf("    ");
}
/*************** End **************/

int main() {
    // 年、月
    int y, m;

    // 输入年月
    cin >> y >> m;

    // 输出该年月的日历
    printMonth(y, m);

    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海不再神清气爽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值