![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
chozen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 14.8.2006 Репутация: нет Всего: нет |
Господа!
Имеется некий условный проект. Он содержит отрисовщик мат выражений. Вопрос заключается в следующем: как проверить необходимость отрисовки скобок в выражении. Рассмотрим два примера для наглядности: 1. "(2+3)/1" Здесь скобки при отрисовке не обязательны (в принципе, даже не желательны). 2. "2/(1-5)^2" Соответственно, скобки нужны, так как определяют приоритет выполнения. Любые идеи приветствуются. У меня имеются лишь догадки в сторону построения двоичных деревьев и некислой работы с приоритетами. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
chozen, в обоих вариантах отображение скобок обязательно. С другой стороны, если ты написал парсер математических выражений, который может понять, что в знаменателе стоит 1 и можно убрать операцию деления, то тогда вперед.
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
почему в первом случае скобки не нужны?
потому что результат одинаковый? имхо, такой подход не правильный скобки нужны для приоритезации Добавлено @ 17:22 если все же ты собрался "убирать" скобки по принципу эквивалентности результатов то можно попробовать такой алгоритм рекурсивно убираем смежные пары скобок, далее через ОПЗ вычисляем выражение если результат совпал с результатом вычисления исходного выражения, то заменяем исходное выражение полученным и т. д Это сообщение отредактировал(а) MAKCim - 5.1.2008, 17:24 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
chozen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 14.8.2006 Репутация: нет Всего: нет |
Спасибо всем за быструю реакцию, но, видимо я неверно выразился.
Под "отрисовкой" я понимаю, и, соответственно, реализую, графическое отображение символов, где операция "деление" обозначается как черта, отделяющая вертикально расположенные числитель и знаменатель. Тогда в первом случае скобки не нужны. Хорошо, такой пример "((2+2))". Скобки не нужны ))) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
В этом случае надо сократить одну пару скобок. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
это мы видим а нужен алгоритм ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Как можно работать с символьными выражениями, не строя деревья? Но ничего «нехилого» тут нет, алгоритм элементарный. Оговоримся, что под приоритетом выражения понимаем приоритет оператора, образующего корень дерева этого выражения. Считаем, что константы и применения функций обладают наивысшим приоритетом. Для унарных операций всё просто: скобки вокруг операнда ставятся только если приоритет операнда выше приоритета оператора. Для бинарных алгоритм чуть сложнее: Пусть P — приоритет оператора, Pl и Pr — приоритет левого и правого операндов соответственно. ЕСЛИ ((оператор левоассоциативный ИЛИ коммутативный) И Pl >= P) ИЛИ Pl > P ТОГДА вывести левый операнд без скобок, иначе в скобках. ЕСЛИ ((оператор коммутативный ИЛИ не левоассоциативный) И Pr >= P) ИЛИ Pr > P ТОГДА вывести правый операнд без скобок, иначе в скобках. В случае, если деление выводится графически, достаточно добавить условие, что скобки вокруг операнда деления не ставятся никогда. P.S. На всякий случай: левоассоциативны все арифметические операторы, кроме возведения в степень. Это сообщение отредактировал(а) Void - 5.1.2008, 18:31 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
chozen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 14.8.2006 Репутация: нет Всего: нет |
Thx 2 all, esp 2 Void !
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |