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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2015, 07:58   #1
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
Лампочка Следующие число по расписанию (delphi)

Есть дата последнего использование некоторого объекта в формате TDateTime. Есть недельное расписание (пока не знаю в каком формате хранить). Недельное расписание представляет собой перечисление, в какие дни используется объект, а в какие нет.

Например мы знает что объект используется по понедельникам и средам.
Из даты последнего использования можно извлечь день недели DayOfWeek(дата). Допустим дата была 16.02.2015 - понедельник. Значит следующие использование должно быть 18.02.2015 - среда.

Если бы мы использовали по вторникам и четвергам, и имея дату прошлого использования 17.02.2015 - вторник, то дата следующего использования оставалась бы по прежнему 17.02.2015 - вторник. Т.е. мы его все еще используем.

Подскажите, как мне узнать дату следующего использования, по дате прошлого использования и расписания? Хотя бы идейку подскажите
Simply-Art вне форума Ответить с цитированием
Старый 17.02.2015, 08:40   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я бы перевел все даты в дни недели от 1 до 7 (или от 0 до 6). А дальше простая арифметика - пальцев двух рук вполне хватит. При этом хранил бы их в датах, пересчет только при определении нужно использовать объект или нет.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 17.02.2015, 08:52   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
for d:=currdate+1 to currdate +7 do //перебираем следующие 7 дней за текущим
  if dayofweek(d) in [3, 6] then //попали в расписание
     result:=d; // то что нам нужно
end;
P.S. идея в комментариях, а код чтобы не загромождать идею не рабочий (не те типы данных).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.02.2015 в 08:58.
evg_m вне форума Ответить с цитированием
Старый 17.02.2015, 09:09   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
const a: array[1..3] of Byte = (2,4,6); //вторник, четверг, суббота
var LastDate: TDateTime;
    i,j,Day: Integer;
begin
  LastDate:=EncodeDate(2015,2,16); //16-02-2015
  Day:=DayOfTheWeek(LastDate);
  j:=Low(a);
  for i:=Low(a) to High(a) do
    if a[i]>=Day then begin j:=i; Break; end;
  i:=a[j]-Day;
  if i<0 then Inc(i,7);
  ShowMessage(FormatDateTime('Следующая дата dd-mm-yyyy',LastDate+i));
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.02.2015, 09:31   #5
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию

Константы не подходят, т.к. расписание может меняться, но на идею натолкнули.
Буду хранить расписание в степенях двойки. При загрузки буду подгружать его в массив от 1 до 7 из булевых значений и сделаю простой цикл
Код:
var 
 m:array[1..7] of boolean;
 x,y:byte;
begin
 y:=0;
 while m[x]<>true do
  begin
   inc(x);
   inc(y);
   if x>7 then x:=1;
  end;
end;
где х - день недели последнего использования, а y - через сколько дней будет следующие использование. Думаю задача решена. Если есть еще более простые предложения, пишите.
Simply-Art вне форума Ответить с цитированием
Старый 17.02.2015, 09:45   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ну тогда уж set бахнуть
Poma][a вне форума Ответить с цитированием
Старый 17.02.2015, 09:55   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Константа в примере. Естественно динамический массив в программе, от куда-то данные считываются и в него записываются и степени двойки ни к чему, лучше прозрачно и понятно 1,2,..,7. Код не поменяется, если динамический массив вместо константы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.02.2015, 10:15   #8
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
степени двойки ни к чему, лучше прозрачно и понятно 1,2,..,7.
А в файл как этот массив записывать и считывать, если объектов скажем 20? уж проще степени двойки одной переменной записать, или я опять ошибся?
Simply-Art вне форума Ответить с цитированием
Старый 17.02.2015, 10:28   #9
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

а если двумя переменными то уже перебор?
у человека проблема получения следующего, который тупо на +1 получается, а он про кол-во переменных печется
стримом пишите сразу все можно бахнуть
lomastr_ вне форума Ответить с цитированием
Старый 17.02.2015, 10:28   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
А в файл как этот массив записывать и считывать, если объектов скажем 20? уж проще степени двойки одной переменной записать, или я опять ошибся?
Через StringList естественно. Каждый объект строка, числа записывать через пробел.
Разбор строк в цикле через другой стринглист, где разделителем поставишь не перенос строки, а пробел. Главное на выходе/входе обычный текстовый файл, в котором могут храниться и поясняющая информация
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Воспроизведение видео по расписанию Razyiller Мультимедиа в Delphi 12 03.09.2011 14:13
Очистка файлов по расписанию Anubys PHP 1 31.07.2011 17:59
как поделить число на число в delphi? Даниил_глазко Помощь студентам 13 11.11.2010 16:32
опрос порта по расписанию Joslen_bomon Microsoft Office Excel 2 03.12.2009 21:17
Выполнение скрипта по расписанию Sparky PHP 7 30.10.2009 16:33