Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Определение состояния объекта, на основе текущего числа и дня

408
10 января 2010 года
Lei fang
265 / / 01.10.2005
Здравствуйте. Какая-то мутная задача и ни как не могу придумать нормального алгоритма.
Проблема:
Есть объект, который может менять свое состояние (объекта нет, объект есть, объект функционирует, объекта нет)
1. В первый понедельник месяца объект меняется свое состояние на "объект есть", переходя из состояния "объекта нет".
2. На 4 день после первого понедельника в месяце (четверг), объект меняет свое состояние на "объект функционирует" из состояния "объект есть"
3. На 7 день после первого понедельника в месяце (воскресение), объект исчезает

Пока я ничего не могу придумать лучше, кроме как узнавать текущий день недели и число, подневно откатываться к первому числу, таким образом определяя что за день был у первого числа, далее идти подневно к концу месяца, и с учетом текущего числа и дня определять какое состояние должно быть у объекта.
Или... может в с++ есть способы узнать каким днем недели было первое число текущего месяца? А все равно прийдется теперь вперед по месяцу подневно тащиться

Прога работает не постоянно и ничего хранить не может, да и не должна. Т.е. каждый раз при запуске она должна определить, в каком из состояний сейчас должен находиться объект.

К примеру запустили прогу на второй день после первого понедельника, прога поняла - ага, так объект должен быть в состоянии "объект есть", запустили в субботу - "объект функционирует".
Запустили через две недели после первого понедельника, прога поняла что "объекта нет"

Пишется все это дело на чистом с++, к сожалению никаких крутых объектов типа Date нет.

Може кто посоветовать алгоритм более изящный, чтобы не надо было по месяцу туда сюда подневно ходить?
1.9K
10 января 2010 года
GreenRiver
451 / / 20.07.2008
Ммм... то есть надо по числу определить день недели?
Ну тогда возьмите какую-либо "начальную" дату и узнайте день недели в ней (пусть будет понедельник). Потом находите разницу между сегодняшней и начальной датой, и берете остаток от деления на 7 - получается день недели.

UPD: таким образом можно узнать день недели в первое число месяца, после этого легко узнать первый понедельник месяца (день недели мы уже знаем, узнать сколько осталось до понедельника это 7 - x).
Ну и т.д.
408
10 января 2010 года
Lei fang
265 / / 01.10.2005
Мне надо не только определить по дате день недели, но еще и узнать встречался ли такой день недели в месяце уже (тобишь первый ли это понедельник в неделе)
вон есть к примеру месяц назовем его январь
1 число - среда (объекта нет)
2 число - четверг (объекта нет)
3 число - пятница (объекта нет)
4 число - суббота (объекта нет)
5 число - воскресение (объекта нет)
6 число - понедельник !!! (объект есть)
7 число - вторник !!! (объект есть)
8 число - среда !!! (объект есть)
9 число - четверг !!! (объект функционирует)
10 число - пятница !!! (объект функционирует)
11 число - суббота !!! (объект функционирует)
12 число - воскресение !!! (объект функционирует)
13 число - понедельник (объекта нет)
14 число - вторник (объекта нет)
15 число - среда (объекта нет)
16 число - четверг (объекта нет)
17 число - пятница (объекта нет)
18 число - суббота (объекта нет)
19 число - воскресение (объекта нет)
... (объекта нет)

Все смены состояния объекта происходят только в первую неделю месяца, начинающуюся с первого понедельника в месяце (6 число)
5
10 января 2010 года
hardcase
4.5K / / 09.08.2005
1) вам нужен хороший тип даты, заточенный под ваши нужды - определение дней недели, номер дня недели в месяце и прочее.
2) задача подходит под паттерн автомат состояний, алгоритм работы может выглядеть так
а) при получении управления объект восстанавливает свое прежнее сстояние (или если такового нет получает "начальное" состояние), из БД, из файла и т.п.
б) происходит переход в следующее состояние в соответствии с логикой,
в) происходит выполнение логики состояния.
1.9K
10 января 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: Lei fang
Мне надо не только определить по дате день недели, но еще и узнать встречался ли такой день недели в месяце уже


Я обновил свой коммент, добавил про определение первого понедельника месяца.

Цитата: hardcase
1) вам нужен хороший тип даты, заточенный под ваши нужды - определение дней недели, номер дня недели в месяце и прочее.
2) задача подходит под паттерн автомат состояний, алгоритм работы может выглядеть так
а) при получении управления объект восстанавливает свое прежнее сстояние (или если такового нет получает "начальное" состояние), из БД, из файла и т.п.
б) происходит переход в следующее состояние в соответствии с логикой,
в) происходит выполнение логики состояния.


Можно кстати и инкапсулировать эту логику в отдельный класс. Только на счет автомата состояний не соглашусь - здесь простая логика переходов и всего три состояния... Можно просто парой if-ов обойтись

408
10 января 2010 года
Lei fang
265 / / 01.10.2005
Эм... я попробовал, но что-то не понял что я делаю не так.

 
Код:
Ну тогда возьмите какую-либо "начальную" дату и узнайте день недели в ней (пусть будет понедельник).

Я взял 1 января 2010 года и это была пятница
 
Код:
Потом находите разницу между сегодняшней и начальной датой,

Сегодняшняя дата 10 января (и это воскресение). Значит разница между сегодняшней датой и начальной 10 - 1 = 9 дней
 
Код:
и берете остаток от деления на 7 - получается день недели.

делим 9 на 7 получаем 1.2857142857142857142857142857143
округляем допустим даже до 1.3, но 3 это никак не воскресение

Что я делаю не так?
1.9K
11 января 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: Lei fang

Что я делаю не так?


Берете дробную часть, вместо остатка ) Остаток от деления 9 на 7 равен 2.

 
Код:
int x = 9;
int y = 7;
int z = 9 % 7; // z = 2
408
11 января 2010 года
Lei fang
265 / / 01.10.2005
но 2 это тоже не воскресение )
276
11 января 2010 года
Rebbit
1.1K / / 01.08.2005
Цитата: Lei fang
но 2 это тоже не воскресение )


пятница + 2 дня = вокресенье.
Только индексируйте плз дни недели с нуля. (поенедльник = 0 .. воскресение = 6)

Тогда день_недели = (день_недели_первого_числа_месяца + число_которое_интересует - 1) % 7

341
12 января 2010 года
Der Meister
874 / / 21.12.2007
Цитата: Lei fang
но 2 это тоже не воскресение )


Алгоритм вычисления дня недели

43K
05 февраля 2010 года
loki231
76 / / 27.09.2009
А про struct tm, localtime(), mktime(), gmtime() все забыли, что ли?
57K
05 марта 2010 года
Optibe
10 / / 03.03.2010
Вобщем у меня вопрос такой, как определить имя объекта, который сгенерировал событие....
К примеру по нажатию кнопки происходит событие Button1ClickSender: TObject как можно определить имя объекта, вызвавшего событие. Можно ли это сделать с помощью Sender?
И ещё, можно ли объектам присваивать свои событияпроцедуры?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог