Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Гродненский Форум
22 Июль 2025, 02:27:30
Новости, реклама:
   Главная   Новости Гродно Помощь Игры Календарь Войти Регистрация   Меню
Гродненский Форум > Компьютеры > Программирование
(Модераторы: Админ, barmalei) > Тема:

алгоритм расстановки скобок (и, или) *решен*

Страниц  :   Вниз
  Печать  
Автор Тема: алгоритм расстановки скобок (и, или) *решен*  (Прочитано 3147 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Manodvaravajjana
Гость
« : 31 Май 2010, 17:02:38 »

нужен надёжный алгоритм, если вкратце есть N-полей ввода (HTML INPUT) с M-select'aми (HTML SELECT)

в input вводится текст, в M - выбирается AND или OR.

получится:

a OR
b AND
c OR
d AND
e AND
 
или по другому строчка " a OR b  AND c OR d AND e "
как это перевести в выражение " (a OR b ) AND (c OR d) AND e "
в наличии скриптовый язык PHP
у меня есть самодельный который работает с 8-9 значениями, на больших не пробовал.
хотелось бы научный а не самодельный. спс.
« Последнее редактирование: 01 Июнь 2010, 21:05:48 от Manodvaravajjana » Записан
RILLey_ELf
Гость
« Ответ #1 : 31 Май 2010, 17:20:48 »

студенческая лаба - научный алгоритм...
по бекусу-науру, достаточно сделать:

expr := ELEMENT AND expr
        write( ELEMENT AND expr );
expr := ELEMENT OR expr
        write( '(' ELEMENT OR expr ')' );
expr := ELEMENT
        write( ELEMENT );

вроде должно работать, если я правильно понял задачу
Записан
Manodvaravajjana
Гость
« Ответ #2 : 31 Май 2010, 17:27:27 »

спасибо, попробую осмыслить и перевести на php (с виду ничерта не понятно, нашел на wikipedii http://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0_%D0%91%D1%8D%D0%BA%D1%83%D1%81%D0%B0_%E2%80%94_%D0%9D%D0%B0%D1%83%D1%80%D0%B0 буду читать)  Грустный
институтов не кончалъ
Записан
iddqd
Лёдчег
Почетный гродненец
*****

Репутация: +170/-10
Offline Offline

Пол: Мужской
Сообщений: 2275


Не уйдешь!

Просмотр профиля
« Ответ #3 : 31 Май 2010, 17:38:51 »

че то я не понял
есть выражения, and и or, и надо чтобы оно само дадумалось, как скобки расставить?
Записан
Manodvaravajjana
Гость
« Ответ #4 : 31 Май 2010, 17:41:45 »

че то я не понял
есть выражения, and и or, и надо чтобы оно само дадумалось, как скобки расставить?

да
p.s.: по бекусу науру нифига не понял, но из "самодельного" опыта мой рабочий алгоритм намного сложнее
Записан
RILLey_ELf
Гость
« Ответ #5 : 31 Май 2010, 21:13:46 »

естественно сложнее вы вручную пишите конечный автомат
алгоритм простой: нашли or -  поставили скобки.
т.е.:
1) ищем or
2) ищем справа от него символ отличающийся от пробела,
       если это открывающая скобка - то рекурсивно ищем соответствующую закрывающую скобку;
       если это не открывающая скобка то ищем следующий пробел и там ставим закрывающую скобку
3) аналогично делаем слева

ну если учесть что ВСЕГДА подаются корректные данные
Записан
iddqd
Лёдчег
Почетный гродненец
*****

Репутация: +170/-10
Offline Offline

Пол: Мужской
Сообщений: 2275


Не уйдешь!

Просмотр профиля
« Ответ #6 : 31 Май 2010, 21:31:45 »

так а что, выражение всегда одинаковое?
а если юзер подразумевал
a OR ( b  AND c )  OR ( d AND e )
то как быть?
Записан
Бред Питт
Почетный гродненец
*****

Репутация: +450/-5
Offline Offline

Пол: Мужской
Сообщений: 1773


Просмотр профиля
« Ответ #7 : 31 Май 2010, 23:53:46 »

Алгоритм Рутисхаузера попробуйте (ссылка)
Его немного модифицировать, и нормально будет:
вначале там, где встречается OR, "спускаетесь". Потом идете снизу вверх, попутно оборачивая выражения в скобки.
Записан

Театр закрывается. Нас всех тошнит.
spammer
Почетный гродненец
*****

Репутация: +78/-19
Offline Offline

Пол: Мужской
Сообщений: 1455


Пыхнуть не хотите?

Просмотр профиля
« Ответ #8 : 01 Июнь 2010, 00:14:38 »

если автор хочет скобки вокруг всех OR, то алгоритм прост:

Код:
String str = "a OR b  AND c OR d AND e"; // начальные данные
String result = "true"; // ответ

String[] splits = str.split(" +AND +");
for (String split : splits) {
    result += " AND (" + split + ")";
}

в результате получится ответ вида "true AND (a OR b) AND (c OR d) AND (e)", т.е. то что нужно

если он хочет чего-то другого, пусть объяснит по человечески
Записан
iddqd
Лёдчег
Почетный гродненец
*****

Репутация: +170/-10
Offline Offline

Пол: Мужской
Сообщений: 2275


Не уйдешь!

Просмотр профиля
« Ответ #9 : 01 Июнь 2010, 01:20:35 »

если он хочет чего-то другого, пусть объяснит по человечески
о, верно Улыбка
Записан
spammer
Почетный гродненец
*****

Репутация: +78/-19
Offline Offline

Пол: Мужской
Сообщений: 1455


