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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2011, 04:27   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос 3 условия проверки. Оптимизация.

Доброе утро! Интересует оптимизация кода. У меня проверяется три условия. Например так (псевдоусловия):
Код:
 if (A = '+') and (B = '+') and (K = '10') then
 begin
  ...
 end;
 if (A = '+') and (B = '+') and (K = '11') then
 begin
  ...
 end;
 if (A = '+') and (B = '+') and (K = '12') then
 begin
  ...
 end;
 if (A = '+') and (B = '+') and (K = '13') then
 begin
  ...
 end;
 if (A = '+') and (B = '+') and (K = '18') then
 begin
  ...
 end;
Вместо "..." код совершенно одинаковый. Как можно оптимизировать и записать код короче? Параметр К может идти как по порядку, так и нет.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 22.12.2011, 07:04   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

... вынести в отдельную процедуру
Код:
if (A = '+') and (B = '+') then
begin
 if (K = '10') then
 begin
   someproc;
 end;
 if (K = '11') then
 begin
   someproc;
 end;
 if (K = '12') then
 begin
   someproc;
 end;
 if (K = '13') then
 begin
   someproc;
 end;
 if (K = '18') then
 begin
   someproc;
 end;
end;
или
Код:
case StrToInt(K)
10:
11:
...
Не стесняемся, плюсуем!

Последний раз редактировалось artemavd; 22.12.2011 в 07:25.
Slym вне форума Ответить с цитированием
Старый 22.12.2011, 07:19   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Можно пример с case подробнее увидеть?
Добавлено в 12:51:
Вынос в отдельные процедуры не помог.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 22.12.2011 в 07:51.
artemavd вне форума Ответить с цитированием
Старый 22.12.2011, 08:46   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

а подробней некуда после двоеточия твой код
ты весь код приведи или файлом зацепи чтоб окинуть полным взглядом
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 22.12.2011, 08:54   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
if ((A='+')and(B='+')and(K in [10..13,18])) then  //...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2011, 09:34   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Пепел, в категорию у меня возвращается значение их хранимой процедуры sp2 так:
Код:
К:=Form1.sp2.FieldByName('KATEGORIA').AsString;
На запись вида
Код:
if ((A='+')and(B='+')and(K in [10..13,18])) then  //...
ругается при работе программы и говорит, например если к=91 (строковое значение), то пишет сообщение
Цитата:
"91 " is not valid integer value
Писал сообщение об ошибке на память, но, думаю, что смысл ясен.
Как тогда записать-то?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 22.12.2011, 09:43   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
"91 " is not valid integer value
Ну здесь же просто - он ругается что это строка (точнее, что это не число). Ну так ты ее предварительно:
Код:
StrToInt(Trim(K)) in [10..13,18]
Только скорость надо померять, а то из-за преобразований может и потеряешь еще больше...
Дурацкий вопрос, конечно но что за задача и почему она нуждается в оптимизации по скорости? То есть обычно когда начинается экономия на спичках, то возможно стоит пересмотреть вообще сам алгоритм? Попробовать решение по-другому?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 22.12.2011, 09:52   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Ну здесь же просто - он ругается что это строка (точнее, что это не число).
Да, я уже тоже так и понял, что из-за пробелов. Поэтому я написал так:
Код:
...
 k:=Trim(Form1.sp2.FieldByName('KATEGORIA').AsString;
...
а дальше, в условиях пришлось так писать:
Код:
if (А = '+') and (В = '+') and (StrToInt(k) in [51..53,89..99]) then //...
Сейчас код работает и отрабатывает и не выдает той ошибки более.
Цитата:
Дурацкий вопрос, конечно но что за задача и почему она нуждается в оптимизации по скорости? То есть обычно когда начинается экономия на спичках, то возможно стоит пересмотреть вообще сам алгоритм? Попробовать решение по-другому?
Нынешний вариант кода итак является другим решением и самым оптимальным для решения этой задачи . Просто запарка с этим условием. Если кратка, то задача такая: программа обрабатывает поступающие файлы одного типа, запрашивает конфиденциальную информацию из 3 разных баз данных и формирует файлы другого типа на основе полученной информации. Для этого и нужны эти условия. Это третья версия обработчика. С точки зрения логики она является правильной.
Сейчас, когда код отрабатывает, то добавленное условие
Код:
StrToInt(k) in [51..53,89..99]
не влияет на результат формирования...Буду дальше пытаться искать причину этому. Эх..
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 22.12.2011, 09:59   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
k:=Trim(Form1.sp2.FieldByName('KATEGORIA').AsString;
СтрТоИнт надо сюда, а не в условие. Ну попробуй, может быстрей будет (хотя сейчас компиляторы больно умные стали, может и не выиграешь ничего). А вообще можно еще вместо СтрТоИнт свою функу забабахать. Надо посмотреть как она устроена, если без ассемблерных вставок, то можно и ассемблером модернизировать. А можно еще и сделать, чтобы сканила до первого пробела, то есть исключить Трим из присваивания.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 22.12.2011 в 10:01.
Utkin вне форума Ответить с цитированием
Старый 22.12.2011, 10:05   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
СтрТоИнт надо сюда, а не в условие.
Ну дак он у меня и идет в условии.
Цитата:
А вообще можно еще вместо СтрТоИнт свою функу забабахать.
Да не думаю, что дело-то собственно тут в StrToInt. Она всего лишь переводит строку в число, это сделано.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция проверки emal Fok Общие вопросы Delphi 2 06.11.2010 05:25
Продолжение после проверки painkiller Общие вопросы C/C++ 1 17.10.2010 23:43
Реализация проверки орфографии Romirez Помощь студентам 4 26.09.2010 12:51
Макрос проверки ошибок Iskin Microsoft Office Excel 7 09.12.2008 14:00
Система проверки на человека Andrey1433 PHP 2 11.03.2008 14:13