打印日历
任务描述
要求根据输入的年份和月份来输出该年月的日历。
先验知识
日历的格式如下图所示:
上图中每个汉字(一、二…日)占四个字节,右对齐,由于汉字显示本身就占2个字节,所以只需要在汉字前面多输出两个空格就好了。每个日期数字占4个字节,也是右对齐,这样能使输出的日历上下对齐。
测试样例
测试输入:
2017 6
预期输出:
测试输入:
2000 2
预期输出:
解题思路
判断是否为闰年的函数实现
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");
运行效果
GitHub源码地址
本文到此结束,欢迎指正交流!