#include #include typedef enum {FALSE, TRUE} BOOL; #define YEARBASE 1900 typedef struct DATE_{ int day; int month; int year; }DATE; BOOL is_leap(int year); DATE *set_date(int day, int month, int year, DATE *date); void print_date(const DATE *date); long date_to_number(const DATE *date); int day_of_year(const DATE *date); long date_dif(const DATE *date1, const DATE *date2); BOOL is_valid(const DATE *date); char *days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul","Aug", "Sep", "Oct", "Nov", "Dec"}; int daytab[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int main(void) { int day, month, year; DATE d1, d2; for (;;) { printf("first date [day month year]: "); scanf("%d%d%d", &day, &month, &year); set_date(day, month, year, &d1); if (!is_valid(&d1)) printf("invalid date!\n"); else break; } for (;;) { printf("second date [day month year]: "); scanf("%d%d%d", &day, &month, &year); set_date(day, month, year, &d2); if (!is_valid(&d2)) printf("invalid date!\n"); else break; }; printf("total days between "); print_date(&d1); printf(" and "); print_date(&d2); printf(": %d\n", date_dif(&d1, &d2)); return 0; } /*************************************************/ BOOL is_leap(int year) { return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); } /*************************************************/ DATE *set_date(int day, int month, int year, DATE *date) { date->day = day; date->month = month; date->year = year; return date; } /*************************************************/ void print_date(const DATE *date) { printf("%02d", date->day); switch (date->day) { case 1: case 21: case 31: printf("st "); break; case 2: case 22: printf("nd "); break; case 3: case 23: printf("rd "); break; default : printf("th "); } printf("%s ", months[date->month - 1]); printf("%d ", date->year); printf("%s", days[(int)(date_to_number(date) % 7)]); } /*************************************************/ long date_to_number(const DATE *date) { long result = 0; int year; for (year = YEARBASE; year < date->year; year++) result += 365 + is_leap(year); result += day_of_year(date); return result; } /*************************************************/ int day_of_year(const DATE *date) { int k; int result = date->day; daytab[1] = 28 + is_leap(date->year); for (k = 0; k < date->month - 1; ++k) result += daytab[k]; return result; } /*************************************************/ long date_dif(const DATE *date1, const DATE *date2) { return date_to_number(date1) - date_to_number(date2); } /*************************************************/ BOOL is_valid(const DATE *date) { daytab[1] = 28 + is_leap(date->year); if (date->year < YEARBASE) return FALSE; if (date->day > daytab[date->month - 1] || date->day <= 0) return FALSE; if (date->month < 1 || date->month > 12) return FALSE; return TRUE; }