减肥计算器程序

时间:2016-05-26 15:32:29

标签: java calculator physics

我计划为物理学创建一个计算器计算器。但是,我意识到这将是很多代码。

使用等式v = x / t(只是我想要包括的许多中的一个),已经有三个可能的等式。

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

我打算让程序做的是:

- 询问用户他们将要使用的等式

- 询问缺少什么变量

- 使用匹配方程

来解决它

我的问题是我是否可以更有效地格式化代码。在不知道如何操作的情况下,似乎为方程的每个变体运行了很多非常类似的代码。

我打算使用多个课程来创建它,如果它不清楚的话。

2 个答案:

答案 0 :(得分: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对象是正确的实例,即尝试调用{ {1}}实例上没有solveX()方法的{1}}。但是,将每个类分开是组织和调试的好方法。

另一种方法是使用Java8 lambdas:

Density

这使您可以在一个地方定义方程,而不需要大量的类。您可以类似地为solveX()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类定义FourTermEqsolveThreeTermEq()等方法。这里的缺点是维护和组织可能会变得更加困难,我相信类文件的大小有一个上限;如果一个类文件变得太大,它将无法编译,如果你定义了大量的方程式,就会发生这种情况。

对我而言,选择将归结为我想如何组织代码;如果我只想包含(相对)少量(相对)简单的方程式,我可能会使用lambdas。如果我想在尽可能多的物理主题中包含每个物理方程,我可能会使用类。

无论哪种方式,都必须为某些方程式的不同排列编写一些类似的代码 - 我认为没有任何方法可以解决这个问题。您可以尝试使用一堆物体来尝试绕过这种新颖的方法,但我认为这将是过度的,不值得努力;这并不像翻转变量那么难。

答案 1 :(得分:1)

你可能最好使用某种符号数学工具箱。 MapleMatLab是处理方程的好语言/环境,因为它们识别符号数学并且可以相当容易地操作方程。 Java没有任何内置的库,很难找到任何支持“计算机代数系统”的库来为你操作方程式。你可能想看看JAS(Java代数系统),但我不确定它会做你想要做的事情。最相似的是,您需要手动求解每个变量并为每个单独的表达式构建函数。

如果您坚持使用Java,我就会这样做。在代码格式方面,我只想创建一个 Equation 类,它包含给定方程的所有变体的数组。变化(即V = I * R,I = V / R,R = V / I)都将被传递到类的构造函数中。然后可以实现 solve 方法,该方法接受所请求的变量,其他变量及其值(由两个数组区分 - 一个用于字符,一个用于值)

用法如下:

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

您需要编写一些符号解析,但这会很有趣,对吧?

可能或者可能不是您正在寻找的答案,但希望它有所帮助。祝你好运!