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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2010, 00:18   #1
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию Перечисляемые типы. лаконичная запись.

Можно ли лаконичнее записать следующий код:

Код:
if (Value<>$6eaa3f) and (Value<>$75bc8d) and (Value<>$6abdc2) and (Value<>$69aca4) and (Value<>$4f978e) then
например, в виде:

Код:
if Value in [$6eaa3f, $75bc8d, $6abdc2, $69aca4, $4f978e] then
Спасибо.

Последний раз редактировалось SkAndrew; 18.04.2010 в 00:45.
SkAndrew вне форума Ответить с цитированием
Старый 18.04.2010, 09:40   #2
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Код:
if not (Value in [$6eaa3f, $75bc8d, $6abdc2, $69aca4, $4f978e]) then
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 19.04.2010, 00:21   #3
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо, но так :

Код:
if not (Value in [$6eaa3f, $75bc8d, $6abdc2, $69aca4, $4f978e]) then
не работает. Может еще кто-нибудь посоветует как можно значению сослаться на множество конкретных цветов ($6eaa3f, $75bc8d, $6abdc2, $69aca4, $4f978e)?

Спасибо
SkAndrew вне форума Ответить с цитированием
Старый 19.04.2010, 00:24   #4
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Функцию напиши:
function IsValueIn(Value: DWORD; Values: array of DWORD): Boolean;

Вызывать так:
if IsValueIn(Value, [$6eaa3f, $75bc8d, $6abdc2, $69aca4, $4f978e]) then

А первоначальный вариант не прокатит. Элементы множества не должны выходить за пределы типа Byte
Slovinsky вне форума Ответить с цитированием
Старый 19.04.2010, 01:15   #5
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за ответ.

Такой код оптимальный или есть иное решение подобной функции:

Код:
function IsValueIn(Value: DWORD; Values: array of DWORD): Boolean;
     var i : Integer;
begin
  Result := False;
  for i := 0 to High(Values) do
    if Value=Values[i] then
    begin
      Result := True;
      Exit;
    end;
end;
можно как-то без цикла? Мне нужно, чтобы эта проверка проходила как можно быстрее!

Спасибо.

Последний раз редактировалось SkAndrew; 19.04.2010 в 10:34.
SkAndrew вне форума Ответить с цитированием
Старый 19.04.2010, 10:35   #6
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Какая из приведенных ниже функций быстрее или есть еще какое-нибудь решение?

Код:
function IsValueIn1(Value: DWORD; Values: array of DWORD): Boolean;
     var i : Integer;
begin
  Result := False;
  for i := 0 to High(Values) do
    if Value=Values[i] then
    begin
      Result := True;
      Exit;
    end;
end;

function IsValueIn2(Value: DWORD; Values: array of DWORD): Integer;
     var FCount : Integer;
begin
  Result := 0;
  FCount := Length(Values);
  while (Result < FCount) and (Values[Result] <> Value) do
    Inc(Result);
  if Result = FCount then
    Result := -1;
end;
Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 19.04.2010, 11:43   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Среди скольких значений тебе нужно проверять? Если их только пять или десять, как ты привел в примере выше, то напиши элементарные проверки с if. А если возможных значений много и нужно быстро, тогда деревья спасут положение. Почитай про бинарное дерево поиска.

Вобщем опиши подробнее что тебе надо, а мы посоветуем лучший способ.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 19.04.2010, 15:17   #8
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

я понимаю, что бинарный поиск самый быстрый, но он только отсортированном списке работает. а я могу добавлять в множество значения произвольным числом и не по порядку (не сортировано). Может я что-то не понял в Вашем ответе? Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 19.04.2010, 16:40   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
но он только отсортированном списке работает. а я могу добавлять в множество значения произвольным числом и не по порядку (не сортировано)
Для этого нужно использовать самобалансирующееся дерево, например красно-черное. Есть готовые реализации на Дельфи, поищите библиотеки сторонние, вот тут можете почитать.

Если элементов у вас около тысячи не стоит ради этого деревья городить, тут подойдет и простой перебор в цикле. Дерево любит пространство )
Тут еще посмотрите
http://www.programmersforum.ru/showthread.php?t=91215
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 19.04.2010 в 16:44.
mutabor вне форума Ответить с цитированием
Старый 19.04.2010, 20:14   #10
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

SkAndrew, не лови блох. Если у тебя не тысячи элементов, а раз ты их все вручную при вызове функции перечисляешь, то у тебя их не тысячи, то ничего быстрее перебора в цикле ты не придумаешь а главное - для этого нет смысла. У тебя программа из-за цикла жутко тормозит? Или ты считаешь что цикл из 5-ти итерации будет выполняться долго, а проверка if-ом пяти выражений, объединенных and-ом быстро? Открою секрет: если не считать блох, то время выполнение и того и другого примерно одинаково - и там и там 5 сравнений.

Не зацикливайся на мелочах, преждевременная оптимизация - зло, которое губит многих программистов и многие программные продукты. Человекочасы стоят гораздо дороже, чем незаметная глазу разница в эффективности. Вот если у тебя программа начнет тормозить и твои тесты покажут, что этот цикл - узкое место (а все остальное оптимально) - тогда и спроси "а как сделать быстрее?". Но как показывает практика, в 95% случаев программа и так работает быстро, а из оставшихся пяти процентов 99% что узкое место будет не здесь и оптимизировав его можно выиграть 1000% производительности, а оптимизировав маленький цикл - 2-5%. Вот такая арифметика, если любишь считать
Slovinsky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перечисляемые и ограниченные типы. Оператор варианта. Символьный тип. Alex_Gray Помощь студентам 2 14.12.2009 16:45
Типы Skrip Общие вопросы C/C++ 5 14.06.2009 19:24
Ссылочные типы senchakv Паскаль, Turbo Pascal, PascalABC.NET 0 13.06.2009 21:50