aboutsummaryrefslogtreecommitdiff
path: root/5.9.c
diff options
context:
space:
mode:
authorsinanmohd <pcmsinan@gmail.com>2022-06-20 16:12:23 +0530
committersinanmohd <pcmsinan@gmail.com>2022-06-20 16:12:23 +0530
commite2d7e348da862126f28194a09812002a41c013fc (patch)
tree10246c4ac3672bc43c34ec4802b4c100b76a677a /5.9.c
parent00814fe8d3de822d9042e035fd1fc367d771b2c8 (diff)
5.9
Diffstat (limited to '5.9.c')
-rw-r--r--5.9.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/5.9.c b/5.9.c
new file mode 100644
index 0000000..e768bd5
--- /dev/null
+++ b/5.9.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+
+#define LEAP_YEAR_DAYS 366
+#define NON_LEAP_YEAR_DAYS 365
+#define NO_OF_MONTHS 12
+
+int year_day(int day, int month, int year);
+void month_day(int *day, int *month, int year, int year_day_val);
+
+int
+main(void)
+{
+ int day, month, year, year_day_val;
+
+ year = 2020;
+ printf("yd: %d\n", (year_day_val = year_day(15, 2, year)));
+
+ month_day(&day, &month, year, year_day_val);
+ printf("md: %d-%d\n", day, month);
+}
+
+static char daytab[][12] = {
+ {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+ {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+};
+
+int
+year_day(int day, int month, int year)
+{
+ int i, leap;
+
+ leap = ((!year%4 && year%100 ) || !year%400);
+
+ if (month > NO_OF_MONTHS || day > *(*(daytab+leap)+month-1))
+ return -1;
+
+ for (i = 0, --month; i < month; i++)
+ day += *(*(daytab+leap)+i);
+
+ return day;
+}
+
+void
+month_day(int *day, int *month, int year, int year_day_val)
+{
+ int i, leap;
+
+ leap = ((!year%4 && year%100 ) || !year%400);
+
+ if ((leap && year_day_val > LEAP_YEAR_DAYS) || (!leap && year_day_val > NON_LEAP_YEAR_DAYS)) {
+ *month = -1;
+ *day = -1;
+ return;
+ }
+
+ for (i = 1; year_day_val > *(*(daytab+leap)+i-1); i++)
+ year_day_val -= *(*(daytab+leap)+i-1);
+
+ *month = i;
+ *day = year_day_val;
+
+ return;
+}