Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  08:52[Войти] | [Зарегистрироваться]
Ответ на вопрос № 34173

01-08-2005 08:46
всем привет

возникла заморочка при разработке программулины
проблема вот в чем

есть три параметра, которые программа должна проверять и если они удовлетворяют заданным требованиям, то выполнить предписанное действие.

заморочка в том, что нужно учитывать абсолютно все возможные состояния параметров. Т.е. если три параметра то самый простой ( но не оптимальный вариант ) это описать девять вариантов для учета всех состояний переменных.

Возможно, что количество параметров может измениться ( увеличться - уменьщиться ) следовательно жесткий алгоритм не подходит

Народ кто знает как быть посоветуйте

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

  >> Обсуждение закрыто <<  

Комментарий модератора:
Вопрос закрыт за систематическое нарушение автором правил Круглого стола.
модератор: Антон Григорьев



07-11-2005 03:20
А PH и userk - одно и то же лицо?

Да, одно и то же.

Новые вопросы здесь принято задавать в новой ветке, а не как продолжение обсуждения.

Дело в том, что userk aka PH просто достал всех модераторов. Ему сто раз объясняли, что нельзя задавать один и тот же вопрос по несколько раз, а он задавал один вопрос по 4-5 раз в день, да ещё и в течение нескольких дней подряд, и никакие объяснения не действовали. Причём предупреждения он получал, по дороге они не терялись - была ответная реакция. Его несколько раз предупреждали, что если он не будет вести себя по-человечески, то его вопросы вообще перестанут попадать на Круглый стол. На него и это не подействовало. В конце концов наше терпение лопнуло и мы привели угрозу в исполнение, так что теперь этому человеку не остаётся ничего другого, кроме как задавать новые вопросы в своих старых ветках. Впрочем, эту лазейку я сейчас тоже прикрою.

P.S. Самое интересное, что этот userk не очень любит, когда ему приходят лишние ответы - см., например, как он огрызнулся на Python'а здесь: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=34871  Но соблюдать те правила, соблюдение которых он хочет от других, сам он явно не собирается.

06-11-2005 05:31
А PH и userk - одно и то же лицо? Оба отвечают как авторы вопроса... по смыслу постов, конечно...
>>> форма была как фон рабочего стола

if Message.Msg = WM_WINDOWPOSCHANGING THEN // как сделать форму фоновым рисунком
PWindowPos(Message.LParam)^.hwndInsertAfter:=HWND_BOTTOM;


04-08-2005 07:10
Новые вопросы здесь принято задавать в новой ветке, а не как продолжение обсуждения. Так удобнее.

04-08-2005 04:14 | Сообщение от автора вопроса
если есть желание помочь, то имеется свежая трабла

пишу программу и нужно что бы форма была как фон рабочего стола ( т.е. на заднем плане ), т.е. открываемые папки, софт и т.п. были поверх моей формы.
           
если несложно дай ссылку, где можно об этом почитать или хотя бы вкратце поясни по её работе


04-08-2005 04:11 | Сообщение от автора вопроса

:) 5 баллов, ага чтобы задающие вопрос не расстреляли!


просьба не обольщаться, а внимательно читать посты

  я вроде сказал, что проблему решил ( примитивно, но самое главное пашет и народ вроде как прогой доволен )

04-08-2005 02:45
разве я не прав?

:) 5 баллов, ага чтобы задающие вопрос не расстреляли!

03-08-2005 15:03
...через час его расстреляют если он не решит её, то 59 минут он будет узнавать постановку задачи, точную четкую и минимально необходимую

Fisher наконец понял, зачем здесь выдают пуленепробиваемые щиты ;-)



03-08-2005 10:56
какие-то обрывки мыслей запечетлены, понять невозможно, как можно дать ответ на вопрос: будет бульшое дерево? Где? меня уже предупредили за псевдомат, его не было но предупредили, а слов нехватает, я еще на работе такие задачи решаю, так хоть выразиться можно.

в каком месте дерево?

сделайте цикл в цикле на наличие параметров не более 32:

for: params
for: MyList begin
  если елемент из Params есть в MyList и нет во флагах - добавили флаг и удалили из MyList;
end;

MyList - копия списка "понимаемых" параметров.
Params - списак переданных параметров.
дальше со включенными флагами работаем в программе, есть число что хотим то и делаем, биты проверили, по биту можно узнать что за параметр в MyList, помоему с каждым постом задача не сводится к минимальной а наоборот. уточняющие данные должны упростить задачу а не усложнять.

дайте плиззз точное определение задачи. если Энштейну задать задачу и сказать что через час его расстреляют если он не решит её, то 59 минут он будет узнавать постановку задачи, точную четкую и минимально необходимую.

03-08-2005 10:45
в каком месте оно будет большое?
будет число не 3 а 19 например

03-08-2005 09:57 | Сообщение от автора вопроса

параметр_1 и параметр_3 - дает число 5,
параметр_2 и параметр_3 дает число 6
и т.д., далее по тексту,


параметр_1
    +
параметр_2
    =
  дает 3

