Kafa Kağıdı
#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;
}







