在
day_of_year或month_day中没有错误检查。弥补这个缺陷。
以下是解决办法:
int day_of_year(unsigned int year, unsigned int month, int day) {
int leap, i;
leap = ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
if(((month >= 1) && (month <= 12)) && ((day >= 1) && (day <= daytab[leap][month]))) {
for(i = 1; i < month; i++) {
day += daytab[leap][i];
}
return day;
}
return -1;
}
void month_day(unsigned int year, unsigned int yearday, int *pmonth, int *pday) {
int leap, i;
leap = ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
if((leap == 1 && (yearday >= 1 && yearday <= 366)) || (leap == 0 && (yearday >= 1 && yearday <= 366))) {
for(i = 1; yearday > daytab[leap][i]; i++) {
yearday -= daytab[leap][i];
}
*pday = yearday;
*pmonth = i;
}
else {
printf("error: the yearday is invalid");
}
}在day_of_year's一案中,我必须检查yearday是否是valide。1 <= yearday <= (365 || 366)。我将参数类型改为无符号,因为一天不可能是负的,也不可能是一年。
在month_day's一案中,我检查month是否有效,应该是1 <= month <= 12,然后检查day是否属于有效区间。
这一练习可在第126页的K&R2中找到。
发布于 2014-02-10 20:10:14
yearday限制// if((leap == 1.\x{e76f}\x{e76f}{ == 0&( >= 1&年份<= 366)){/ 365 {/365{/365){/365month_day()和day_of_year()应该对month使用一致的类型。建议两种方法都使用int。// int day_of_year(未签名的int年,无符号的int月份,int日){ // month_day(无签名的int年,无符号的int年,int *p月,int *pday) { int day_of_year(未签名的int年,int月份,int日){month_day()和day_of_year()应该对yearday使用一致的类型。建议两种方法都使用int。// int day_of_year(无符号int年,无符号int月份,int日){ // void month_day(无符号int年,无符号int年,int *p月,int *pday) { int day_of_year(无符号int年,int月,int day_of_year){ void month_day(无符号int年,int年,int *p月份,int *pday) {int*pday){leap = ((year...值较好地回到1583年。在第4至1582年是leap = (year % 4 == 0); 1582有其他并发症。4岁前有并发症。month_day()返回int以表示成功或失败。https://codereview.stackexchange.com/questions/41343
复制相似问题