| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > научный калькулятор |
| Автор: zenit 20.5.2009, 14:07 |
| Друзья, мне нужно модифицировать код калькулятора. Он уже умеет считать функции из строки ввода, но с помощью eval(), соотвественно с теми недостатками, что пользователь может вводить неразрешаемые нелепые строки. Я уже ограничил возможнности ввода, не допуская букв и спец цимволов. Но необходим парзинг ввода относительно скобок и операторов, чтобы не было ввозможности ввести что-то типа (((())))))*/. Вопрос: нужно ли мне реализовать что-то наподомие автомата или грамматики, ведь возмможны унарные и бинарные операторы, мне нужно будет запоминать все блоки в скобках и реагировать на непарные открывающиеся/закрывающиеся скобки. Если у кого-нибудь есть такой скрипт, было бы идеально. Или хотя бы псевдо код для вычисления +, -, *, / , sqart, sq, cos, sin, tan, ln, ехп..Большое человеческое спасибо!!! |
| Автор: NightmareZ 20.5.2009, 14:46 |
| Напишу за $20. |
| Автор: Samotnik 22.5.2009, 16:13 |
| zenit, ну тут работки много Посмотри готовый http://club.itdrom.com/gallery/gal_program/bisisoft/292.html может возьмешь себе пару идей на вооружение. А в совет к тебе, приходит в голову только один - писать много регулярок на это 100 % |
| Автор: NightmareZ 22.5.2009, 16:22 | ||
Регулярки тут нафик не нужны. |
| Автор: Samotnik 22.5.2009, 16:25 |
ну я же сказал, что это первое, что пришло в голову Я же не настаиваю. Я дал хороший пример, нормального инженерного калькулятора, можно посмотреть в его код и взять кое-что себе |
| Автор: Michael.de 22.5.2009, 22:38 |
| zenit, лучше вместо строки ввода использовать кнопки 0-9, A-F, +, -, *, /, ^, ф-ции и т.д. , а корректность ввода регулировать возможностью клика по кнопке (нажал на "+" - "-", "*" и т.п. становятся неактивными; открыл скобку - закр. скобка неактивна etc.)... т.е. ограничить "креативность" юзера А считать всё выражение придётся находя самую "вложенную" открывающую скобку и считая выражение, находящееся между ней и соотв. закрывающей {примерчик: (..)+((..)-(..)) }. Ну и соответственно в выражении (A+B^C*D) учитываем старшинство операций (2,3,1). P.S. Естественно что A, B, C и D находятся как сочетания символов, находящиеся между разделителями {скобки и всякие там "+"} |
| Автор: Aliance 22.5.2009, 22:52 |
| Не очень понятна целесообразность использования ф-ции eval()? Данная функция довольно сильно тормозит систему и, если ее можно заменить, настоятельно рекомендованно именно так и поступить. |
| Автор: Viroman 23.5.2009, 23:28 | ||
А в чём проблема? Считай количество скобок открывающих и закрывающих, не сходится, брысь. Ищи операторы друг за другом, коль имеется, брысь.. По мне, так регулярками больший мозготрах, чем ручками.. |
| Автор: NightmareZ 23.5.2009, 23:56 | ||||
Фёдор, ты не прав. Твоя метода на такое расположение скобок ))(( скажет, что они правильные, а это не так. Тут нужно стек завести. Потом перебираем по порядку скобки:
З.Ы. Этот алгоритм подходит, когда могут быть сразу несколько типов скобок, например: [, ], (, ), {, }. Если же скобки только одного типа могут быть, можно обойтись без стека, а юзать лишь счётчик. |