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;//若该年为闰年,则逻辑表达式的值为1
if (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;//若该年为闰年,则逻辑表达式的值为1
if (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;//若该年为闰年,则逻辑表达式的值为1
p = 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:
#include<stdio.h>
int 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}
};