весь гимор обыкновенного перечисления требует еще и перекрестных вариантов :( ( т.о. при 4 - 5 вариантах такое дерево будет ОООчень большое )





03-08-2005 08:21
Хотя я так и не понял, о чем речь, попробую сформулировать задачу и посоветовать наобум типовое решение.

Итак, в программе зашито некоторое количество "действий" (подпрограмм). Программа может принимать через командную строку некоторое число параметров, скажем от 0 до 10. Параметры неименованные, различаются просто по порядку. Пропуск параметра при необходимости указывается каки-то волшебным словом вроде UNDEF.

В зависимости от набора параметров и их значений, программа должна выполнить одно "действие". Настройка логики должна быть максимально гибкой, без перекомпиляции программы при добавлении новых параметров.

Решение: Предлагается вынести конфигурирование логики действий во внешний файл. Например, это может быть таблица с полями вида p1,p2,p3..p10, и ActionName. При заполнении учитываются все наборы параметров, имеющие смысл.

При запуске программа смотрит, что ей передали, и ищет в таблице строку с таким набором параметров. Если найдено - запускает соответствующее "действие", иначе вопит.

Чтобы тупо не перечислять абсолютно все комбинации параметров, в таблице можно использовать маски или элементы регулярных выражений для описания общих случаев.

В качестве таблицы удобно использовать ClientDataSet, сохраненный на диск. Для конфигурирования можно сделать отдельную утилитку с DBGrid-мордой.

Для максимальной гибкости, "действия"-подпрограммы можно реализовывать отдельными DLL-ками, и подкладывать их в определенный каталог.

Вопрос автору: Такое нужно было, или нет?

PS. Но зачем это надо - ума не приложу. Жуткая помесь Бейсика с COMMAND.COM-ом ;-)

03-08-2005 07:28
параметр_1 и параметр_3 - дает число 5,
параметр_2 и параметр_3 дает число 6
и т.д., далее по тексту,

case-ом, проверяешь для каждого сочетания или для разных комбинаций те или иные действия.

просто ты говоришь о параметрах, неясно каких, откуда взявшихся, потом еще недоволен объяснением. четче объяснишь задачу, более подходящий получишь ответ.

03-08-2005 07:24
"есть три параметра, которые программа должна проверять и если они удовлетворяют заданным требованиям, то выполнить предписанное действие."

1) ок! какие параметры?
2) как ты передаешь параметры?
3) откуда Exe узнает количество параметров,
4) как узнать что параметр использован без IF
5) описано в моём коде как тебе узнать ФСЕ комбинации твоих параметров. если сообразил.

03-08-2005 07:18 | Сообщение от автора вопроса

чета у меня с головой:

intSet := 0;
For i := 1 to ParamCount do
if 'PARAM_1' = UpperCase(Paramstr(i)) then intSet := intSet or 1 else
if 'PARAM_2' = UpperCase(Paramstr(i)) then intSet := intSet or 2 else
if 'PARAM_3' = UpperCase(Paramstr(i)) then intSet := intSet or 4;...
это при загрузке, остальное - cas


я кажется русским по белому двадцать раз сказал, что дерево ифов меня не интересует - селектор тем более каждый параметр имеет свои значения( зачем для элементарных вещей еще приводить код )

03-08-2005 04:03
чета у меня с головой:

intSet := 0;
For i := 1 to ParamCount do
if 'PARAM_1' = UpperCase(Paramstr(i)) then intSet := intSet or 1 else
if 'PARAM_2' = UpperCase(Paramstr(i)) then intSet := intSet or 2 else
if 'PARAM_3' = UpperCase(Paramstr(i)) then intSet := intSet or 4;...
это при загрузке, остальное - case

03-08-2005 03:15
можно еще при загрузке формы циклом искать параметры и заполнять множество, потом по всей программе у тебя есть готовое множество уже не строк, работать шустрее и проверка проще организована:
if ParamSet * [Param_1, Param_2] = [Param_1, Param_2] then
или так-же циклом идёшь по всем параметрам: набавляешь к целому числу нужные биты:


intSet := 0;
For i := 1 to ParamsCount do
if 'PARAM_1' = UpperCase(Paramstr(1)) then intSet := intSet or 1 else
if 'PARAM_2' = UpperCase(Paramstr(1)) then intSet := intSet or 3 else
if 'PARAM_3' = UpperCase(Paramstr(1)) then intSet := intSet or 4;...



intSet - глобальная переменная, в Private поле формы.
далее в программе используешь
case intSet of
  1: ...
  2: ...
  4,6 : ...
  else ...
end;

надеюсь этот бред будет полезен кому-нть.

02-08-2005 22:19 | Сообщение от автора вопроса

Если нет, и мы согласня на перекомпиляцию, то чем все-таки не устраивает развесистое дерево if-else?


именно так пока и реализовал



02-08-2005 09:03
Возможно, что количество параметров может измениться ( увеличться - уменьщиться ) следовательно жесткий алгоритм не подходит

Должна ли программа позволять изменять количество параметров без перекомпиляции ее?

Если да, то как предполагается описывать требуемые "действия" (кстати, что они собой представляют?), соответствующие комбинациям, появившимся при добавлении параметров?

Если нет, и мы согласня на перекомпиляцию, то чем все-таки не устраивает развесистое дерево if-else?

И что это все-таки за задача? Всеобщий менеджер всего? ;-)

01-08-2005 11:56
Может тебе подойдут перечисляемые типы и множества?
Например:
type
  TProgStates = (psStateA, psStateB, psStateC, psStateD);
  TStatesSet = set of TProgStates;
const
  States1: TStatesSet = [psStateA, psStateB];
  States2: TStatesSet = [psStateA, psStateC, psStateD];
  States3: TProgStates = [psStateC, psStateD];
var
  State: TProgStates;
...

if State in States1 then
...
else
if State in States2 then
...
или чего то типа этого

01-08-2005 09:37
Можно использовать какой-нибудь свой тип-наследник от TObjectList, что-то типа
TParamList = class(TObjectList)


Страница избранных вопросов Круглого стола.
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования