İki Tarih Arasındaki Gün Farkını Bulan Program
26.03.2010 - 17:02 tarihinde nerg gönderdi
İki tarih arasındaki gün farkını bulmak için verilen bir tarihi, 01/01/1900 tarihinden itibaren geçen toplam gün sayısına çeviren bir yardımcı fonksiyon kullanılıyor.
Örnek ekran çıktısı:
first date [day month year]: 20 12 2000
second date [day monty year]: 10 12 1973
total days between 20th Dec 2000 Wed and 10th Dec 1973 Mon: 9872
first date [day month year]: 01 01 1998
second date [day month year]: 01 12 1950
total days between 01st Jan 1998 Thu and 01st Dec 1950 Fri: 17198
Kaynak kod:
#include <stdio.h> #include <stdlib.h> 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; }
Etiketler:
