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