Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/32: Рейтинг темы: голосов - 32, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 04.03.2012
Сообщений: 5

Сложение двух дат

04.03.2012, 11:45. Показов 6337. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день
помогите плиз со сложением двух дат что-то нечё не может прийти в голову как это сделать)


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2012, 11:45
Ответы с готовыми решениями:

Сравнение двух дат и вывод дат находящихся между ними
Здравствуйте! Тут такое дело, вводятся две определенные ДАТЫ в Edit1 и Edit2 в формате ДД.ММ.ГГГГ, нужно найти все ДАТЫ, которые...

Когда пытась расчитать формулой разницу двух дат (формат дат) то получаю !ЗНАЧ сообщение об ошибке
hi all! Почему -то в excel когда пытась расчитать формулой разницу двух дат (формат дат) то получаю !ЗНАЧ сообщение об ошибке....

Сложение 2 дат
Есть 2 таблицы на 2 разных формах. На второй форме в таблицу добавляется значение &quot;Гарантия&quot;. На первой форме при добавлении в...

16
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
04.03.2012, 11:50
Цитата Сообщение от manamax Посмотреть сообщение
сложением двух дат
Как это в общем должно выглядеть?
1
0 / 0 / 0
Регистрация: 04.03.2012
Сообщений: 5
04.03.2012, 11:52  [ТС]
я сам без понятия в задаче вот так написано ))) точнее это вся задача что дана мне больше нече не сказано.

Определите структуру Date для хранения даты:
C
1
2
3
4
5
6
struct Date
{
    unsigned y; //год
    unsigned m; //месяц
    unsigned d; //день
};
Определите следующие функции:

C
1
2
3
4
void GetDate(Date* d); // ввод даты с клавиатуры в формате «дд.мм.гггг»;
void PutDate(Date d); // вывод даты в формате «дд.мм.гггг»;
void AddDate(Date* d1, Date d2); // сложение двух дат (результат помещается в d1);
int DiffDate(Date d1, Date d2); // вычисляет разницу в днях между двумя датами.
Високосными годами можно пренебречь. Для определения количества дней в месяце можно определить следующий массив:
C
1
int M[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
0
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
04.03.2012, 12:26
Могу предложить такой вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void AddDate(Date *d1, const Date d2)
{
   unsigned int M[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
   d1->y += d2.y;
   d1->m += d2.m;
   d1->d += d2.d;
   if (d1->d > M[d1->m])
   {
      d1->d -= M[d1->m];
      d1->m++;
   }
   if (d1->m > 12)
   {
      d1->m -= 12;
      d1->y++;
   }
}
0
0 / 0 / 0
Регистрация: 04.03.2012
Сообщений: 5
04.03.2012, 12:29  [ТС]
о спс биг ща буду пробывать)
0
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
04.03.2012, 12:32
Хотя нет, так не прокатит.
Вот так еще можно, правда громоздко и некрасиво
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void AddDate(Date *d1, const Date d2)
{
   unsigned int M[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
   d1->y += d2.y;
   d1->m += d2.m;
   d1->d += d2.d;
   if (d1->m > 12)
   {
      d1->m -= 12;
      d1->y++;
   }   
   if (d1->d > M[d1->m])
   {
      d1->d -= M[d1->m];
      d1->m++;
   }
   if (d1->m > 12)
   {
      d1->m -= 12;
      d1->y++;
   }
}
1
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 10
15.02.2015, 23:48
manamax,

Привет! В 2012 г. ты искал на форуме подсказку по сложению двух дат и тебе помог kazak. Я пробую собрать вашу прогу, все уже компилится, но результат в консоли- первая введенная дата. В чем котсяк? Второй половиной задачи было вычитание дат.Как решил?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
16.02.2015, 01:34
Цитата Сообщение от azimbambetov Посмотреть сообщение
помог kazak
Во-первых, код неверен - нет учета високосных лет. Во-вторых, правильно складывать не григорианские, а юлианские даты. В-третьих, для расчетов в ограниченном диапазоне дат, можно использовать целочисленный тип (int64) и системные функции для работы с датой. Например, FILETIME, FileTimeToSystemTime, SystemTimeToFileTime итп.
1
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 10
16.02.2015, 22:16
Добавлено через 10 минут
gazlan, а конечного варианта программы той не осталось, прошу прощения за нахальство?
Я пытаюсь изучать , но сообразить как это работает не могу. Правда за этой задачей две еще более неподъемные.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
16.02.2015, 23:01
Цитата Сообщение от azimbambetov Посмотреть сообщение
программы той не осталось
У меня и не было никогда. Как и нужды в ней.

В зависимости от требуемой точности, можно использовать либо перевод в секунды и dostime (двухсекундная точность), либо в миллисекунды и FILETIME (100-наносекундная точность).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 10
16.02.2015, 23:37
gazlan, Спасибо за участие!
Все сложно для меня получается. Я пока не профессионал. )
Применительно для даты-месяца-года (dd.mm.yyyy -формат) в вашем коде по аналогии все решается как для часов-минут-секунд ?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
17.02.2015, 00:03
Идея заключается в переходе от традиционной (неравномерной) временной шкалы (год/месяц/день ...) к линейной шкале (количество 100-наносекундных интервалов с 1 января 1601 г.), выполнению операций сложения/вычитания на этой линейной шкале и обратному переходу к традиционной шкале измерения времени. Функции прямого и обратного перехода поставляются в системных библиотеках. Остается только пересчитать сам прибавляемый/вычитаемый временной интервал в те же единицы линейной шкалы (100-наносекундные интервалы). При этом все расчеты происходят в целых числах, с максимальной доступной разрядностью (unsigned __int64).
  • Минута - 60 сек, час - 3600 сек, сутки - 86400 сек итд.
  • Используете библиотечные функции для перехода от структуры вида год/месяц/день к дате в виде структуры FILETIME (по факту, unsigned __int64).
  • Переводите вашу дельту в число секунд, умножаете на 10000 (100-наносекундная точность) и прибавляете или вычитаете из unsigned __int64.
  • Используете библиотечные функции для обратного перехода и получения даты в виде структуры год/месяц/день итд.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
17.02.2015, 20:52
А, вообще, что должно получиться в результате " сложения дат"?
Вот сегодня 17 февраля 2015, а 8 декабря 1991 образовался СНГ. Если эти две даты сложить, то что получится в результате и какой это имеет смысл?

Добавлено через 51 секунду
Разность дат - это промежуток времени, прошедший между ними. А сумма дат - это что?
1
18.02.2015, 00:19

Не по теме:

Цитата Сообщение от TrueTerm Посмотреть сообщение
А сумма дат - это что?
Видимо, что-то связанное с перемещениями во времени...

0
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 10
18.02.2015, 13:02
TrueTerm, походу получаем временной интервал относительно смещенной относительной точки отсчета даты.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
18.02.2015, 17:11
Т.е. дата(точечная отметка)+интервал(в года\месяцах\днях)? Тогда понятно.
Вообще-то, дата - это тоже некоторый времянной интервал, промежуток с некоторой точки отсчета (эры,эпохи). Например, "сколько лет прошло от рождения И.Христа" или с рождения Ким Ир Сена или с 1 января 1970 года (эра Unix).
0
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 10
19.02.2015, 21:42
Народ!
Прогу сделал по способу manamaxa, рассмотренному выше. Так мне показалось проще. Росту дальше.

Добавлено через 2 минуты
Всем спасибо за обсуждения!
Способ Gazlana очень интересен и профессионален, изучу позже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2015, 21:42
Помогаю со студенческими работами здесь

Сложение дат
Вообщем при складывании дат имеется кусочек: day=day+d1; while (month==1 &amp;&amp; day&gt;31 || month==3 &amp;&amp; day&gt;31 || month==5...

Сложение дат
Привет друзья! Помогите мне с датами. Хочу сложите две даты такого формата Y-m-d H:i:s (2016-02-24 8:40:00). 2016-02-24...

Сложение дат
Подскажите, уже достали эти даты. $subscr_days = '12'; $subscr_date = '2017-02-15'; $end_date = strtotime(+$subscr_days.'...

Сложение дат MySQL
Доброго времени суток, уважаемые! Подскажите пожалуйста, с чем может быть связано следующая ситуация: Добавляем к дате 1 месяц -...

Сложение/вычитание времение и дат
Собственно как сложить/вычесть две даты? Какие функции для этого существуют? Входные данные приходят в строке char. Спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru