вычисление выражения в строковой форме, содержащей переменные в Java

1

Я использовал EvalEx (https://github.com/uklimaschewski/EvalEx) и модифицировал его, чтобы сделать калькулятор без пакетов, таких как математика. так что теперь он может получить вход в форме строки от пользователя и распечатать результат.

как это:

Enter an Expression: ADD(DIV(SIN(FACT(3)),CEIL(TAN(MUL(1.5,FIB(4))))),GCD(2,10)) 
The Result is: 1.94    

теперь пользователь вводит выражения, содержащие переменные вместо констант

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))    

и общий код должен работать, как показано ниже при запуске:

Enter an Expression: ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     
Enter Variables: X1,X2,Y    
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94        

обратите внимание, что пользователь сначала вводит выражение, а затем сообщает машине, что такое переменные (как в "введите переменные: x1, x2, y"), также я должен использовать объектные концепции программирования (поэтому каждая функция выражения и его константы или переменные должны храниться как объект)

так как я могу изменить существующий код из EvalEx, чтобы программа могла идентифицировать переменные?

Теги:
string
variables
parsing
expression

1 ответ

1

Вы можете настроить Map<String, Double> которая связывает имена переменных с такими значениями:

Map<String, Double> values = new HashMap<String, Double>();
values.put("X", 13.5);
values.put("Y", -3);

Затем вы можете заменить все переменные в выражении соответствующими значениями, например:

for (Map.Entry<String, Double> entry : values.entrySet())
    expression = expression.replace(entry.getKey(), entry.getValue().toString());

Затем вы можете просто применить метод, который вы уже написали, к expression.

Этот подход прост, но не очень надежный. Например, если одним из имен имен переменных является "C" вы испортите функцию "CEIL". По этой причине вы можете настаивать на том, чтобы все переменные начинались с "_" или чего-то подобного.

  • 0
    спасибо за ваш ответ, но можете ли вы рассказать мне по-другому, не используя карту и hashmap? Было бы намного лучше, если бы я мог сделать это, изменив метод eval в EvalEx, так как я должен избегать использования пакетов. На самом деле я ищу способы заставить код работать без каких-либо подготовленных пакетов, таких как map, math и т. Д. (За исключением необходимых, таких как java.lang конечно)
  • 0
    Вам не нужно использовать HashMap . Вместо этого вы можете использовать пару массивов ( String[] для имен переменных и double[] для соответствующих значений). Но я не знаю, что вы имеете против Map - это в java.util, так что это вряд ли экзотика! Если вы хотите, чтобы мы помогли вам изменить код для EvalEx вам нужно будет включить код для этого метода в ваш вопрос.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню