用指针而不是索引重写例程
day_of_year
和month_day
。
这个练习很简单,这是解决办法:
int day_of_year(unsigned int year, 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;
}
int month_day(unsigned int year, 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 <= 365))) {
for(i = 1; yearday > *(*(daytab + leap) + i); i++) {
yearday -= *(*(daytab + leap) + i);
}
*pday = yearday;
*pmonth = i;
return 1;
}
return -1;
}
表达式(daytab + leap)
是指向leap
-th行的指针,(*(daytab + leap) + i)
是指向leap
-th行的i
-th元素的指针。
发布于 2014-02-14 03:01:33
看到您的daytab
定义也会很好。我假设您对定义它的方式感到满意,并且函数按预期工作。
我觉得month_day()
中的这种情况有点可怕:
if((leap == 1 && (yearday >= 1 && yearday <= 366)) || (leap == 0 && (yearday >= 1 && yearday <= 365)))
我会把它缩短到以下几点。另外,我已经倒转了检查,这样如果参数验证失败,函数就会提前返回。尽早返回是一种更好的习惯,因为它减少了缩进,并减少了阅读代码时的心理负担,方法是避开简单的分支。
int leap = (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
if (yearday < 1 || yearday > 365 + leap) {
return -1;
}
for (…) {
…
}
https://codereview.stackexchange.com/questions/41590
复制相似问题