第4关:打印日历
400
- 任务要求
- 参考答案
- 评论
任务描述
本关任务:根据输入的年份和月份来输出该年月的日历。
相关知识
日历的格式如下图所示:
上图中每个汉字(一、二...日)占四个字节,右对齐,由于汉字显示本身就占2个字节,所以只需要在汉字前面多输出两个空格就好了。每个日期数字占4个字节,也是右对齐,这样能使输出的日历上下对齐。
剩下的事情就是循环输出这个月的所有日期了,这个月有多少天可以专门用一个函数实现,注意闰年二月(判闰年的函数这里又可以用一次了)是29天。
注意:在 1 号前应该留多少空位(如果 1 号是星期 n ,则留 n-1 个空位,每个空位是一个日期的宽度),注意什么时候换行(日期加 1 号前空位数量是 7 的倍数则换行)。
编程要求
在右侧编辑器中的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);
// 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){
int xq=whatDay(year, month),n=0,i;
cout <<" "<<"一 "<<"二 "<<"三 "<<"四 "<<"五 "<<"六 "<<"日"<< endl;
for(i=1;i<xq;i++)
{
cout<<" ";
}
switch(month)
{
case 1:n=31;break;
case 2:
if (leapYear(year))
n=29;
else
n=28;
break;
case 3:n=31;break;
case 4:n=30;break;
case 5:n=31;break;
case 6:n=30;break;
case 7:n=31;break;
case 8:n=31;break;
case 9:n=30;break;
case 10:n=31;break;
case 11:n=30;break;
case 12:n=31;break;
}
for (i=1;i<=n;i++)
{
if(i<10)
cout<<" "<< i;
else
cout<<" "<< i;
switch(xq)
{
case 1:
if ((i%7)==0)
cout<<endl;
break;
case 2:
if ((i%7)==6)
cout<<endl;
break;
case 3:
if ((i%7)==5)
cout<<endl;
break;
case 4:
if ((i%7)==4)
cout<<endl;
break;
case 5:
if ((i%7)==3)
cout << endl;
break;
case 6:
if ((i%7)==2)
cout<<endl;
break;
case 7:
if ((i%7)==1)
cout<<endl;
break;
}//该switch为进行换行判断,如果符合结果则进行换行,如何继续进行下一行的输出
}
cout<<endl;
}
/*************** End **************/
int main()
{
// 年、月
int y, m;
// 输入年月
cin >> y >> m;
// 输出该年月的日历
printMonth(y,m);
return 0;
}