Java 我想做一个物理计算器(运动学和射弹),但我不';我不知道如何组织它。我该怎么办?
我试图制作一个物理计算器,在这里你输入一个你想要的变量,然后提供你知道的所有其他变量。(也就是说,你在寻找t=5秒时的速度,你有vnught和加速度)计算器将内置大多数运动学和(可能)射弹方程,例如V=at或Vf^2=Vo^2+2a(X-Xo)。但是,我不知道该如何组织它 一位朋友建议尝试使用二进制表达式树,但我不确定这样做是否正确。还有,我怎样才能实现所有的物理方程?通过JSONJava 我想做一个物理计算器(运动学和射弹),但我不';我不知道如何组织它。我该怎么办?,java,Java,我试图制作一个物理计算器,在这里你输入一个你想要的变量,然后提供你知道的所有其他变量。(也就是说,你在寻找t=5秒时的速度,你有vnught和加速度)计算器将内置大多数运动学和(可能)射弹方程,例如V=at或Vf^2=Vo^2+2a(X-Xo)。但是,我不知道该如何组织它 一位朋友建议尝试使用二进制表达式树,但我不确定这样做是否正确。还有,我怎样才能实现所有的物理方程?通过JSON public class Node { // Nodes used in the algebraic e
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:如果您知道计算器的限制是什么,您希望获得有关如何构造代码的类和功能的反馈,你一定要考虑把这件事献给这类事情。