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

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

Чуть ниже дано пояснение как использовать прогу. Если операций не хватает - добавляем.
...
Рейтинг: 0 / 0
03.09.2013, 09:32:08
    #38384942
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Simple question
Нииичче не понял!... О_о
То вроде формула записана в "строке" (в виде простого текста в одной Экселевской ячейке что ли?). То вдруг данные в каких-то "полях".. Данные в ячейках Экселя, а таки формула над ячейкими?? И что такое "динамический метод"? Ты хочешь сгенерировать код метода что ли?
...
Рейтинг: 0 / 0
03.09.2013, 11:57:00
    #38385206
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Simple question
Как-то так:
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
03.09.2013, 12:20:26
    #38385249
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Simple question
А если по простому ?
...
Рейтинг: 0 / 0
03.09.2013, 13:02:35
    #38385316
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Simple question
Сергей АрсеньевА если по простому ?
По-простому наверное тоже хорошо))
...
Рейтинг: 0 / 0
03.09.2013, 13:44:07
    #38385384
eldarkaa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Simple question
утром заглянул, один ответ - думал тема умерла.
Это не калькулятор. В ячейке хранится формула (либо как сама формула, либо как Строка).
Мне нужно ее извлечь, как бы оставляя ее неизменной, в дальнейшем мне станет известно сколько раз ее использовать и с какими параметрами.
Вернемся к теме. Как из Строчки(формула хранится в виде строки) сделать метод?
...
Рейтинг: 0 / 0
03.09.2013, 14:01:23
    #38385417
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Simple question
eldarkaa,
Создавать метод из строки для каждой формулы - это как гланды через ж... удалять, во первых. во вторых реализация может занять больше сил и времени чем разработка логики вашего приложения. Чем вас не устроил вариант с разбором формул? Он же полностью охватывает ваши требования из первого поста и уже реализован, бери и пользуйся.
...
Рейтинг: 0 / 0
04.09.2013, 11:19:14
    #38386289
jdroid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Simple question
а чем такой вариант не устравивает Apache POI - Formula Evaluation
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Simple question / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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