Расчет длительности в днях промежутка времени между двумя датами - C (СИ)
Формулировка задачи:
Всем привет,помогите пожалуйста доделать программку... Вот задание - Разработать программу для расчета длительности в днях промежутка времени между двумя датами. Обеспечить возможность ввода дат с клавиатуры в различных форматах: дд.мм.гг, дд.мм.гггг, дд:мм:гг, дд:мм:гггг, дд название_месяца гггг, (например 12.08.2006, 12.08.06, 12:08:2006, 12:08:02, 12 августа 2006).
Программка то в общем составлена... только вот проблема с расчетами, когда год 00** и не могу ввести месяц словом... Помогите пожалуйста исправить...
int daymes[]={31,28,31,30,31,30,31,31,30,31,30,31}; int getDney(int day, int mes, int year) { int day1; day1=365*(year-1); day1=day1+((year-1)/4)-((year-1)/100)+((year-1)/400); for(int i=0; i<mes-1; i++) day1+=daymes[i]; day1+=day; if (mes>2) { if (year%4==0) day1++; if (year%100==0) day1--; if (year%400==0) day1++; } return day1; } int ask_error(const char * msg) { char answ; printf("%s\nContinue? (y/n) > ", msg); if (scanf("%c%*c", &answ) != 1) { perror("scanf"); return 1; } return (answ != 'y' && answ != 'Y'); } int check_date(struct tm *d) { if (d->tm_mday < 1 || d->tm_mday > 31) return 1; d->tm_mon -= 1; if (d->tm_mon < 0 || d->tm_mon > 11) return 1; if (d->tm_year < 0) return 1; if (d->tm_year < 37) d->tm_year += 2000; else if (d->tm_year < 100) d->tm_year += 1900; d->tm_year -= 1900; d->tm_min = 1; return 0; } int _tmain(int argc, _TCHAR* argv[]) { int a,b; struct tm date1, date2; time_t time1, time2; while ( 1 ) { memset(&date1, 0, sizeof(struct tm)); memset(&date2, 0, sizeof(struct tm)); printf("\nFirst date: "); if (scanf("%d%*c%d%*c%d%*c", &date1.tm_mday, &date1.tm_mon, &date1.tm_year) != 3) { if (ask_error("Wrong input!")) break; continue; } if (check_date(&date1)) { if (ask_error("Wrong date format!")) break; continue; } printf("Second date: "); if (scanf("%d%*c%d%*c%d%*c", &date2.tm_mday, &date2.tm_mon, &date2.tm_year) != 3 ) { if (ask_error("Wrong input!")) break; continue; } if (check_date(&date2)) { if (ask_error("Wrong date format!")) break; continue; } a=getDney(date1.tm_mday,date1.tm_mon,date1.tm_year); b=getDney(date2.tm_mday,date2.tm_mon,date2.tm_year); printf("Days between: %d\n",b-a ); if ( ask_error("") ) break; } exit(0); return 0; }
Решение задачи: «Расчет длительности в днях промежутка времени между двумя датами»
textual
Листинг программы
struct tm { int tm_sec; /* seconds after the minute [0-60] */ int tm_min; /* minutes after the hour [0-59] */ int tm_hour; /* hours since midnight [0-23] */ int tm_mday; /* day of the month [1-31] */ int tm_mon; /* months since January [0-11] */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday [0-6] */ int tm_yday; /* days since January 1 [0-365] */ int tm_isdst; /* Daylight Savings Time flag */ long tm_gmtoff; /* offset from CUT in seconds */ char *tm_zone; /* timezone abbreviation */ };
Объяснение кода листинга программы
Код представлен в виде структуры tm, которая содержит различные поля, описывающие время. Каждое поле имеет своё название и значение. Вот список полей структуры tm с их названиями и значениями:
- tm_sec - секунды после минуты (от 0 до 60).
- tm_min - минуты после часа (от 0 до 59).
- tm_hour - часы с начала суток (от 0 до 23).
- tm_mday - день месяца (от 1 до 31).
- tm_mon - месяц с начала года (от 0 до 11).
- tm_year - годы с 1900 года.
- tm_wday - дни недели (от 0 до 6), где 0 - это воскресенье.
- tm_yday - количество дней с начала года (от 0 до 365).
- tm_isdst - флаг, указывающий, используется ли летнее время.
- tm_gmtoff - смещение времени относительно времени в Гринвиче (в секундах).
- tm_zone - сокращение часового пояса. Код, использующий эту структуру, может быть связан с расчетом продолжительности промежутка времени между двумя датами.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д