Я использовал 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, чтобы программа могла идентифицировать переменные?
Вы можете настроить 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"
. По этой причине вы можете настаивать на том, чтобы все переменные начинались с "_"
или чего-то подобного.
HashMap
. Вместо этого вы можете использовать пару массивов (String[]
для имен переменных иdouble[]
для соответствующих значений). Но я не знаю, что вы имеете противMap
- это в java.util, так что это вряд ли экзотика! Если вы хотите, чтобы мы помогли вам изменить код дляEvalEx
вам нужно будет включить код для этого метода в ваш вопрос.