Вычисление выражений, содержащих функции в Java
Я написал проект, который вычисляет различные функции, такие как синус,MCM и т. Д. Без использования существующих пакетов, таких как математика в Java, теперь я хочу получить выражение от пользователя в виде строки, а затем распечатать результат
лайк:
import java.util.Scanner;
public class Phase2main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String expression ;
double result = 0 ;
System.out.println(" Enter your desired expression from the available functions ");
expression = s.nextLine();
System.out.println("Result is : " + result);
}
}
тогда он должен работать так: введите выражение: ADD(DIV(SIN(FACT(3)),CEIL(TAN(MUL(1.5,FIB(4))))),GCD(2,10)). Результат: 1.94
Как я могу сделать программу для определения моих функций, таких как CEIL и их ввода? Я проверил многие из подобных вопросов, но те, которые я нашел, скорее библиотеки, которые слишком сложны для меня, чтобы понять или выполнить основную арифметику без определения функций и их входных данных.
так как я могу написать простой оценщик для этой конкретной проблемы?
3 ответа
Может быть, использовать интерпретатор JavaScript?
Сначала создайте экземпляр движка и init:
// Manager creates engines by mime/language names.
// It has own global scope for engiges created by it.
ScriptEngineManager manager = new ScriptEngineManager();
// Create JavaScript interpreter instance.
// (Nashorn is bundled JavaScript interpreter)
ScriptEngine scope = manager.getEngineByName("JavaScript");
// Define functions you need
String initialScript = "cos = Math.cos;" // ; or \n
+ "sin = Math.sin;"
+ "tg = Math.tan;"
+ "PI = Math.PI;"
// Any other function
+ "ctg = function (x) { return cos(x)/sin(x); };";
// ...
try {
// Add these functions to scope
scope.eval(initialScript);
} catch(ScriptException ex) {
// Evaluating exceptions, syntax errors are thrown here
}
И тогда вы можете многократно оценивать выражения в области видимости:
try {
double d = (double)scope.eval("sin(PI/2) + cos(PI/2)");
System.out.println("Calculated: " + d);
} catch(ScriptException e) {
// ...
}
Имейте в виду:
- Есть языковой перевод - пользователь может пройти любой скрипт и...
- ... это может снизить производительность приложения.
Вы также можете использовать, например, Jython или JRuby в качестве переводчика.
Вы можете использовать Java Scripting API и, например, использовать JavaScript или BeanShell (как Java).
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByMimeType("text/javascript");
try {
engine.eval("print('Result: ' + java.lang.Math.sin(0.8))");
double y = ((Number) engine.eval("java.lang.Math.sin(0.8)")).doubleValue();
} catch (ScriptException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
JavaScript может использовать импорт. Как видите, вызов java довольно прост.
Я не уверен, есть ли какой-нибудь простой способ идентифицировать и оценить обобщенные выражения без использования библиотек.
Если вы хотите разработать свой собственный способ оценки математических выражений, взгляните на эту страницу, она должна показать вам путь: http://cogitolearning.co.uk/?p=565
И если вы передумаете и захотите использовать библиотеку, проверьте эту ссылку: Оценка математического выражения в виде строки
Я сделал это, когда собрал компилятор Java, чтобы я мог читать и оценивать любые выражения, но это было не просто...