2016-05-26 2 views
1

Я планирую создать калькулятор для физики, который бы сработал из нескольких уравнений. Но я понял, что это будет много кода.Похудение в калькуляторе Программа

С уравнением v = x/t (только один из многих, к которому я хочу включить), существует уже три возможных уравнения.

v = x/t  x = vt  t = x/v 

То, что я планировал иметь программу сделать:

-Спросите пользователю, что уравнение они собираются использовать

-спросить какая переменная отсутствует

-Solve для него с согласующим уравнением

Мой вопрос в том, есть ли способ, который я могу форматировать код более эффективно. Не зная, как, похоже, работает много очень аналогичный код для каждого варианта уравнения.

Я планирую создать это, используя несколько классов, если это не ясно.

+0

Не уверен, что я понял. Предоставляет ли пользователь какие-либо значения для переменных или должна ли программа отображать только форму уравнения, которое разрешено переменной, введенной пользователем? –

+0

Возможный дубликат [Как решить уравнения с помощью java?] (Http://stackoverflow.com/questions/1431885/how-to-solve-equations-with-java) – cyroxis

ответ

1

Есть два подхода, о которых я могу думать, что будет иметь наибольший смысл.

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

public class Velocity implements Equation{ 
    public double solveT(double v, double x){ 
     if(v != 0) 
      return x/v; 
     else 
      return 0; //or whatever value is appropriate 
    } 

    public double solveX(double v, double t){ 
     return v * t; 
    } 

    public double solveV(double t, double x){ 
     if(t != 0) 
      return x/t; 
     else 
      return 0; //or whatever value is appropriate 
    } 
} 

Это сохраняет все ваши различных уравнений по отдельности, и если вы определили пустой Equation интерфейс, который вы можете заменить различные Equation объектов по мере необходимости. Недостатком является то, что у вас будет много классов для отслеживания, и вам нужно будет убедиться, что объект Equation, который вы пытаетесь вызвать методы, является правильным экземпляром, то есть пытается вызвать solveX() на примере Density который не имеет метода solveX(). Тем не менее, каждый отдельный класс - отличный способ организовать и отладить.

Другой подход использует Java8 лямбды:

interface twoTermEq{ 
    double solve(double a, double b); 
} 

public class Calculator{ 
    public double solveTwoTermEq(twoTermEq eq, double a, double v){ 
     eq.solve(a, b); 
    } 
} 

public static void main(String[] args){ 
    twoTermEq velSolveX = (t, v) -> return t * v; 
    twoTermEq velSolveT = (x, v) -> v != 0.0 ? return x/v : 0.0; 
    twoTermEq velSolveV = (x, t) -> t != 0.0 ? return x/t : 0.0; 
    //define as many equations as needed... 

    Calculator c = new Calculator(); 
    //select which equation to run, collect user input 
    .... 
    //do the calculation 
    double result = c.solveTwoTermEq(velSolveX, t, v); 
} 

Это позволяет определить свои уравнения все в одном месте и не нуждается в лодку классов. Аналогичным образом можно определить интерфейсы для ThreeTermEq, FourTermEq и т. Д., А также solveThreeTermEq(), solveFourTermEq() и т. Д. Методы для класса Calculator. Недостатком здесь является то, что его может стать сложнее поддерживать и организовывать, и я считаю, что существует верхний предел того, насколько большой может быть файл класса; если файл класса становится слишком большим, он не будет компилироваться, что может произойти, если вы определили тонны уравнений.

Для меня выбор сводится к тому, как я хотел организовать код; если бы я хотел включить только (относительно) небольшое число (относительно) простых уравнений, я бы, вероятно, использовал лямбда. Если бы я хотел включить каждое физическое уравнение в максимально возможное количество физических вопросов, я бы, вероятно, использовал классы.

В любом случае, это должно быть аналогичный код, написанный для разных перестановок уравнения - я не думаю, что есть что-то в этом роде.Вы можете попробовать новый подход, используя кучу объектов, чтобы попытаться обойти это, но я думаю, что это было бы чрезмерным и не стоило бы усилий; это не так, как перевертывание переменных вокруг трудно.

1

Возможно, вам будет лучше использовать какой-то символический набор инструментов математики. Maple и MatLab - хорошие языки/среды для работы с уравнениями, поскольку они распознают символическую математику и могут легко управлять уравнениями. Для этого Java не имеет встроенных библиотек, и трудно найти библиотеки, которые будут поддерживать «Систему алгебры компьютеров», чтобы манипулировать уравнениями для вас. Возможно, вам стоит взглянуть на JAS (Java Algebra System), но я не уверен, что вы будете делать то, что вы хотите сделать. В большинстве случаев вам нужно будет решать каждую переменную вручную и строить функции для каждого отдельного выражения.

Если вы придерживаетесь Java, я бы так поступил. Что касается форматирования кода, я бы просто создал один класс Equation, который содержит массив всех вариаций данного уравнения. Изменения (т. Е. V = I * R, I = V/R, R = V/I) будут переданы в конструктор класса. Способ решения затем может быть реализован, который принимает запрошенного переменный, которую необходимо решить для, других переменных и их значения (отличается два arrays- один для символов и один для значений)

Использования может быть следующими:

Equation ohmsLaw = new Equation(new String[] {"V=I*R", "I=V/R", "R=V/I"}); 
double resistance = ohmsLaw.solve('R', new char[] {'I', 'V'}, new double[] {0.5, 12.0}); 

Вам нужно будет написать немного символического разбора, но это делает его забавным, верно?

Возможно, это был ответ, который вы искали, но, надеюсь, это поможет. Удачи!

Смежные вопросы