Сравнить две даты - C (СИ)
Формулировка задачи:
Всем привет, подскажите плиз чайнику как реализовать следующую задачку: пользователь должен ввести дату r (сохраняется в массив), так-же пользователь должен ввести скажем n-число дней (сохраняем в z прибавив к дате из массива r), затем полученную дату z нужно сравнить с текущей датой и если они совпадают или z больше вывести на экран статус Good в противном случае выводить Bad.
Я пробовал сделать просто задав временной массив через: int day,mes,god - но все же хотелось более точной и автоматизированной системы расчетов этой самой даты (чтобы не было такого что к 18,02,2016 прибавив 20 дней получаем 38,02,2016 а не 09,03,2016)
Решение задачи: «Сравнить две даты»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> const char* CheckDate(const char* const dateStr, const int daysCount) { static char result[8]; time_t current; time_t validate; struct tm* timeInfo = NULL; time(¤t); time(&validate); timeInfo = localtime(¤t); sscanf(dateStr, "%d.%d.%d", &timeInfo->tm_mday, &timeInfo->tm_mon, &timeInfo->tm_year); timeInfo->tm_mon = timeInfo->tm_mon - 1; timeInfo->tm_year = timeInfo->tm_year - 1900; timeInfo->tm_mday = timeInfo->tm_mday + daysCount; validate = mktime(timeInfo); if (difftime(validate, current) >= 0.0) { strcpy(result, "Good"); } else { strcpy(result, "Bad"); } return (const char*) result; } int main(void) { printf("%s\n", CheckDate("18.02.2016", 2)); printf("%s\n", CheckDate("16.02.2016", 2)); printf("%s\n", CheckDate("15.02.2016", 2)); printf("%s\n", CheckDate("18.02.2016", 0)); printf("%s\n", CheckDate("17.02.2016", 0)); return 0; }
Объяснение кода листинга программы
- В функции
CheckDate
используются стандартные заголовочные файлыstdio.h
,stdlib.h
,string.h
иtime.h
. - Функция
CheckDate
принимает два аргумента: строку с датой и количество дней для добавления. - Результат проверки даты сохраняется в статическом массиве
result
типаchar
с фиксированным размером 8 символов. - Внутри функции инициализируются две переменные типа
time_t
-current
иvalidate
, которые используются для хранения текущего времени и времени, которое будет проверено. - Переменная
timeInfo
инициализируется как указатель на структуруtm
и используется для работы с датой. - С помощью функции
sscanf
из строкиdateStr
считываются значения дня, месяца и года. - Значения месяца и года в структуре
tm
уменьшаются на единицу, так как в C месяцы и годы хранятся от 0 до 11 и от 1900 до 2099 соответственно. - Значение дня в структуре
tm
увеличивается на количество дней, переданных в функциюCheckDate
. - С помощью функции
mktime
создается новое время, которое будет проверено. - С помощью функции
difftime
проверяется, не превышает ли время, которое будет проверено, текущее время более чем на 0,0 секунды. - Если условие в пункте 10 выполняется, то в массив
result
записывается строкаGood
, иначе записывается строкаBad
. - В функции
main
вызывается функцияCheckDate
с разными строками даты и количеством дней для добавления. - Результат проверки выводится на экран с помощью функции
printf
. - В функции
main
не обрабатываются ошибки, поэтому программа может завершиться с ошибкой при попытке выполнить недопустимые действия (например, увеличить день месяца или год на 30 или 31).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д