Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2011, 19:10   #1
slavikus
Новичок
Джуниор
 
Регистрация: 21.07.2011
Сообщений: 4
По умолчанию диапазон времени действия(сист дата+-14 дней)

Задачка простенькая, поэтому решения не прошу, а только намека на правильное направление . Известны дата рождения (d1) и системная дата (d2). Скидка действует в день рождения и в течение двух недель после. Если d1=d2 то всё понятно....... Но вот эти две недели....Чем то задним чувствую : d2-14дней < d1 < d2+14дней и все в порядке, но как привязать расчет к количеству дней в месяце? И ещё предыдущий, текущий и следующий месяцы?
slavikus вне форума Ответить с цитированием
Старый 21.07.2011, 19:23   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) какой язык программирования?

2) в тексте написано: "Скидка действует в день рождения и в течение двух недель после." Никаких -14 дней, только плюс.

3)
Цитата:
чувствую : d2-14дней < d1 < d2+14дней и все в порядке, но как привязать расчет к количеству дней в месяце?
правильно (примерно) чувствуете...
Код:
if (d2>=d1) and (d2-d1)<=14 then <Скидка действует>
а вот насчёт количество дней в месяце Вы зря беспокоитесь. В любом современной ЯП (как, впрочем, и в БД) существует специальный тип данных: Date или DateTime. С ним можно осуществлять арифметические операции и преобразования в "нормальную" дату. При этом все переходы через количество дней в месяце автоматически учтутся...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.07.2011, 20:43   #3
slavikus
Новичок
Джуниор
 
Регистрация: 21.07.2011
Сообщений: 4
По умолчанию

Большое спасибо за код. Язык VС++. Только меня смущает (d2-d1)<=14. Например, (если d2 = 01.07) а (d1 = 30.06). d2(systime.wDay, systime.wMonth). Пытаюсь узнать как работает DataTime в VC++.

Последний раз редактировалось slavikus; 21.07.2011 в 20:55.
slavikus вне форума Ответить с цитированием
Старый 21.07.2011, 22:00   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

оп-с.. я не знаю ни С, ни С++, ни, тем более MS Visual C++....

я бы мог написать Вам решение на C#, но, боюсь, оно Вам окажется бесполезным.. извините, что не могу помочь конкретным кусочком кода!

там бы я копал в сторону:
Код:
DateTime sdate = Convert.ToDateTime(txtFromDate.Value);
DateTime edate = Convert.ToDateTime(txtToDate.Value);
TimeSpan ts = edate - sdate;
int days = ts.Days;
или так:
Код:
TimeSpan date_difference = date_1.Subtract(date_2);
var total_days = date_difference.TotalDays;

значит так.
1)
Цитата:
Только меня смущает (d2-d1)<=14
если компилятор типы прожуёт, но на 99% работать будет так, как надо.

2) если не прокатит, то попробуйте поискать, есть ли у Вас в вашем VC++ функция DateDiff()...

3) обалденная статья, где рассказывается, как внутри устроены типы данных Дата и Время тут: Date and Time in C++

посмотрите примеры (исходники) тут:
Calculating Duration Between Two Dates in Years, Months and Days - CodeProject
и тут
Calculate Difference Between Two Dates in Day, Week, Month, and Year Parts - CodeProject
может найдёте там что-то полезное..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.07.2011, 22:25   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Известны дата рождения (d1)
В каком виде?
Цитата:
Пытаюсь узнать как работает DataTime в VC++.
DateTime это Билдеровская фича. В VC это может быть обычный Double как и в общем случае. Уточняй задачу. Как дату берешь? Вводищь? КаК?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.07.2011, 22:28   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ТС, на будущее VC++ это среда программирования, часть MSVS(MS Visual Studio)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.07.2011, 22:09   #7
slavikus
Новичок
Джуниор
 
Регистрация: 21.07.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
В каком виде?

DateTime это Билдеровская фича. В VC это может быть обычный Double как и в общем случае. Уточняй задачу. Как дату берешь? Вводищь? КаК?
В идеале, конечно же хотелось бы дату введенную с клавы использовать целиком (дд.мм.гггг) и потом сравнивать её с системной датой ((systime.wDay, systime.wMonth, systime.wYear), но как это все работает я пока не знаю, поэтому наверное буду отдельно сранивать
int(дд) == (systime.wDay)
int (мм) == (systime.wMonth).

Нашел формулу разности двух дат, правда пока не проверял как она работает, да и если честно - неохота изобретать велосипед.
slavikus вне форума Ответить с цитированием
Старый 22.07.2011, 23:14   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Можно посмотреть и в этом направлении: преобразование даты в юлианскую и обратно. Юлианские даты - это просто порядковый номер дня с 1900 г. В этом случае не потребуется сравнивать отдельно дни и месяцы.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 23.07.2011, 00:52   #9
slavikus
Новичок
Джуниор
 
Регистрация: 21.07.2011
Сообщений: 4
По умолчанию

Может вопрос не по теме, но меня, как новичка, волнует вопрос: - где всё таки грань между изобретением "своего" и использованием "чужого"? Мы ведь не делим катет на гипотенузу, когда например пользуемся функцией sin()?
slavikus вне форума Ответить с цитированием
Старый 23.07.2011, 09:45   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
где всё таки грань между изобретением "своего" и использованием "чужого"?
Да нет никакой грани...
Если в данном языке программирования/библиотеках есть нужная функция/нужный тип данных - используете её. Если нет (или, что бывает, к сожалению, достаточно часто - она есть, но Вы про неё не знаете) - тогда используете "суррогат" - т.е. пишете реализацию самостоятельно.

И никаких "граней"

В принципе рост программиста как профессионала и заключается в знаниях, опыте и умении использовать ВСЕ возможности, заложенные в используемом инструменте.

[АНТИОФФТОП]
Вы задачу свою решили-то?..
Цитата:
Нашел формулу разности двух дат, правда пока не проверял как она работает, да и если честно - неохота изобретать велосипед.
Вы не в ту сторону пошли.. Не надо изобретать велосипед, в C++ есть нужные типы данных и функции для работы с ними. Используйте их!

Последний раз редактировалось Serge_Bliznykov; 23.07.2011 в 09:48.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение действия через промежуток времени chingiz Общие вопросы Delphi 37 03.10.2012 11:33
как задать диапазон времени Dmitrys Microsoft Office Excel 3 11.02.2011 16:51
Счетчик обратного действия в режиме реального времени Панчо PHP 1 20.09.2010 20:37
Вычитание дат(дата-дата=кол.дней) zallza Общие вопросы Delphi 1 31.05.2010 22:50
диапазон времени chekanoff БД в Delphi 34 02.03.2008 01:28