Расчет длительности в днях промежутка времени между двумя датами - 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 - сокращение часового пояса. Код, использующий эту структуру, может быть связан с расчетом продолжительности промежутка времени между двумя датами.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д