Показать полную графическую версию : алгоритм расчета тасков с повторениями в календарях
Vlad Drakula
19-05-2006, 17:09
ктонибыть может посоветовать: алгоритм расчета тасков с повторениями в календарях ?
я зык не выжен... важен сам алгоритм...
Что такое "таск с повторением в календаре"?
Vlad Drakula
19-05-2006, 21:22
ivank
календарь - тот что АУТЛУК, по другому ежедневник
такс - то что записывают в ежедневник...
Это повторяющееся событие.
А что? Какие проблемы?
Vlad Drakula
20-05-2006, 20:14
Arrest
аы можете предложить такой алгоритм?
скажем есть задача повторяющаяся каждый дет по три раза...
и вот запрашивается эта таска через год после создания...
Vlad Drakula
А в чём проблема? Я до сих пор не могу понять.
Можно хранить для каждого задания набор событий (лучше даже логическое выражение из этих событий), при котором оно наступает. (Т.е. в данном случае "каждый день" И (время1 ИЛИ время2 ИЛИ время3)). А потом просто проверять выполняются эти события для текущего дня или нет.
Vlad Drakula
22-05-2006, 11:10
ivank
так ты можешь привести пример алгоритма, а не туманное его описание?
C++:
#include <dos.h>
typedef struct{
time* evrt; //Время наступления
}event;
int main(){
event times[3];
... //Начало программы и запись данных в times;
time* j;
int q;
bool stop=false;
...//Цикл проверки
while(1){
while(!stop){
gettime(j);
for(q=0; q<3; q++)if((j->ti_min==times[q]->ti_min)&&(j->ti_sec==times[q]->ti_sec)&&(j->ti_hour==times[q])){stop=true;break}
}
}
if(stop)/*Действия на события*/;
}
//Конец программы
Что-то такое ;)
Vlad Drakula
22-05-2006, 15:48
Arrest
а где здесь:
алгоритм расчета тасков с повторениями
Vlad Drakula
Всё зависит от того, какая конуретно нужна функциональность. Вот псевдокод на Питоне:
def get_tasks_for_date(date):
res = []
for task in tasks:
if task.happens_at_date(date):
res.extend(task.get_times_for_date(date))
#т.е. просто дописать в конец списка ещё один
return res
class Task:
def happens_at_date(date):
# Здесь идёт проверка.
# Вычисляется некое выражение.
# Если ежедневное событие - True всегда
# Если еженедельное (напр, по понедельникам), то проверяется
# понедельник ли дата. итд
# Выражения могут быть весьма сложными (напр, проверять таски в другие дни итп)
# Хранить их (выражения) можно либо как синтаксическое дерево, либо в виде
# кода, который потом надо будет проинтерпретировать (благо во всех динамических
# языках есть eval или его аналоги).
def get_times_for_date(date):
# Аналогичным образом определяем список времён, в которые выполняется задание
Это был приведён очень гибкий вариант, который можно по разному кастомизировать, и который в большинстве случаев не нужен :)
В более простом случае (подозреваю, что таски хранятся в базе), можно завести, например, такие таблички:
task:
id
title
-- ещё чё-нить
happens_at:
id -> FK(task)
year
month
day_of_month
week
day_of_week
time
и сделать примерно такой селект:
SELECT DISTINCT id, title, time
FROM task, happens_at
WHERE task.id = happens_at.id
AND year IN (0, $year)
AND month IN (0, month)
AND day_of_month IN (0, $day_of_month)
AND week IN (0, $week)
AND day_of_week IN(0, $day_of_week)
Выбираться это будет не быстро, если заданий достаточно много, но можно же закэшировать где-нибудь :)
Если событие наступает три раза в день, то у нас будет три соответствующих записи, у которых все поля кроме time будут = 0, а time будет указывать время (внутри дня).
Если событие наступает каждый день месяца, то всё = 0 кроме day = 1. Если каждую неделю, то всё = 0, кроме day_of_week = нужному дню. Если два раза в неделю, то просто две разных записи.
Сложнее с отсчётом от конца периода, но этого тоже можно добиться некоторыми извратами (проще всего добавить ещё полей).
Примерно так. Эту структуру тоже можно усложнить. Но нафига? 95% случаев она покроет, я полагаю.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.