diff options
| author | Sadeep Madurange <smadurange@users.noreply.github.com> | 2022-01-05 19:09:19 +0800 |
|---|---|---|
| committer | Sadeep Madurange <smadurange@users.noreply.github.com> | 2022-01-05 19:09:19 +0800 |
| commit | a669c07c5fc845bd6db25a79d9b22bd21e3b2831 (patch) | |
| tree | f780c530acbc134075d83fef2a8eaa2b3768f6a2 /5/9.c | |
| parent | fc1e8330d73b0c2f197a885ec736ed8f98572a7d (diff) | |
| download | k&r-exercises-a669c07c5fc845bd6db25a79d9b22bd21e3b2831.tar.gz | |
5.9
Diffstat (limited to '5/9.c')
| -rw-r--r-- | 5/9.c | 58 |
1 files changed, 58 insertions, 0 deletions
@@ -0,0 +1,58 @@ +#include <stdio.h> + +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}}; + +/* Sets day of year from month and day */ +int day_of_year(int year, int month, int day) { + int i, leap; + + // leap year logic is only valid if this is true. + if (year < 1752) { + printf("error: invalid year\n"); + return -1; + } + + if (month < 1 || month > 12) { + printf("error: invalid month\n"); + return -1; + } + + if (day < 1) { + printf("error: invalid day\n"); + return -1; + } + + leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; + + for (i = 1; i < month; i++) + day += daytab[leap][i]; + + return day; +} + +/* Sets month and day from day of year */ +void month_day(int year, int yearday, int *pmonth, int *pday) { + int i, leap; + + if (year < 0) { + *pmonth = *pday = -1; + printf("error: invalid year\n"); + return; + } + + if (yearday < 1) { + *pmonth = *pday = -1; + printf("error: invalid yearday\n"); + return; + } + + leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; + + for (i = 1; yearday > daytab[leap][i]; i++) + yearday -= daytab[leap][i]; + + *pmonth = i; + *pday = yearday; +}
\ No newline at end of file |
