Определение состояния объекта, на основе текущего числа и дня
Проблема:
Есть объект, который может менять свое состояние (объекта нет, объект есть, объект функционирует, объекта нет)
1. В первый понедельник месяца объект меняется свое состояние на "объект есть", переходя из состояния "объекта нет".
2. На 4 день после первого понедельника в месяце (четверг), объект меняет свое состояние на "объект функционирует" из состояния "объект есть"
3. На 7 день после первого понедельника в месяце (воскресение), объект исчезает
Пока я ничего не могу придумать лучше, кроме как узнавать текущий день недели и число, подневно откатываться к первому числу, таким образом определяя что за день был у первого числа, далее идти подневно к концу месяца, и с учетом текущего числа и дня определять какое состояние должно быть у объекта.
Или... может в с++ есть способы узнать каким днем недели было первое число текущего месяца? А все равно прийдется теперь вперед по месяцу подневно тащиться
Прога работает не постоянно и ничего хранить не может, да и не должна. Т.е. каждый раз при запуске она должна определить, в каком из состояний сейчас должен находиться объект.
К примеру запустили прогу на второй день после первого понедельника, прога поняла - ага, так объект должен быть в состоянии "объект есть", запустили в субботу - "объект функционирует".
Запустили через две недели после первого понедельника, прога поняла что "объекта нет"
Пишется все это дело на чистом с++, к сожалению никаких крутых объектов типа Date нет.
Може кто посоветовать алгоритм более изящный, чтобы не надо было по месяцу туда сюда подневно ходить?
Ну тогда возьмите какую-либо "начальную" дату и узнайте день недели в ней (пусть будет понедельник). Потом находите разницу между сегодняшней и начальной датой, и берете остаток от деления на 7 - получается день недели.
UPD: таким образом можно узнать день недели в первое число месяца, после этого легко узнать первый понедельник месяца (день недели мы уже знаем, узнать сколько осталось до понедельника это 7 - x).
Ну и т.д.
вон есть к примеру месяц назовем его январь
1 число - среда (объекта нет)
2 число - четверг (объекта нет)
3 число - пятница (объекта нет)
4 число - суббота (объекта нет)
5 число - воскресение (объекта нет)
6 число - понедельник !!! (объект есть)
7 число - вторник !!! (объект есть)
8 число - среда !!! (объект есть)
9 число - четверг !!! (объект функционирует)
10 число - пятница !!! (объект функционирует)
11 число - суббота !!! (объект функционирует)
12 число - воскресение !!! (объект функционирует)
13 число - понедельник (объекта нет)
14 число - вторник (объекта нет)
15 число - среда (объекта нет)
16 число - четверг (объекта нет)
17 число - пятница (объекта нет)
18 число - суббота (объекта нет)
19 число - воскресение (объекта нет)
... (объекта нет)
Все смены состояния объекта происходят только в первую неделю месяца, начинающуюся с первого понедельника в месяце (6 число)
2) задача подходит под паттерн автомат состояний, алгоритм работы может выглядеть так
а) при получении управления объект восстанавливает свое прежнее сстояние (или если такового нет получает "начальное" состояние), из БД, из файла и т.п.
б) происходит переход в следующее состояние в соответствии с логикой,
в) происходит выполнение логики состояния.
Цитата: Lei fang
Мне надо не только определить по дате день недели, но еще и узнать встречался ли такой день недели в месяце уже
Я обновил свой коммент, добавил про определение первого понедельника месяца.
Цитата: hardcase
1) вам нужен хороший тип даты, заточенный под ваши нужды - определение дней недели, номер дня недели в месяце и прочее.
2) задача подходит под паттерн автомат состояний, алгоритм работы может выглядеть так
а) при получении управления объект восстанавливает свое прежнее сстояние (или если такового нет получает "начальное" состояние), из БД, из файла и т.п.
б) происходит переход в следующее состояние в соответствии с логикой,
в) происходит выполнение логики состояния.
2) задача подходит под паттерн автомат состояний, алгоритм работы может выглядеть так
а) при получении управления объект восстанавливает свое прежнее сстояние (или если такового нет получает "начальное" состояние), из БД, из файла и т.п.
б) происходит переход в следующее состояние в соответствии с логикой,
в) происходит выполнение логики состояния.
Можно кстати и инкапсулировать эту логику в отдельный класс. Только на счет автомата состояний не соглашусь - здесь простая логика переходов и всего три состояния... Можно просто парой if-ов обойтись
Код:
Ну тогда возьмите какую-либо "начальную" дату и узнайте день недели в ней (пусть будет понедельник).
Я взял 1 января 2010 года и это была пятница
Код:
Потом находите разницу между сегодняшней и начальной датой,
Сегодняшняя дата 10 января (и это воскресение). Значит разница между сегодняшней датой и начальной 10 - 1 = 9 дней
Код:
и берете остаток от деления на 7 - получается день недели.
делим 9 на 7 получаем 1.2857142857142857142857142857143
округляем допустим даже до 1.3, но 3 это никак не воскресение
Что я делаю не так?
Цитата: Lei fang
Что я делаю не так?
Берете дробную часть, вместо остатка ) Остаток от деления 9 на 7 равен 2.
Код:
int x = 9;
int y = 7;
int z = 9 % 7; // z = 2
int y = 7;
int z = 9 % 7; // z = 2
но 2 это тоже не воскресение )
Цитата: Lei fang
но 2 это тоже не воскресение )
пятница + 2 дня = вокресенье.
Только индексируйте плз дни недели с нуля. (поенедльник = 0 .. воскресение = 6)
Тогда день_недели = (день_недели_первого_числа_месяца + число_которое_интересует - 1) % 7
Цитата: Lei fang
но 2 это тоже не воскресение )
А про struct tm, localtime(), mktime(), gmtime() все забыли, что ли?
К примеру по нажатию кнопки происходит событие Button1ClickSender: TObject как можно определить имя объекта, вызвавшего событие. Можно ли это сделать с помощью Sender?
И ещё, можно ли объектам присваивать свои событияпроцедуры?