> 文档中心 > 100 Days of Code-day26(年月日转换的奥秘)

100 Days of Code-day26(年月日转换的奥秘)

day_of_year:set day of year from month and day
month_day:set month,day from day of year

1.error checking in day_of_year or month_day. Remedy this defect.

int day_of_year(int year, int month, int day){int leap ,i;leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;//若该年为闰年,则逻辑表达式的值为1if (month < 1 || month > 12)return -1;if (day < 0 || day > daytab[leap][month])return -1;for (i = 1; i < month; i++)day += daytab[leap][i];//将天数不断累加起来return day;}void month_day(int year, int yearday, char *pmonth, char *pday){int i, leap;if (year < 1){*pmonth = -1;*pday = -1;return;}leap = year % 4 == 0 && year % 100 != 0 || year % 4 == 0;for (i = 1;i <= 12 && yearday > daytab[leap][i];i++)yearday -= daytab[leap][i];//与day_of_year函数的计算恰好相反,不断做减法,最终得到相应日期if (i = 13 && yearday > daytab[leap][i]){*pmonth = -1;*pday = -1;}else{*pmonth = i;*pday = yearday;}}

改写该程序:

int day_of_year(int year, int month, int day){int leap ,i;leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;//若该年为闰年,则逻辑表达式的值为1if (month < 1 || month > 12 || day < 0 || day > daytab[leap][month])return -1;for (i = 1; i < month; i++)day += daytab[leap][i];//将天数不断累加起来return day;}void month_day(int year, int yearday, int *pmonth, int *pday){int i, leap;leap = year % 4 == 0 && year % 100 != 0 || year % 4 == 0;if (year < 1 || yearday < 1 || yearday > (leap ? 366 : 365)){*pmonth = -1;*pday = -1;return;}for (i = 1;yearday > daytab[leap][i];i++)yearday -= daytab[leap][i];//与day_of_year函数的计算恰好相反,不断做减法,最终得到相应日期*pmonth = i;*pday = yearday;}

2. Rewrite the routines day_of_year and month_day with pointers instead of indexing.

int day_of_year(int year, int month, int day){int leap;char *p;leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;//若该年为闰年,则逻辑表达式的值为1p = daytab[leap];//daytab[leap]可以看做是一维数组名,是二维数组daytab所包含的一维数组首元素的地址//等价于p = *(daytab + leap); daytab是二维数组首元素的地址,现在的“首元素”指的是由13个整型元素组成的一维数组if (month < 1 || month > 12 || day < 0 || day > *(p + month))//day > *(p+month)等同于day > p[month]return -1;//p所指的对象是一维数组的元素while (--month)day += *++p;//将天数不断累加起来,首元素不用加,return day;}void month_day(int year, int yearday, int *pmonth, int *pday){int leap;char *p;leap = year % 4 == 0 && year % 100 != 0 || year % 4 == 0;p = *(daytab + leap);if (year < 1 || yearday < 1 || yearday > (leap ? 366 : 365)){*pmonth = -1;*pday = -1;return;}while (yearday > *++p)yearday -= *p;//与day_of_year函数的计算恰好相反,不断做减法,最终得到相应日期*pmonth = p - *(daytab + leap);*pday = yearday;}

test:

#includeint day_of_year(int year, int month, int day);void month_day(int year, int yearday, int *pmonth, int *pday);int main(){int month, day;printf("yearday=%d\n", day_of_year(2008, 1, 29));printf("yearday=%d\n", day_of_year(2008, 3, 29));month_day(2008, 34, &month, &day);printf("%d month %d day\n", month, day);return 0;}static char daytab[][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}};

100 Days of Code-day26(年月日转换的奥秘) 阅读世界,共赴山海 100 Days of Code-day26(年月日转换的奥秘) 423全民读书节,邀你共读