Как расставить приоритеты операторов - PullRequest
0 голосов
/ 09 марта 2019

Я создаю калькулятор с + - * / и% (модуль).Базовый калькулятор работает, но теперь мне интересно, как я должен расставить приоритеты умножения и деления перед сложением и вычитанием.Не могу разобраться.

Мне нужно написать целую строку, которая будет преобразована в двойную, а затем обратно в строку для распечатки.

пример: 3 + 3-4 *8 + 5/6 + 5

Вот мой код ниже

public String calculateExpression(String expression){
    double dres = 0.0;
    String[] split = expression.split("(?=[*/+-])|(?<=[*/+-])");
    dres = Double.parseDouble(split[0]);
    for (int i = 1; i < split.length; i+= 2) {
        String op = split[i];
        double val = Double.parseDouble(split[i+1]);
        switch (op) {
        case "+":
                dres = Addition(dres, val);
            break;
        case "-":
                dres = Subtraction(dres, val);
            break;
        case "*":
                dres = Multiplication(dres, val);
            break;
        case "/":
                dres = Division(dres, val);
            break;
        default:
            break;
        }
    }
    String res = Double.toString(dres);
    return res;
}

public double Addition(double d1,double d2) {
    return d1+d2;

}

public double Subtraction(double d1, double d2) {
    return d1-d2;
}

public double Multiplication(double d1, double d2) {
    return d1*d2;
}

public double Division(double d1, double d2) {
    return d1/d2;
}

public double Modulus(double d1, double d2) {
    return d1%d2;
}

Ответы [ 3 ]

0 голосов
/ 09 марта 2019

Может быть, попробовать что-то вроде подхода грубой силы:

public String calculateExpression(String expression){
double dres = 0.0;
String[] split = expression.split("(?=[*/+-])|(?<=[*/+-])");
dres = Double.parseDouble(split[0]);
for (int i = 1; i < split.length; i+= 2) {
    String op = split[i];
    double val = Double.parseDouble(split[i+1]);
    switch (op) {
        if(case == "+" or case == "*") {
            case "+":
                dres = Addition(dres, val);
            break;
            case "*":
                dres = Multiplication(dres, val);
            break;
        }
        else {
            case "-":
                dres = Subtraction(dres, val);
            break;
            case "/":
                dres = Division(dres, val);
            break;
        }
        default:
            break;
    }
}
String res = Double.toString(dres);
return res;   }

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

0 голосов
/ 09 марта 2019

Это классическое приложение Шаблон интерпретатора .

К сожалению, у меня возникли проблемы с пониманием того, что именно делает пример из Википедии ...

НоРешение определенно связано со стеками (называемыми ArrayDeque в Java).

0 голосов
/ 09 марта 2019

Что вы можете сделать, это отсканировать самое правое вхождение * или / и разделить String на две части (слева от символа и справа от символа).Затем вызовите свой собственный метод, чтобы определить значения любой из сторон;затем выполните операцию умножения / деления.

Если их нет * или /, вы можете сделать то же самое для + и -.

Если вообще нет оператора, а затем просто верните номер.

...