2015-05-19 3 views
-4

Как динамически решать математическое выражение, содержащее переменную (может появляться несколько раз).Решить математическое выражение, содержащее переменную

Необходимо выполнить только основные операции (+ - * /).

Пример выражение (x = 10):

4x * (4 - (8/4)) + (5x - (2 * 3)) 
+0

Значение переменной задается априори? Разве вы не должны писать '4 * x' вместо' 4x'? –

+5

Мы не собираемся писать программу для вас. Попробуйте написать его самостоятельно, и если вы застряли, задайте конкретный вопрос о том, за что вы застряли. –

+0

Подсказка - использовать стек во время оценки. –

ответ

4

Shunting Yard algorithm это стандартный алгоритм для разбора математических выражений инфиксных.

1

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

Для чего-то вроде этого, я рекомендую посмотреть на java.util.function. Я бы сделал это, установив сопоставление каждого оператора (*/+ -) с BiFunction, описывающим, как это сделать. Вам также понадобится порядок приоритета, поэтому + не получает более высокий порядок работы, чем *.

Далее вы должны будете создать регулярное выражение, которое вытаскивает внутреннее содержимое круглых скобок, без самих скобок. Построить дерево операторов и их операндов, чтобы преобразовать его в реверсивное обозначение; сделайте это один из сокровенных скобок за один раз. Когда у вас есть упорядоченный набор операций BiFunction и вы можете получить числовое значение, замените круглые скобки на значение и снова сканируйте, пока не останется никаких скобок. Тогда просто закончите дело, решив его самостоятельно.

Как я уже сказал, глоток; но вы в основном смотрите на контекстно-свободную грамматику. Если вам нужна дополнительная информация и много примеров кода (на Java), я на самом деле сейчас работаю над книгой. Вы найдете много моего первоначального материала, без какого-либо окончательного редактирования, по адресу: https://michaelericoberlin.wordpress.com/category/software-language-engineering/

Желаю удачи, я знаю, что это гораздо более крупная сделка, чем кажется.

+0

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

0

Вы можете написать парсер для выражений. Recursive Descent Parser может быть очень прост в реализации, как только у вас есть BNF определение вашего языка выражений:

expression : '-'? term (('+' | '-') term)* 
     term : factor (('*' | '/') factor)* 
    factor : NUMBER | VAR | '(' expression ')' 

    NUMBER : ('0'..'9')+ 
     VAR : 'a'..'z' 
Смежные вопросы