Skip to content

Commit 5087f90

Browse files
committed
5.7
1 parent c5259d5 commit 5087f90

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#include <stdio.h>
2+
3+
static char daytab[2][13] = {
4+
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
5+
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
6+
};
7+
8+
int main()
9+
{
10+
int day_of_year(int, int, int);
11+
void month_day(int, int, int*, int*);
12+
13+
int day = day_of_year(2018, 8, 19);
14+
printf("%d\n", day);
15+
16+
day = day_of_year(2018, 13, 19);
17+
printf("%d\n", day);
18+
19+
day = day_of_year(2018, 12, 39);
20+
printf("%d\n", day);
21+
22+
day = day_of_year(2018, 12, 0);
23+
printf("%d\n", day);
24+
25+
int month;
26+
month_day(2018, 231, &month, &day);
27+
printf("%d, %d\n", month, day);
28+
29+
month_day(2018, -1, &month, &day);
30+
printf("%d, %d\n", month, day);
31+
32+
month_day(2018, 1234, &month, &day);
33+
printf("%d, %d\n", month, day);
34+
35+
month_day(2018, 365, &month, &day);
36+
printf("%d, %d\n", month, day);
37+
38+
month_day(2018, 366, &month, &day);
39+
printf("%d, %d\n", month, day);
40+
41+
month_day(2016, 366, &month, &day);
42+
printf("%d, %d\n", month, day);
43+
44+
return 0;
45+
}
46+
47+
int day_of_year(int year, int month, int day)
48+
{
49+
int i, leap;
50+
if (month < 1 || month > 12) {
51+
printf("error: invalid month: %d\n", month);
52+
return -1;
53+
}
54+
55+
leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
56+
57+
if (day < 1 || day > daytab[leap][month]) {
58+
printf("error: invalid day: %d\n", day);
59+
return -1;
60+
}
61+
62+
for (i = 1; i < month; i++)
63+
day += daytab[leap][i];
64+
return day;
65+
}
66+
67+
void month_day(int year, int yearday, int *pmonth, int *pday)
68+
{
69+
int i, leap;
70+
leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
71+
if (yearday < 1) {
72+
printf("error: invalid yearday: %d\n", yearday);
73+
return;
74+
} else if (leap == 1 && yearday > 366) {
75+
printf("error: invalid yearday: %d\n", yearday);
76+
return;
77+
} else if (leap == 0 && yearday > 365) {
78+
printf("error: invalid yearday: %d\n", yearday);
79+
return;
80+
}
81+
82+
for (i = 1; yearday > daytab[leap][i]; i++)
83+
yearday -= daytab[leap][i];
84+
*pmonth = i;
85+
*pday = yearday;
86+
}
87+

0 commit comments

Comments
 (0)