Пыхнуть не хотите?

Просмотр профиля
« Ответ #10 : 01 Июнь 2010, 09:10:06 »

как вариант еще проще:

Код:
String str = "a OR b  AND c OR d AND e"; // начальные данные
String result = str.replaceAll("(\w+ OR \w+)", "($1)"); // ответ
Записан
Manodvaravajjana
Гость
« Ответ #11 : 01 Июнь 2010, 13:43:56 »

строки вокруг or это я могу поставить, обьясняю:

я делаю поиск по условиям, пользователь выбирает условия и к каждому условию And/Or получается
a=2 OR
b=1 AND
c=6 OR
d=7 AND
e=9 AND
...
и так далее
по этим условиям нужно составить запрос SQL, логика "a OR b  AND c OR d AND e" -> в выражение " SELECT ...  WHERE (a OR b ) AND (c OR d) AND e ..."
собственно так, мой работает смотря "а что там слева" и "а что там справа" + куча regexp'a и if'ов и размером примерно с 2 страницы на 19* мониторе.

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

попробую и другие варианты но они както меньше внушают оптимизм

Цитировать
так а что, выражение всегда одинаковое?
а если юзер подразумевал
a OR ( b  AND c )  OR ( d AND e )
то как быть?
приоритет OR выше AND, (т.е OR в скобках "притягиваются", и области просто склеены AND, крайтие варианты вроде "только OR" или "только AND" вычислаются IF'ами чтобы всё выражение не было вскобках и т.п.)

Записан
spammer
Почетный гродненец
*****

Репутация: +78/-19
Offline Offline

Пол: Мужской
Сообщений: 1455


Пыхнуть не хотите?

Просмотр профиля
« Ответ #12 : 01 Июнь 2010, 13:48:59 »

что значит "a=2 OR" ?


Добавлено: [time]Tue Jun  1 12:54:31 2010[/time]
собственно так, мой работает смотря "а что там слева" и "а что там справа" + куча regexp'a и if'ов и размером примерно с 2 страницы на 19* мониторе.

собственно в этом и заключается квинтэссенция пхп-программирования Смеющийся
« Последнее редактирование: 01 Июнь 2010, 14:19:13 от spammer » Записан
iddqd
Лёдчег
Почетный гродненец
*****

Репутация: +170/-10
Offline Offline

Пол: Мужской
Сообщений: 2275


Не уйдешь!

Просмотр профиля
« Ответ #13 : 01 Июнь 2010, 14:07:57 »

мля, два раза читал, нихера не понял
Записан
Manodvaravajjana
Гость
« Ответ #14 : 01 Июнь 2010, 14:28:12 »

плохо что не понимаете, и плохо что я неумею обьяснять но такова реальность.
всем спасибо за помощ. дерево делать не пришлось, т.к. вложенных скобок нет
вот что у меня получилось благодаря уже кое-какому опыту написание такого на JS'e и регулярных варажениях + ваша помощ, может кому пригодится, всем раздал по "+"   Подмигивающий спасибо!

привожу исходные данные для наглядности, результат (a or b) and (c or d) and e
http://codepad.org/Cxh93xJC


* brackets1.jpg (54,51 Кб, 770x632 - просмотрено 322 раз.)
« Последнее редактирование: 01 Июнь 2010, 14:48:33 от Manodvaravajjana » Записан
RILLey_ELf
Гость
« Ответ #15 : 01 Июнь 2010, 14:46:04 »

codepad.org pastie.org в отпуске Улыбка

плохой у вас код (если это только для учебного примера, в качестве лабы первокурсника)
Записан
Manodvaravajjana
Гость
« Ответ #16 : 01 Июнь 2010, 14:49:32 »

codepad.org pastie.org в отпуске Улыбка

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

чем плох то  Подмигивающий

p.s. только не баньте за "приватные" сообщения а то и так уже карточек выше крыши
p.p.s видел бы ты код yahoo первокурсники отдыхают
Записан
RILLey_ELf
Гость
« Ответ #17 : 01 Июнь 2010, 14:55:52 »

тем, что его никто читать не станет Улыбка

где:
1) нормальные именования переменных;
2) комментарии;
3) вместо массива-массивов нужно делать класс;
4) переменная in_bracket вообще непонятно что делает, судя по логике
5) проверка p[$i+1] - вообще жесть

хотя учитывая ваш входной набор данных, я не понимаю что делает ваша программа (зачем последний AND) ?
Записан
Manodvaravajjana
Гость
« Ответ #18 : 01 Июнь 2010, 15:04:49 »

тем, что его никто читать не станет Улыбка

где:
1) нормальные именования переменных;
2) комментарии;
3) вместо массива-массивов нужно делать класс;
4) переменная in_bracket вообще непонятно что делает, судя по логике
5) проверка p[$i+1] - вообще жесть

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

* in_bracket вообщето boolean true/false, но короче написать ++/--
* p[$i+1] тоже сокращение чтобы поменьше букаф

а так да конечно, во всём согласен, грешен   Улыбка
Записан
Страниц  :   Вверх
  Печать  
 
Перейти в:  

Войти
Войдите, чтобы добавить комментарий

Войдите через социальную сеть

Имя пользователя:
Пароль:
Продолжительность сессии (в минутах):
Запомнить:
Забыли пароль?

Контакт
Powered by MySQL Powered by PHP Мобильная версия
Powered by SMF 1.1.20
SMF © 2006-2025, Simple Machines
Simple Audio Video Embedder
| Sitemap
Valid XHTML 1.0! Valid CSS!
Страница сгенерирована за 0,147 секунд. Запросов: 20.