Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想做一个物理计算器(运动学和射弹),但我不';我不知道如何组织它。我该怎么办?_Java - Fatal编程技术网

Java 我想做一个物理计算器(运动学和射弹),但我不';我不知道如何组织它。我该怎么办?

Java 我想做一个物理计算器(运动学和射弹),但我不';我不知道如何组织它。我该怎么办?,java,Java,我试图制作一个物理计算器,在这里你输入一个你想要的变量,然后提供你知道的所有其他变量。(也就是说,你在寻找t=5秒时的速度,你有vnught和加速度)计算器将内置大多数运动学和(可能)射弹方程,例如V=at或Vf^2=Vo^2+2a(X-Xo)。但是,我不知道该如何组织它 一位朋友建议尝试使用二进制表达式树,但我不确定这样做是否正确。还有,我怎样才能实现所有的物理方程?通过JSON public class Node { // Nodes used in the algebraic e

我试图制作一个物理计算器,在这里你输入一个你想要的变量,然后提供你知道的所有其他变量。(也就是说,你在寻找t=5秒时的速度,你有vnught和加速度)计算器将内置大多数运动学和(可能)射弹方程,例如V=at或Vf^2=Vo^2+2a(X-Xo)。但是,我不知道该如何组织它

一位朋友建议尝试使用二进制表达式树,但我不确定这样做是否正确。还有,我怎样才能实现所有的物理方程?通过JSON

public class Node {

    // Nodes used in the algebraic expression trees
    public Node(char symbol, ArrayList<ExpressionTree> equations) {
        this.symbol = symbol;
        this.equations = equations;
        this.left = this.right = null;
    }
    // Nodes have a set of equations associated with them to calculate their value from their children 
    public double calculateValue() {
        for (ExpressionTree eq : equations) {
            try { 
                this.value = eq.calculateInOrder(eq.root);
                System.out.println(this.symbol + "'s value is: " + this.value);
            } catch(Exception e) {
                System.out.println("Missing variables!");
            }
        }
        return this.value;
    }
}

public class ExpressionTree {
    // Constructs a tree and returns a single node that has children nodes who also have children nodes... etc.
    public Node constructTree(char postfix[]) {
        Stack<Node> stack = new Stack<Node>();
        Node n, n1, n2;

        for (int i = 0; i < postfix.length; i++) { 
            if (!isOperator(postfix[i])) { 
                n = new Node(postfix[i]); 
                stack.push(n); // If operand, simply push into stack
            } else // If operator:
            { 
                n = new Node(postfix[i]); 

                // Pop two top nodes (these will be the two operands for the operation)
                n1 = stack.pop();
                n2 = stack.pop(); 

                // Make them children of this node
                n.right = n1; 
                n.left = n2; 

                // Add the node back to the stack. This node keeps its children in the stack.
                stack.push(n); 
            } 

        } 

        n = stack.pop(); // STACK IS NOW EMPTY. N IS THE LAST VALUE FROM STACK, A SINGLE ROOT NODE WITH CHILDREN (with more children).

        this.root = n; // Saves root for this tree instance
        return n; 
    }
    // Goes through each operation (infix)
    public double calculateInOrder(Node n) {
        if (n.left == null && n.right == null) {
            return n.value;
        }

        double leftsum = calculateInOrder(n.left);
        double rightsum = calculateInOrder(n.right);

        if (n.symbol == '^') {
            return Math.pow(leftsum, rightsum);
        } else if (n.symbol == '*') {
            return leftsum * rightsum;
        } else if (n.symbol == '/') {
            return leftsum / rightsum;
        } else if (n.symbol == '+') {
            return leftsum + rightsum;
        } else if (n.symbol == '-') {
            return leftsum - rightsum;
        } else {
            throw new IllegalArgumentException("Cannot calculate without two operands and an operator!");
        }
    }
}
公共类节点{
//代数表达式树中使用的节点
公共节点(字符符号、ArrayList表达式){
这个符号=符号;
这个方程=方程;
this.left=this.right=null;
}
//节点有一组与其关联的方程式,用于从其子节点计算其值
公共双计算值(){
对于(表达式树等式:方程式){
试试{
this.value=eq.calculateNorder(eq.root);
System.out.println(this.symbol+“)的值为:“+this.value”;
}捕获(例外e){
System.out.println(“缺少变量!”);
}
}
返回此.value;
}
}
公共类表达式树{
//构造一个树并返回一个节点,该节点包含子节点,而子节点也包含子节点…等等。
公共节点构造树(字符后缀[]){
堆栈=新堆栈();
节点n,n1,n2;
对于(inti=0;i
我正在使用二进制表达式树来模拟物理方程,并且我已经实现了代码来计算树的根的值,如果所有其他值都已知的话。我还不知道如何创建共享特定节点的树(比如多个树中的加速度),这对于解决需要多次计算的物理问题很重要。我应该放弃整个表达式树吗?我该如何处理这个问题


我很抱歉发布了这么多代码,我知道这是一个非常模糊的问题。我只是在寻找一个正确的方向,这样我就可以想出如何构建这个。我知道互联网上还有其他的物理计算器,但我不知道它们是如何编码的,我想自己写这篇文章来提高我的编码技能。谢谢

我很喜欢这个问题,但正如你所承认的,它听起来确实很宽泛。您可以尝试删除宽泛的语言,尽管这可能很棘手。像“什么算法适合X”这样的东西会更精确,尽管我不确定X是什么。“什么算法适合解析和计算数学表达式?”我不在这个领域。@DavidS,即使是那些问题也可能有点过于基于观点。此外,还有很多关于解析表达式的现有信息。OP,我鼓励你们思考:你们的问题是关于实现一个物理计算器,还是关于实现表达式解析?在第一种情况下,您需要首先确定它是解决任意方程,还是只解决它内置的方程——后者要简单得多,并且不需要一般表达式解析。在后一种情况下,您应该首先查看现有的问题,然后返回具体的问题:)另外,OP:如果您知道计算器的限制是什么,您希望获得有关如何构造代码的类和功能的反馈,你一定要考虑把这件事献给这类事情。