Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY,включая начальный и конечный день. - C (СИ)
Формулировка задачи:
Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY,включая начальный и конечный день. Даты могут быть заданы в произвольном порядке. Учитывайте високосные годы(такой год делится на 400 или делится на 4,но не делится на 100).
Написать нужно в трех файлах. data.h;data.c;main.c
Решение задачи: «Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY,включая начальный и конечный день.»
textual
Листинг программы
- //Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- struct DATE
- { int day;
- int month;
- int year;
- };
- int leapYear(int year)
- { return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
- }
- DATE *parseDate()
- { DATE *date = (DATE*) malloc(sizeof(DATE));
- int checkInput;
- char buf[15];
- do
- { printf("\tFormatted as DD/MM/YYYY\t\t");
- fgets(buf, 15, stdin);
- checkInput = sscanf(buf, "%d/%d/%d", &date->day, &date->month, &date->year);
- //проверка на ввод трех целых, разделенных слэшем
- if(checkInput!=3)
- { printf("\nWrong date format\n");
- continue;
- }
- //проверка на соответствие григорианскому календарю (принят в 1583)
- if(date->year < 1583)
- { printf("\nThe Gregorian Calendar was adopted in 1583. Years before are irrelevant\n");
- continue;
- }
- //проверка на попадание в ОДЗ
- checkInput += date->day>0 && date->month>0 && date->month<= 12;
- if(checkInput!= 4)
- { printf("\nImpossible value for day or month \n");
- continue;
- }
- //проверка на взаимное соответствие день-месяц-год
- if(leapYear(date->year) && date->month == 2)
- checkInput += date->day <=29;
- else
- checkInput += date->day <= days [date->month-1];
- //если последняя проверка не была пройдена
- if(checkInput!= 5)
- printf("\nDay-month-year mismatch\n");
- } while(checkInput != 5);
- return date;
- }
- int daysFromYearStart(DATE *date)
- { int sum = 0, i = 0;
- for( ; i<date->month-1; i++)
- sum += days [i];
- sum += date->day;
- if(leapYear(date->year) && date->month > 2)
- sum++;
- return sum;
- }
- int dateInDays(DATE *date)
- { int i = 1583, dateInDays = 365*(date->year - 1583);
- for( ; i<date->year; i++)
- if(leapYear(i)) dateInDays++;
- dateInDays += daysFromYearStart(date);
- return dateInDays;
- }
- int main()
- { DATE *d1, *d2;
- printf("Date 1 ");
- d1 = parseDate();
- printf("Date 2 ");
- d2 = parseDate();
- printf("Difference in days: %d", abs(dateInDays(d1) - dateInDays(d2)));
- free(d1); free(d2);
- fflush(stdin);
- getchar();
- return 0;
- }
Объяснение кода листинга программы
Код вычисляет разницу в количестве дней между двумя датами, введенными в формате DD/MM/YYYY. Он использует структуру DATE
для хранения даты, функцию leapYear
для определения, является ли год високосным, и функцию daysFromYearStart
для вычисления количества дней в месяце или до определенной даты. Функция dateInDays
вычисляет общее количество дней в заданной дате.
Список элементов кода:
- Объявление массива
days
, содержащего количество дней в каждом месяце. - Объявление структуры
DATE
, используемой для хранения даты. - Определение функции
leapYear
, которая проверяет, является ли год високосным. - Определение функции
parseDate
, которая считывает дату с консоли и проверяет ее корректность. - Определение функции
daysFromYearStart
, которая вычисляет количество дней в месяце или до определенной даты. - Определение функции
dateInDays
, которая вычисляет общее количество дней в заданной дате. - Ввод первой даты.
- Ввод второй даты.
- Вычисление разницы в количестве дней между двумя датами.
- Освобождение памяти, выделенной для хранения дат.
- Очистка буфера ввода.
- Возврат значения функции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д