Сложение двух дат - C (СИ)

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

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

добрый день помогите плиз со сложением двух дат что-то нечё не может прийти в голову как это сделать)
#include <stdio.h>
struct Date {
    unsigned y; //год
    unsigned m; //месяц
    unsigned d; //день
};

void GetDate(Date* d) // ввод даты с клавиатуры в формате «дд.мм.гггг»;
{
printf("Vvedite daty v formate <dd.mm.gggg>:");
scanf("%d%*c%d%*c%d%*c",&d->d,&d->m,&d->y);
}
 
void PutDate(Date d) // вывод даты в формате «дд.мм.гггг»;
{
printf("\nNawa structura soderjit - %d.%d.%d",d.d,d.m,d.y);
}
 
void AddDate(Date* d1, Date d2) // сложение двух дат (результат помещается в d1);
{
 
}

int main() {
 
struct Date d,d1;
GetDate(&d);
GetDate(&d1);
PutDate(d);
 
    return 0;
}

Решение задачи: «Сложение двух дат»

textual
Листинг программы
bool CMainSheet::SetFileTimeStampUTC
(
   const char* const       pszFile,
   const FILETIME&         rBaseUTC,
   int                     iDelayMin,
   int                     iDelaySec,
   bool                    bDelayRandom
)
{
   HANDLE      hFile = OpenFileReadWrite(pszFile);
 
   if (hFile == INVALID_HANDLE_VALUE)
   {
      // Error !
      return false;
   }
 
   unsigned __int64     FileTime64 = 0ui64;
 
   memcpy(&FileTime64,&rBaseUTC,sizeof(__int64));
 
   int   iApxSec = 60 * iDelayMin + iDelaySec;
 
   if (bDelayRandom)
   {
      iApxSec += (int)IntRand() % 30;
   }
 
   int   iApxMSec = (int)IntRand() % 10000; // random milliseconds
 
   __int64     iShift = 10000000i64 * iApxSec + 10000i64 * iApxMSec;
 
   FileTime64 += iShift;
 
   FILETIME    CreationTime;
   FILETIME    LastAccessTime;
   FILETIME    LastWriteTime;
 
   memcpy(&CreationTime,  &FileTime64,sizeof(__int64));
   memcpy(&LastAccessTime,&FileTime64,sizeof(__int64));
   memcpy(&LastWriteTime, &FileTime64,sizeof(__int64));
 
   SetFileTime(hFile,&CreationTime,&LastAccessTime,&LastWriteTime);
 
   CloseHandle(hFile);
   hFile = INVALID_HANDLE_VALUE;
 
   return true;
}

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

  1. В функции SetFileTimeStampUTC происходит установка временной метки файла.
  2. Параметры функции:
    • pszFile: указатель на имя файла.
    • rBaseUTC: объект типа FILETIME, содержащий базовую временную метку в формате UTC.
    • iDelayMin: значение задержки в минутах.
    • iDelaySec: значение задержки в секундах.
    • bDelayRandom: флаг, указывающий, является ли задержка случайной.
  3. В начале функции открывается файл с помощью функции OpenFileReadWrite и сохраняется его дескриптор в переменной hFile. Если файл не может быть открыт, то возвращается false и код прекращает выполнение.
  4. Далее создается переменная FileTime64 типа unsigned __int64, которая будет использоваться для хранения временной метки файла.
  5. С помощью функции memcpy в переменную FileTime64 копируются байты из объекта rBaseUTC.
  6. Затем вычисляется приблизительное количество секунд задержки путем умножения значения iDelayMin на 60 и добавления значения iDelaySec.
  7. Если флаг bDelayRandom установлен в true, то к полученному значению добавляется случайное значение от 0 до 30 секунд.
  8. Далее случайным образом вычисляется значение задержки в миллисекундах в диапазоне от 0 до 10000 миллисекунд.
  9. Затем создается переменная iShift типа __int64, которая будет использоваться для смещения временной метки файла.
  10. В iShift сначала устанавливается байтовое представление значения 10 миллионов (10000000) умноженного на значение задержки в секундах (iApxSec), а затем добавляется байтовое представление значения 10 тысяч (10000) умноженного на значение задержки в миллисекундах (iApxMSec).
  11. Значение iShift добавляется к переменной FileTime64.
  12. Создаются три объекта типа FILETIME: CreationTime, LastAccessTime и LastWriteTime, которые будут использоваться для установки временных меток файла.
  13. С помощью функции memcpy в каждый из объектов копируются байты из переменной FileTime64.
  14. В функцию SetFileTime передаются дескриптор файла и объекты CreationTime, LastAccessTime и LastWriteTime для установки временных меток файла.
  15. В конце функции дескриптор файла закрывается с помощью функции CloseHandle, после чего он становится недействительным.
  16. Возвращается значение true, если все операции были выполнены успешно, и false в противном случае.

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


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

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

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