возникла заморочка при разработке программулины
проблема вот в чем
есть три параметра, которые программа должна проверять и если они удовлетворяют заданным требованиям, то выполнить предписанное действие.
заморочка в том, что нужно учитывать абсолютно все возможные состояния параметров. Т.е. если три параметра то самый простой ( но не оптимальный вариант ) это описать девять вариантов для учета всех состояний переменных.
Возможно, что количество параметров может измениться ( увеличться - уменьщиться ) следовательно жесткий алгоритм не подходит
Вопрос закрыт за систематическое нарушение автором правил Круглого стола.
модератор: Антон Григорьев
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 Но соблюдать те правила, соблюдение которых он хочет от других, сам он явно не собирается.
какие-то обрывки мыслей запечетлены, понять невозможно, как можно дать ответ на вопрос: будет бульшое дерево? Где? меня уже предупредили за псевдомат, его не было но предупредили, а слов нехватает, я еще на работе такие задачи решаю, так хоть выразиться можно.
в каком месте дерево?
сделайте цикл в цикле на наличие параметров не более 32:
for: params
for: MyList begin
если елемент из Params есть в MyList и нет во флагах - добавили флаг и удалили из MyList;
end;
MyList - копия списка "понимаемых" параметров.
Params - списак переданных параметров.
дальше со включенными флагами работаем в программе, есть число что хотим то и делаем, биты проверили, по биту можно узнать что за параметр в MyList, помоему с каждым постом задача не сводится к минимальной а наоборот. уточняющие данные должны упростить задачу а не усложнять.
дайте плиззз точное определение задачи. если Энштейну задать задачу и сказать что через час его расстреляют если он не решит её, то 59 минут он будет узнавать постановку задачи, точную четкую и минимально необходимую.
Хотя я так и не понял, о чем речь, попробую сформулировать задачу и посоветовать наобум типовое решение.
Итак, в программе зашито некоторое количество "действий" (подпрограмм). Программа может принимать через командную строку некоторое число параметров, скажем от 0 до 10. Параметры неименованные, различаются просто по порядку. Пропуск параметра при необходимости указывается каки-то волшебным словом вроде UNDEF.
В зависимости от набора параметров и их значений, программа должна выполнить одно "действие". Настройка логики должна быть максимально гибкой, без перекомпиляции программы при добавлении новых параметров.
Решение: Предлагается вынести конфигурирование логики действий во внешний файл. Например, это может быть таблица с полями вида p1,p2,p3..p10, и ActionName. При заполнении учитываются все наборы параметров, имеющие смысл.
При запуске программа смотрит, что ей передали, и ищет в таблице строку с таким набором параметров. Если найдено - запускает соответствующее "действие", иначе вопит.
Чтобы тупо не перечислять абсолютно все комбинации параметров, в таблице можно использовать маски или элементы регулярных выражений для описания общих случаев.
В качестве таблицы удобно использовать ClientDataSet, сохраненный на диск. Для конфигурирования можно сделать отдельную утилитку с DBGrid-мордой.
Для максимальной гибкости, "действия"-подпрограммы можно реализовывать отдельными DLL-ками, и подкладывать их в определенный каталог.
Вопрос автору: Такое нужно было, или нет?
PS. Но зачем это надо - ума не приложу. Жуткая помесь Бейсика с COMMAND.COM-ом ;-)
параметр_1 и параметр_3 - дает число 5,
параметр_2 и параметр_3 дает число 6
и т.д., далее по тексту,
case-ом, проверяешь для каждого сочетания или для разных комбинаций те или иные действия.
просто ты говоришь о параметрах, неясно каких, откуда взявшихся, потом еще недоволен объяснением. четче объяснишь задачу, более подходящий получишь ответ.
"есть три параметра, которые программа должна проверять и если они удовлетворяют заданным требованиям, то выполнить предписанное действие."
1) ок! какие параметры?
2) как ты передаешь параметры?
3) откуда Exe узнает количество параметров,
4) как узнать что параметр использован без IF
5) описано в моём коде как тебе узнать ФСЕ комбинации твоих параметров. если сообразил.
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
я кажется русским по белому двадцать раз сказал, что дерево ифов меня не интересует - селектор тем более каждый параметр имеет свои значения( зачем для элементарных вещей еще приводить код )
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
можно еще при загрузке формы циклом искать параметры и заполнять множество, потом по всей программе у тебя есть готовое множество уже не строк, работать шустрее и проверка проще организована:
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;
Возможно, что количество параметров может измениться ( увеличться - уменьщиться ) следовательно жесткий алгоритм не подходит
Должна ли программа позволять изменять количество параметров без перекомпиляции ее?
Если да, то как предполагается описывать требуемые "действия" (кстати, что они собой представляют?), соответствующие комбинациям, появившимся при добавлении параметров?
Если нет, и мы согласня на перекомпиляцию, то чем все-таки не устраивает развесистое дерево if-else?
И что это все-таки за задача? Всеобщий менеджер всего? ;-)
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.