我正计划创建一个物理计算器,它将由几个方程式组成。但是,我意识到这会是很多代码。
对于方程v= x/t (只是我想包含的许多方程之一),已经有三个可能的方程。
v = x/t x = vt t = x/v我计划让这个节目做的是:
-Ask用户他们将使用什么样的等式
-Ask缺少什么变量
用匹配方程表示它的-Solve
我的问题是,是否有更有效地格式化代码的方法。在不知道如何运行的情况下,对于一个方程的每个变体,它似乎都运行了许多非常类似的代码。
如果不清楚,我计划使用多个类来创建它。
发布于 2016-05-26 16:44:01
有两种方法我认为这是最有意义的。
第一种更传统的方法是为你想要包含的每一种方程创建一系列的类。
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 lambda:
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等定义接口,以及为Calculator类定义solveThreeTermEq()、solveFourTermEq()等方法。这里的缺点是,维护和组织可能会变得更加困难,我相信对于一个类文件的大小有一个上限;如果一个类文件变得太大,它就不会编译,如果您已经定义了大量的方程,这可能会发生。
对我来说,选择取决于我如何组织代码;如果我只想包含(相对)少量(相对)简单的方程,我可能会使用lambdas。如果我想在尽可能多的物理主题中包含所有的物理方程,我可能会使用类。
不管是哪种方式,都需要为不同的方程排列编写一些类似的代码--我不认为有任何解决办法。您可以尝试一种新的方法,使用一堆对象来试图绕过它,但我认为这会过度劳累,不值得付出努力;这不像翻转变量是困难的。
发布于 2016-05-26 16:47:22
你最好使用某种象征性的数学工具箱。Maple和MatLab是处理方程的良好语言/环境,因为它们能够识别符号数学,并且可以相当容易地操作方程。Java没有内置的库,很难找到任何支持“计算机代数系统”的库来为您操作这些方程。您可能想看看JAS (),但我不确定它能完成您想要做的事情。最简单的是,您需要手工求解每个变量,并为每个单独的表达式构建函数。
如果您坚持使用Java,我将这样做。在代码格式化方面,我只需要创建一个等式类,它包含一个给定方程的所有变体的数组。变体(即V=I*R,I=V/R,R=V/I)都将传递给该类的构造函数。然后,可以实现一个求解方法,将请求的变量和其他变量及其值(由两个数组区分-一个用于字符,另一个用于值)。
使用情况如下:
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});您需要编写一些符号解析,但这很有趣,对吗?
可能是,也可能不是你想要的答案,但希望这是一些帮助。祝好运!
https://stackoverflow.com/questions/37465236
复制相似问题