首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用指针代替数组索引写入day_of_month和month_day

用指针代替数组索引写入day_of_month和month_day
EN

Code Review用户
提问于 2014-02-13 21:15:01
回答 1查看 167关注 0票数 4

用指针而不是索引重写例程day_of_yearmonth_day

这个练习很简单,这是解决办法:

代码语言:javascript
运行
复制
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元素的指针。

EN

回答 1

Code Review用户

回答已采纳

发布于 2014-02-14 03:01:33

看到您的daytab定义也会很好。我假设您对定义它的方式感到满意,并且函数按预期工作。

我觉得month_day()中的这种情况有点可怕:

代码语言:javascript
运行
复制
if((leap == 1 && (yearday >= 1 && yearday <= 366)) || (leap == 0 && (yearday >= 1 && yearday <= 365)))

我会把它缩短到以下几点。另外,我已经倒转了检查,这样如果参数验证失败,函数就会提前返回。尽早返回是一种更好的习惯,因为它减少了缩进,并减少了阅读代码时的心理负担,方法是避开简单的分支。

代码语言:javascript
运行
复制
int leap = (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
if (yearday < 1 || yearday > 365 + leap) {
    return -1;
}
for (…) {
    …
}
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/41590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档