Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY,включая начальный и конечный день. - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY,включая начальный и конечный день. Даты могут быть заданы в произвольном порядке. Учитывайте високосные годы(такой год делится на 400 или делится на 4,но не делится на 100). Написать нужно в трех файлах. data.h;data.c;main.c

Решение задачи: «Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY,включая начальный и конечный день.»

textual
Листинг программы
  1. //Вычислите количество дней между двумя датами,заданными в формате DD/MM/YYYY
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7.  
  8. int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  9.  
  10. struct DATE
  11. {   int day;
  12.     int month;
  13.     int year;
  14. };
  15.  
  16. int leapYear(int year)
  17. {   return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
  18. }
  19.  
  20. DATE *parseDate()
  21. {   DATE *date = (DATE*) malloc(sizeof(DATE));
  22.     int checkInput;
  23.     char buf[15];
  24.     do
  25.     {   printf("\tFormatted as DD/MM/YYYY\t\t");
  26.         fgets(buf, 15, stdin);
  27.         checkInput = sscanf(buf, "%d/%d/%d", &date->day, &date->month, &date->year);
  28.        
  29.         //проверка на ввод трех целых, разделенных слэшем
  30.         if(checkInput!=3)
  31.         {   printf("\nWrong date format\n");
  32.             continue;
  33.         }
  34.  
  35.         //проверка на соответствие григорианскому календарю (принят в 1583)
  36.         if(date->year < 1583)
  37.         {   printf("\nThe Gregorian Calendar was adopted in 1583. Years before are irrelevant\n");
  38.             continue;
  39.         }
  40.  
  41.         //проверка на попадание в ОДЗ
  42.         checkInput += date->day>0 && date->month>0 && date->month<= 12;
  43.         if(checkInput!= 4)
  44.         {   printf("\nImpossible value for day or month \n");
  45.             continue;
  46.         }
  47.  
  48.         //проверка на взаимное соответствие день-месяц-год
  49.         if(leapYear(date->year) && date->month == 2)
  50.             checkInput += date->day <=29;
  51.         else
  52.             checkInput += date->day <= days [date->month-1];
  53.         //если последняя проверка не была пройдена
  54.         if(checkInput!= 5)
  55.             printf("\nDay-month-year mismatch\n");
  56.  
  57.     } while(checkInput != 5);
  58.     return date;
  59. }
  60.  
  61. int daysFromYearStart(DATE *date)
  62. {   int sum = 0, i = 0;
  63.     for( ; i<date->month-1; i++)
  64.         sum += days [i];
  65.     sum += date->day;
  66.     if(leapYear(date->year) && date->month > 2)
  67.         sum++;
  68.     return sum;
  69. }
  70.  
  71. int dateInDays(DATE *date)
  72. {   int i = 1583, dateInDays = 365*(date->year - 1583);
  73.     for( ; i<date->year; i++)
  74.         if(leapYear(i)) dateInDays++;
  75.     dateInDays += daysFromYearStart(date);
  76.     return dateInDays;
  77. }
  78.  
  79. int main()
  80. {   DATE *d1, *d2;
  81.    
  82.     printf("Date 1 ");
  83.     d1 = parseDate();
  84.    
  85.     printf("Date 2 ");
  86.     d2 = parseDate();
  87.  
  88.     printf("Difference in days: %d", abs(dateInDays(d1) - dateInDays(d2)));
  89.  
  90.     free(d1); free(d2);
  91.     fflush(stdin);
  92.     getchar();
  93.     return 0;
  94. }

Объяснение кода листинга программы

Код вычисляет разницу в количестве дней между двумя датами, введенными в формате DD/MM/YYYY. Он использует структуру DATE для хранения даты, функцию leapYear для определения, является ли год високосным, и функцию daysFromYearStart для вычисления количества дней в месяце или до определенной даты. Функция dateInDays вычисляет общее количество дней в заданной дате. Список элементов кода:

  1. Объявление массива days, содержащего количество дней в каждом месяце.
  2. Объявление структуры DATE, используемой для хранения даты.
  3. Определение функции leapYear, которая проверяет, является ли год високосным.
  4. Определение функции parseDate, которая считывает дату с консоли и проверяет ее корректность.
  5. Определение функции daysFromYearStart, которая вычисляет количество дней в месяце или до определенной даты.
  6. Определение функции dateInDays, которая вычисляет общее количество дней в заданной дате.
  7. Ввод первой даты.
  8. Ввод второй даты.
  9. Вычисление разницы в количестве дней между двумя датами.
  10. Освобождение памяти, выделенной для хранения дат.
  11. Очистка буфера ввода.
  12. Возврат значения функции.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы