2016-05-26 18 views
1

私はいくつかの式から外れてしまう物理学の電卓を作成する予定です。しかし、私はそれが多くのコードになることに気付きました。電卓プログラムをスリミングする

式v = x/t(私が含むたくさんの1つだけ)では、すでに3つの可能な方程式があります。私はプログラムを持って計画していた何

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

んです

-Ask

-Solveが欠落している、彼らがどのような変数

-Askを使用するつもり何式ユーザー一致する式を使ってください。

私の質問は、コードをより効率的に書式設定する方法があるかどうかです。どのように知っていなくても、非常にの方程式のそれぞれの変種に対して同様のコードを実行しているようです。

明確でない場合は、複数のクラスを使用してこれを作成する予定です。

+0

私はそれが正しいかどうかわかりません。ユーザーは変数に任意の値を指定するか、またはプログラムはユーザーが入力した変数に解決される式の形式のみを表示する必要がありますか? –

+0

[Javaで方程式を解く方法は?](http://stackoverflow.com/questions/1431885/how-to-solve-equations-with-java)の可能な複製 – cyroxis

答えて

1

私には2つのアプローチがあり、それが最も理にかなっています。

最初のもっと伝統的な方法は、それぞれの種類の方程式にクラスを追加することです。

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オブジェクトが正しいインスタンスであることを確認する必要があります。つまり、を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); 
} 

これは、あなたがすべて一つの場所にあなたの方程式を定義し、クラスの最大積載量を必要としないことができます。同様にCalculatorクラスのThreeTermEq,FourTermEqなどのインターフェイスだけでなく、solveThreeTermEq()solveFourTermEq()などのインターフェイスを定義することもできます。ここでの欠点は、保守や整理がより難しくなるかもしれないことです。クラスファイルの大きさに上限があると思います。クラスファイルが大きすぎるとコンパイルされません。これは、数多くの方程式を定義した場合に発生します。

私の場合は、コードをどのように整理したいのかという選択肢があります。 (比較的)少数の(比較的)単純な方程式だけを含めるには、おそらくラムダを使います。できるだけ多くの物理トピックに物理方程式を含めるには、おそらくクラスを使用します。

いずれにしても、である必要があります。類似のコードは、方程式の異なる順列のために書かれています。本当にその周りには何の方法もないと思います。あなたは、それを回避しようとするオブジェクトの束を使用して斬新なアプローチを試みることができますが、私はそれが過労と努力の価値がないと思う。変数を反転させるのは難しいことではありません。

1

象徴的な数学ツールボックスを使用するのが最善でしょう。 MapleMatLabは、方程式を扱うための優れた言語/環境です。記号的な数式を認識し、方程式をかなり簡単に操作できるためです。 Javaにはこのためのライブラリが組み込まれていないため、方程式を操作するための 'Computer Algebra System'をサポートするライブラリを見つけることは困難です。あなたはJAS(Java Algebra System)を見たいと思うかもしれませんが、あなたがやろうとしていることを実行するかどうかは分かりません。ほとんどの場合、各変数を手作業で解き、個々の式ごとに関数を構築する必要があります。

もしあなたがJavaに固執しているのであれば、私はそれについてどうやって行くのですか?コードの書式設定に関しては、与えられた式のすべてのバリエーションの配列を保持する1つのクラスを作成するだけです。バリエーション(すなわち、V = I * R、I = V/R、R = V/I)はすべて、そのクラスのコンストラクタに渡される。 解決次いで本方法は以下の通りとすることができる

使用(二arrays-文字用と値のための1つによって区別される)のために解決すべき要求された変数、その他の変数とそれらの値をとることに実装することができる:

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}); 

シンボリックな構文解析を少し書く必要がありますが、それは楽しいでしょうか?

あなたが探していた答えかもしれないし、そうでなかったかもしれないが、うまくいけば助けになるだろう。がんばろう!