Page 112
There is no error-checking in day_of_year
or month_day.
Remedy this defect.
static char daytab[2][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 },
};
int day_of_year(int year, int month, int day)
{
int i, leap;
leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
if (year < 0 || month < 1 || month > 12 || day < 1 ||
day > daytab[leap][month + 1]) {
return -1;
}
for (i = 1; i < month; i++) {
day += daytab[leap][i];
}
return day;
}
int month_day(int year, int yearday, int *pmonth, int *pday)
{
int i, leap;
leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
if (year < 0 || yearday > 365 + leap) {
return -1;
}
for (i = 1; yearday > daytab[leap][i]; i++) {
yearday -= daytab[leap][i];
}
*pmonth = i;
*pday = yearday;
return 1;
}
#include <stdio.h>
int main()
{
printf("%d\n", day_of_year(2021, 07, 19));
int month, day;
month_day(2021, 200, &month, &day);
printf("%d, %d\n", month, day);
}