Математическое выражение (строка) для числа в Java - PullRequest
5 голосов
/ 13 ноября 2010

Я пытаюсь найти что-то вроде Java Embedded Plugin (JEP), который может оценить математическую формулу (строку) и дать ответ.

Но он также должен вычислять переменную, например: (25 + 36 + x) * 2 = 25 должно дать: x = -11

Немного похоже на http://www.wolframalpha.com/,, но оно не должно быть таким универсальным, и оно должно работать в автономном режиме.

Открытый исходный код является предпочтительным.

Мне это нужно для моего маленького проекта калькулятора, http://sourceforge.net/projects/calex/.

Ответы [ 2 ]

3 голосов
/ 13 ноября 2010

Это называется Arithmetic evaluation.Один из самых простых способов реализовать это - использовать Edsger Dijkstra Shunting-yard_algorithm .

Алгоритм shunting-yard - это метод синтаксического анализа математических уравнений, указанных в инфиксной записи.Он может использоваться для вывода в обратной польской нотации (RPN) или в виде абстрактного синтаксического дерева (AST).Алгоритм был изобретен Эдсгером Дейкстрой и назван алгоритмом «маневрового двора», потому что его работа напоминает работу маневрового участка железной дороги.Как и при оценке RPN, алгоритм шунтирующего двора основан на стеке.Инфиксные выражения - это форма математической нотации, к которой привыкло большинство людей, например 3 + 4 или 3 + 4 * (2−1).Для преобразования есть две текстовые переменные (строки), вход и выход.Существует также стек, в котором хранятся операторы, еще не добавленные в очередь вывода.Чтобы преобразовать, программа читает каждый символ по порядку и делает что-то на основе этого символа.

Но я видел точное решение, которое вы ищете в каком-то блоге пользователя stackoverflow, но я не могу вспомнитьадрес (это было похоже на «код обезьяны»).Это был легкий класс, который вы могли использовать в апплетах (вы также могли определять константы и значения сброса).

Редактировать: Найдено: http://tech.dolhub.com/Code/MathEval

Линейно-рекурсивный математический оценщик

Этот оценщик математических выражений родился из-за необходимости иметь компактное и эффективное решение, которое могло бы достаточно эффективно оценивать произвольные выражения, не требуя предварительной компиляции.Мне нужно было что-то, что делало бы основную математику с переменными, такими выражениями, как «Top + 2», «Bottom-2» и «(Right + 1-Left) / 2».

Исследования в области интернетаряд довольно хороших решений, все из которых вращались вокруг создания деревьев разбора (что имеет смысл).Проблема была в том, что все они были довольно громоздкими, и я не мог позволить себе добавить 100К к размеру моего апплета только для математики.Поэтому я начал задумываться о линейном рекурсивном решении проблемы.Конечным результатом является приемлемо работающий отдельный класс без внешних зависимостей весом менее 10 КиБ.

0 голосов
/ 23 июля 2011

Я выпустил средство оценки выражений, основанное на алгоритме Дайкстры "Маневровый двор" на условиях Apache License 2.0 :

http://projects.congrace.de/exp4j/index.html

...