/* * Program to find difference in days between two dates. * * Approach is to convert both dates into number of days since * a semi-arbitrary but conventional start day of 1/1/1970, * and then subtract. */ #include #include #include /* global variables -- usually frowned on but here seems simpler */ /* * table of month names and data */ typedef struct { char *abbrev; int days; int extra_leap_year_days; } month_table_entry_t; const month_table_entry_t month_table[] = { { "jan", 31, 0 }, { "feb", 28, 1 }, { "mar", 31, 0 }, { "apr", 30, 0 }, { "may", 31, 0 }, { "jun", 30, 0 }, { "jul", 31, 0 }, { "aug", 31, 0 }, { "sep", 30, 0 }, { "oct", 31, 0 }, { "nov", 30, 0 }, { "dec", 31, 0 } }; const int months = sizeof(month_table) / sizeof(month_table_entry_t); const int start_year = 1970; bool is_leap(int year); int date_to_day(char *month, int day, int year); /* main program */ int main(void) { char month[4]; int day; int year; printf("enter start date (three-char month (lower case), day, year)\n"); if (scanf("%3s %d %d", month, &day, &year) != 3) { printf("error in input\n"); return 1; } int day1 = date_to_day(month, day, year); if (day1 == -1) { return 1; } printf("enter end date (three-char month (lower case), day, year)\n"); if (scanf("%3s %d %d", month, &day, &year) != 3) { printf("error in input\n"); return 1; } int day2 = date_to_day(month, day, year); if (day2 == -1) { return 1; } printf("difference of %d days\n", day2-day1); return 0; } /* functions */ /* * function to turn m/d/y into day since 1/1/1970 * print error message and return -1 on error */ int date_to_day(char *month, int day, int year) { int month_index = -1; for (int i = 0; i < months; ++i) { if (strcmp(month, month_table[i].abbrev) == 0) { month_index = i; } } if (month_index == -1) { printf("bad month\n"); return -1; } if (year < start_year) { printf("bad year\n"); return -1; } int days_in_month = month_table[month_index].days; if (is_leap(year)) { days_in_month += month_table[month_index].extra_leap_year_days; } if ((day < 1) || (day > days_in_month)) { printf("bad day\n"); return -1; } int days = 0; for (int y = start_year; y < year; ++y) { if (is_leap(y)) days += 366; else days += 365; } for (int m = 0; m < month_index; ++m) { days += month_table[m].days; if (is_leap(year)) days += month_table[m].extra_leap_year_days; } days += day; return days; } bool is_leap(int year) { if ((year % 400) == 0) return true; else if (((year % 4) == 0) && ((year % 100) != 0)) return true; else return false; }