Автор: Alexandrini
Дата сообщения: 02.12.2008 13:37
Помогите, пожалуйста. Такая программа: Разработать программу вычисления разности между двумя заданными датами. Каждая да-та должна быть задана в формате MMDD[CC]YY, где MM фиксирует номер месяца года в диапазоне от 1 до 12, DD соответствует числу месяца в диапазоне от 1 до 31, CC обозна-чает две первые необязательные цифры, а YY - две последние цифры, идентифицирующие год. Обе даты, разность которых нужно вычислить, должны передаваться программе через аргументы командной строки ее вызова. Результат вычисления разности дат должен отображаться в потоке стандартного вывода (stdout) числом полных лет и дней между ними по календарю.(язык С)
Вот сам текст программы:
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
void init(char *, struct tm *);
void errormes(int);
int diffabs(int, int);
int main(int argc, char *argv[])
{
struct tm date1, date2, *diffdate;
time_t time1, time2, dtime;
int len;
if (argc != 3) errormes(1);
len = strlen(argv[1]);
if (len != 6 && len != 8) errormes(1);
len = strlen(argv[2]);
if (len != 6 && len != 8) errormes(1);
init(argv[1], &date1);
init(argv[2], &date2);
if (diffabs(date1.tm_year, date2.tm_year) > 68) errormes(2);
time1 = mktime(&date1);
time2 = mktime(&date2);
if (time1 > time2)
dtime = difftime(time1, time2);
else
dtime = difftime(time2, time1);
diffdate = localtime(&dtime);
fprintf(stdout, "\Разность дат: %d ã. %d äí.\n\n",
diffabs(diffdate->tm_year, 70), diffdate->tm_yday);
return 0;
}
void init(char *pstr, struct tm *date)
{
char buf[5];
int i=0;
while(isdigit(pstr[i]))
i++;
if(i!=strlen(pstr)) errormes(1);
memset(date, 0, sizeof(struct tm));
strncpy(buf, pstr, 2);
buf[2] = '\0';
date->tm_mon = atoi(buf) - 1;
if (date->tm_mon < 0 || date->tm_mon > 11) errormes(3);
strncpy(buf, pstr + 2, 2);
buf[2] = '\0';
date->tm_mday = atoi(buf);
if (date->tm_mday < 1 || date->tm_mday > 31) errormes(3);
if (strlen(pstr) == 6)
{
strcpy(buf, "20");
strcat(buf, pstr + 4);
}
else
strcpy(buf, pstr + 4);
if (date->tm_mon==1)
{
if(date->tm_year % 4 == 0 && date->tm_year % 100 != 0 || date->tm_year % 400 == 0)
{if(date->tm_mday < 1 ||date->tm_mday > 29)
{errormes(3);}
else{ if(date->tm_mday < 1 ||date->tm_mday > 28)
errormes(3);}}
}
date->tm_year = atoi(buf) - 1900;
if (date->tm_year < 2 || date->tm_year > 138) errormes(3);
return;
}
int diffabs(int a, int b)
{
if (a > b) return a - b;
return b - a;
}
void errormes(int code)
{
if (code == 1)
fprintf(stderr, "\nÍåêîððåêòíûå àðãóìåíòû.\n");
if (code == 2)
fprintf(stderr, "\nÏåðåïîëíåíèå òèïà. Ðàçíîñòü äàò íå äîëæíà ïðåâûøàòü 68 ëåò.\n");
if (code == 3)
fprintf(stderr, "\nÍåâåðíûé ôîðìàò äàòû.\n");
fprintf(stderr, "Íåîáõîäèìî çàäàòü äâà ïàðàìåòðà âèäà\n\n\tMMDD[CC]YY\n\t"
"MM - íîìåð ìåñÿöà îò 01 äî 12\n\t"
"DD - äåíü ìåñÿöà îò 01 äî 31\n\t"
"[CC]YY - ãîä îò 1970 äî 2037, ãäå ïåðâûå äâå öèôðû íåîáÿçàòåëüíû\n\n"
"Íàïðèìåð: 02181990\n\n");
exit(-1);
return;
}
Она рабочая, но сюда надо включить такую проверку, что, если месяц-февраль, то в високосном году - 29 дней в феврале, а если год обычный, то 28. В тексте есть такая проверка, но программа не определяет високосный год. Всегда учитывается, что в феврале 28 дней.
Помогите, пожалуйста.