Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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, ну тут работки много  smile  т.е. не работки а мороки. 
Посмотри готовый http://club.itdrom.com/gallery/gal_program/bisisoft/292.html  может  возьмешь себе пару идей на вооружение.
А в совет к тебе, приходит в голову только один - писать много регулярок  smile 
Цитата(zenit @  20.5.2009,  14:07 Найти цитируемый пост)
чтобы не было ввозможности ввести что-то типа (((())))))

на это 100 %

Автор: NightmareZ 22.5.2009, 16:22
Цитата(Samotnik @  22.5.2009,  16:13 Найти цитируемый пост)
А в совет к тебе, приходит в голову только один - писать много регулярок

Регулярки тут нафик не нужны.

Автор: Samotnik 22.5.2009, 16:25
Цитата(NightmareZ @  22.5.2009,  16:22 Найти цитируемый пост)
Регулярки тут нафик не нужны.


ну я же сказал, что это первое, что пришло в голову  smile 
Я же не настаиваю. Я дал хороший пример,  нормального инженерного калькулятора, можно посмотреть в его код и взять кое-что себе  smile 

Автор: Michael.de 22.5.2009, 22:38
zenit, лучше вместо строки ввода использовать кнопки 0-9, A-F, +, -, *, /, ^, ф-ции и т.д. , а корректность ввода регулировать возможностью клика по кнопке (нажал на "+" - "-", "*" и т.п. становятся неактивными; открыл скобку - закр. скобка неактивна etc.)... т.е. ограничить "креативность" юзера smile
А считать всё выражение придётся находя самую "вложенную" открывающую скобку и считая выражение, находящееся между ней и соотв. закрывающей {примерчик: (..)+((..)-(..)) }. Ну и соответственно в выражении (A+B^C*D) учитываем старшинство операций (2,3,1). smile

P.S. Естественно что A, B, C и D находятся как сочетания символов, находящиеся между разделителями {скобки и всякие там "+"} smile

Автор: Aliance 22.5.2009, 22:52
Не очень понятна целесообразность использования ф-ции eval()?
Данная функция довольно сильно тормозит систему и, если ее можно заменить, настоятельно рекомендованно именно так и поступить.

Автор: Viroman 23.5.2009, 23:28
Цитата

(((())))))*/

А в чём проблема? Считай количество скобок открывающих и закрывающих, не сходится, брысь. Ищи операторы друг за другом, коль имеется, брысь.. По мне, так регулярками больший мозготрах, чем ручками..

Автор: NightmareZ 23.5.2009, 23:56
Цитата(Viroman @ 23.5.2009,  23:28)
Цитата

(((())))))*/

А в чём проблема? Считай количество скобок открывающих и закрывающих, не сходится, брысь. Ищи операторы друг за другом, коль имеется, брысь.. По мне, так регулярками больший мозготрах, чем ручками..

Фёдор, ты не прав. Твоя метода на такое расположение скобок ))(( скажет, что они правильные, а это не так.
Тут нужно стек завести. Потом перебираем по порядку скобки:
  • Если скобка открывающая, кидаем её в стек.
  • Если скобка закрывающая вытаскиваем из стека открывающую скобку.
  • Если скобка за и стек пуст, значит расположение скобок неправильное.
  • Если скобки закончились и стек пуст, значит расположение скобок неправильное.
  • Если скобки закончились и стек пуст, значит всё ок.

З.Ы. Этот алгоритм подходит, когда могут быть сразу несколько типов скобок, например: [, ], (, ), {, }. Если же скобки только одного типа могут быть, можно обойтись без стека, а юзать лишь счётчик.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)