Alexandrini
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите, пожалуйста. Такая программа: Разработать программу вычисления разности между двумя заданными датами. Каждая да-та должна быть задана в формате 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 дней. Помогите, пожалуйста. |