Сложение двух дат - 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;
}
Объяснение кода листинга программы
- В функции
SetFileTimeStampUTCпроисходит установка временной метки файла. - Параметры функции:
pszFile: указатель на имя файла.rBaseUTC: объект типаFILETIME, содержащий базовую временную метку в формате UTC.iDelayMin: значение задержки в минутах.iDelaySec: значение задержки в секундах.bDelayRandom: флаг, указывающий, является ли задержка случайной.
- В начале функции открывается файл с помощью функции
OpenFileReadWriteи сохраняется его дескриптор в переменнойhFile. Если файл не может быть открыт, то возвращаетсяfalseи код прекращает выполнение. - Далее создается переменная
FileTime64типаunsigned __int64, которая будет использоваться для хранения временной метки файла. - С помощью функции
memcpyв переменнуюFileTime64копируются байты из объектаrBaseUTC. - Затем вычисляется приблизительное количество секунд задержки путем умножения значения
iDelayMinна 60 и добавления значенияiDelaySec. - Если флаг
bDelayRandomустановлен вtrue, то к полученному значению добавляется случайное значение от 0 до 30 секунд. - Далее случайным образом вычисляется значение задержки в миллисекундах в диапазоне от 0 до 10000 миллисекунд.
- Затем создается переменная
iShiftтипа__int64, которая будет использоваться для смещения временной метки файла. - В
iShiftсначала устанавливается байтовое представление значения 10 миллионов (10000000) умноженного на значение задержки в секундах (iApxSec), а затем добавляется байтовое представление значения 10 тысяч (10000) умноженного на значение задержки в миллисекундах (iApxMSec). - Значение
iShiftдобавляется к переменнойFileTime64. - Создаются три объекта типа
FILETIME:CreationTime,LastAccessTimeиLastWriteTime, которые будут использоваться для установки временных меток файла. - С помощью функции
memcpyв каждый из объектов копируются байты из переменнойFileTime64. - В функцию
SetFileTimeпередаются дескриптор файла и объектыCreationTime,LastAccessTimeиLastWriteTimeдля установки временных меток файла. - В конце функции дескриптор файла закрывается с помощью функции
CloseHandle, после чего он становится недействительным. - Возвращается значение
true, если все операции были выполнены успешно, иfalseв противном случае.