powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Simple question
9 сообщений из 9, страница 1 из 1
Simple question
    #38384796
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть проблема.
Допустим имеется Excel файл. В нем в каждой строчке содержатся некоторые данные(например T1,T2,T3) и формула(String).
После создание структуры данных и заполнения ее из файла, необходимо будет применить формулу для поля.(R)
Внимание знатоки. Как из Строчки(формула хранится в виде строки) сделать метод? Разобрать строчку на составляющие, записать в переменные, но а метод динамический откуда получу? Или что иное?
Наверно плохо ясно, попытаюсь конкретней.
Допустим есть 4 поля T1,T2,T3,R. Для одной строки формула будет R=T1*T2*T3, для другой строки R=T3*10, для третьей R=ln(T1*T2). То есть формулы разные, скорее больше разных, чем одинаковых.
Как это возможно реализовать? Совет типа: сделай это в Экселе оставьте пожалуйста при себе.
...
Рейтинг: 0 / 0
Simple question
    #38384805
feomatr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как понимаю, Вам нужен кулькулятор.
Приложение, получает на входе выражение - на выходе результат..

Вот, похоже, калькулятор на Сях : http://www.cyberforum.ru/cpp-beginners/thread34719.html#post165316

Чуть ниже дано пояснение как использовать прогу. Если операций не хватает - добавляем.
...
Рейтинг: 0 / 0
Simple question
    #38384942
mesier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нииичче не понял!... О_о
То вроде формула записана в "строке" (в виде простого текста в одной Экселевской ячейке что ли?). То вдруг данные в каких-то "полях".. Данные в ячейках Экселя, а таки формула над ячейкими?? И что такое "динамический метод"? Ты хочешь сгенерировать код метода что ли?
...
Рейтинг: 0 / 0
Simple question
    #38385206
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то так:
MathSolver
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
package mathsolver;

import java.util.HashMap;
import java.util.Map;
import mathsolver.operations.Divide;
import mathsolver.operations.Plus;
import static mathsolver.Value.variable;
import mathsolver.operations.UnaryMinus;

public class MathSolver {

    public final Map<String, Value> variables = new HashMap<>();

    public void setVariable(String name, double value) { //throws NPE
        variables.get(name).value = value;
    }

    public void parseFormula(String formula) { //throws WrongFormula, FormulaExpressionsNotSupported
        //парсер пиши сам
        stub();
    }

    private void stub() {
        rootOperation =
                new UnaryMinus().a(
                new Plus().a(2).b(
                new Divide().a(1).b(variable("G6", variables))));
    }
    private Resultable rootOperation = new EmptyOperation();

    public double solve() throws SolveException {
        return rootOperation.result();
    }

    public static void main(String[] args) throws SolveException {
        MathSolver mathSolver = new MathSolver();
        mathSolver.parseFormula("=-(2 + (1 / G6)");
        mathSolver.setVariable("G6", 0.5);
        System.out.println(mathSolver.solve());
    }
}

Resultable
Код: java
1.
2.
3.
4.
5.
package mathsolver;

public interface Resultable {
    double result() throws SolveException;
}

Value
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
package mathsolver;

import java.util.Map;

public class Value implements Resultable {

    public double value;

    public Value() {}

    public Value(double value) {
        this.value = value;
    }

    @Override public double result() throws SolveException {
        return value;
    }
    
    public static Value variable(String name, Map<String, Value> context) {
        Value variable = context.get(name);
        if (variable == null) {
            variable = new Value();
            context.put(name, variable);
        }
        return variable;
    }
}


operations
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
package mathsolver.operations;

import mathsolver.Resultable;
import mathsolver.SolveException;
import mathsolver.Value;

public abstract class Binary implements Resultable {

    private Resultable a, b;

    @Override public double result() throws SolveException {
        return operate(a.result(), b.result());
    }

    //<editor-fold defaultstate="collapsed" desc="setters">
    public Binary a(Resultable a) {
        this.a = a;
        return this;
    }

    public Binary b(Resultable b) {
        this.b = b;
        return this;
    }

    public Binary a(double a) {
        this.a = new Value(a);
        return this;
    }

    public Binary b(double b) {
        this.b = new Value(b);
        return this;
    }
    //</editor-fold>
    
    public abstract double operate(double a, double b);
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver.operations;

public class Divide extends Binary {

    @Override public double operate(double a, double b) {
        return a / b;
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver.operations;

public class Minus extends Binary {

    @Override public double operate(double a, double b) {
        return a - b;
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver.operations;

public class Multiply extends Binary {

    @Override public double operate(double a, double b) {
        return a * b;
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver.operations;

public class Plus extends Binary {

    @Override public double operate(double a, double b) {
        return a + b;
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver.operations;

public class Pow extends Binary {

    @Override public double operate(double a, double b) {
        return Math.pow(a, b);
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
package mathsolver.operations;

import mathsolver.Resultable;
import mathsolver.SolveException;
import mathsolver.Value;

public abstract class Unary implements Resultable {

    private Resultable a;

    @Override public double result() throws SolveException {
        return operate(a.result());
    }

    //<editor-fold defaultstate="collapsed" desc="setters">
    public Unary a(Resultable a) {
        this.a = a;
        return this;
    }

    public Unary a(double a) {
        this.a = new Value(a);
        return this;
    }
    //</editor-fold>
    public abstract double operate(double a);
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver.operations;

public class UnaryMinus extends Unary {

    @Override public double operate(double a) {
        return -a;
    }
}


excetions
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver;

public class SolveException extends Exception {

    public SolveException(String message) {
        super(message);
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver;

public class EmptyFormula extends SolveException {

    public EmptyFormula() {
        super("Формула не задана");
    }
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package mathsolver;

public class EmptyOperation implements Resultable {

    @Override public double result() throws SolveException {
        throw new EmptyFormula();
    }
}

...
Рейтинг: 0 / 0
Simple question
    #38385249
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если по простому ?
...
Рейтинг: 0 / 0
Simple question
    #38385316
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевА если по простому ?
По-простому наверное тоже хорошо))
...
Рейтинг: 0 / 0
Simple question
    #38385384
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
утром заглянул, один ответ - думал тема умерла.
Это не калькулятор. В ячейке хранится формула (либо как сама формула, либо как Строка).
Мне нужно ее извлечь, как бы оставляя ее неизменной, в дальнейшем мне станет известно сколько раз ее использовать и с какими параметрами.
Вернемся к теме. Как из Строчки(формула хранится в виде строки) сделать метод?
...
Рейтинг: 0 / 0
Simple question
    #38385417
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaa,
Создавать метод из строки для каждой формулы - это как гланды через ж... удалять, во первых. во вторых реализация может занять больше сил и времени чем разработка логики вашего приложения. Чем вас не устроил вариант с разбором формул? Он же полностью охватывает ваши требования из первого поста и уже реализован, бери и пользуйся.
...
Рейтинг: 0 / 0
Simple question
    #38386289
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а чем такой вариант не устравивает Apache POI - Formula Evaluation
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Simple question
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]