2.7 打印日期(华中科技大学复试上机题)
-
我的思路
① 是昨天求总天数问题的逆问题,求总天数是累加,这里应该是逐个相减。同样需要预处理和判断闰平年的函数。
② 一开始写了个for循环逐次相减,循环条件是i<13 && 天数>0
,自己测试的时候发现最后输出结果的月份无一例外全是12 ,也没找到原因,最后发现循环条件有问题。
③ 修改之后的循环条件:天数-月份天数>0,大于0意味着不是该月,循环继续。小于等于0说明就是该月。循环内的语句:n-=day[row][i]
,跳出循环时把i赋值给月份,把n赋值给天数。这样得到的结果是正确的。
④ 格式问题:年份是四位数没问题,主要是月和日的输出,如果小于10则前面补0,也即控制格式输出,这里完全不会,直接看答案。 -
查缺补漏
① 解答里给出了常用的输出格式:这里控制月和日前的补0,采用第二种格式控制输出
| %2d |输出场宽为2的整数,超过2位按实际数据输出,不够2位右对齐输出 |
|%02d|输出场宽为2的整数,超过2位按实际数据输出,不够2位前置补0|
|%5.2f|输出场宽为5的浮点数,小数点后有2位,不够5位右对齐输出|
② 解答里采用的是while循环,恍然大悟,怪不得自己写的时候for怎么都不得劲儿。 -
源代码
#include <stdio.h>
#include <stdbool.h>
// 预处理
int day[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
// 判断是否是闰年
bool isLeapYear(int y){
return ( y%400==0 || ((y%4==0)&&y%100!=0) );
}
int main() {
int m,n;
while (scanf("%d %d", &m, &n) != EOF) {
int M,D;
int row = isLeapYear(m); // 判断是否闰年
int i=0;
// 这里用while循环比较好,天数>该月份天数时循环
for ( i = 1 ; ( n - day[row][i] ) > 0 ; i++ ) {
n -= day[row][i];
}
M = i; // 获取月
D = n; // 获取日
// 控制月和日的输出格式
printf("%d-%02d-%02d\n",m,M,D);
}
}