Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нобходимость отрисовки скобок 
:(
    Опции темы
chozen
  Дата 5.1.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.8.2006

Репутация: нет
Всего: нет



Господа!

Имеется некий условный проект. Он содержит отрисовщик мат выражений. Вопрос заключается в
следующем: как проверить необходимость отрисовки скобок в выражении.

Рассмотрим два примера для наглядности:
1. "(2+3)/1"
Здесь скобки при отрисовке не обязательны (в принципе, даже не желательны).
2. "2/(1-5)^2"
Соответственно, скобки нужны, так как определяют приоритет выполнения.

Любые идеи приветствуются. У меня имеются лишь догадки в сторону построения двоичных деревьев и некислой работы с приоритетами. 
PM MAIL   Вверх
bsa
Дата 5.1.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



chozen, в обоих вариантах отображение скобок обязательно. С другой стороны, если ты написал парсер математических выражений, который может понять, что в знаменателе стоит 1 и можно убрать операцию деления, то тогда вперед.
PM   Вверх
MAKCim
Дата 5.1.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



почему в первом случае скобки не нужны?
потому что результат одинаковый?
имхо, такой подход не правильный
скобки нужны для приоритезации

Добавлено @ 17:22
если все же ты собрался "убирать" скобки по принципу эквивалентности результатов
то можно попробовать такой алгоритм
рекурсивно убираем смежные пары скобок, далее через ОПЗ вычисляем выражение
если результат совпал с результатом вычисления исходного выражения, то заменяем исходное выражение полученным
и т. д

Это сообщение отредактировал(а) MAKCim - 5.1.2008, 17:24


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chozen
Дата 5.1.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.8.2006

Репутация: нет
Всего: нет



Спасибо всем за быструю реакцию, но, видимо я неверно выразился.
Под "отрисовкой" я понимаю, и, соответственно, реализую, графическое отображение символов,
где операция "деление" обозначается как черта, отделяющая вертикально расположенные числитель и знаменатель. Тогда в первом случае скобки не нужны.

Хорошо, такой пример "((2+2))". Скобки не нужны )))
PM MAIL   Вверх
bsa
Дата 5.1.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(chozen @ 5.1.2008,  17:30)
Хорошо, такой пример "((2+2))". Скобки не нужны )))

В этом случае надо сократить одну пару скобок.
PM   Вверх
MAKCim
Дата 5.1.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  5.1.2008,  17:37 Найти цитируемый пост)
В этом случае надо сократить одну пару скобок. 

это мы видим
а нужен алгоритм  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Void
Дата 5.1.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(chozen @  5.1.2008,  19:13 Найти цитируемый пост)
У меня имеются лишь догадки в сторону построения двоичных деревьев и некислой работы с приоритетами.  

Как можно работать с символьными выражениями, не строя деревья? Но ничего «нехилого» тут нет, алгоритм элементарный.

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

Для унарных операций всё просто: скобки вокруг операнда ставятся только если приоритет операнда выше приоритета оператора.

Для бинарных алгоритм чуть сложнее:
Пусть 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
PM MAIL WWW GTalk   Вверх
chozen
Дата 5.1.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.8.2006

Репутация: нет
Всего: нет



Thx 2 all, esp 2 Void !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.