Вычисление выражений, содержащих функции в 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) {
    // ...
}

Имейте в виду:

  1. Есть языковой перевод - пользователь может пройти любой скрипт и...
  2. ... это может снизить производительность приложения.

Вы также можете использовать, например, 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, чтобы я мог читать и оценивать любые выражения, но это было не просто...

Другие вопросы по тегам