Вычислите количество дней между двумя датами,заданными в формате 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 вычисляет общее количество дней в заданной дате. Список элементов кода:

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

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


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

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

5   голосов , оценка 4.4 из 5
Похожие ответы