任务描述
本关任务:根据输入的年份和月份来输出该年月的日历。
编程要求
在右侧编辑器中的Begin-End之间补充代码,根据输入的年月(函数printMonth 的两个参数)打印该年该月的日历。日历输出格式要求如下:
- 每个汉字(一、二、…、日)占四个字节,右对齐,由于汉字显示本身就占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;
}