我应该创建一个模拟一个非常简单的计算器的程序
所以我被要求实现一个表示二进制(有两个参数)算术表达式的抽象类。我还制作了4个子类 - 分区,加法等。
但是,我需要使用这些类
“能够表示任意表达式(即具有任意数量的表达式)
条款),例如我的crswork规范引用的(5.0+8.1)*(2.0)
或((5.0+8.1)*(2.0))/12.5
等表达式。
换句话说,我的计算器必须能够使用任何算术表达式。
请帮助。
public abstract class ArithmeticExpression { // base abstract superclass
double left;
double right;
double result;
public abstract void evaluate();
public abstract void display();
}
// ------------------------------------ Addition subclassed from base class
public class Addition extends ArithmeticExpression {
public Addition(double x, double y) {
this.left = x;
this.right = y;
}
@Override
public void evaluate() {
result = left + right;
}
@Override
public void display() {
System.out.println
("The expression and result is: " + left + " + " + right + " = "
+ result);
}
}
// ------------------------------------ Subtract subclassed from base class
public class Subtract extends ArithmeticExpression {
public Subtract(double x, double y) {
this.left = x;
this.right = y;
}
@Override
public void evaluate() {
result = left - right;
}
@Override
public void display() {
System.out.println
("The expression and result is: " + left + " - " + right + " = "
+ result);
}
}
// ------------------------------------ Mulitplication subclassed from base
// class
public class Multiplication extends ArithmeticExpression {
public Multiplication(double x, double y) {
this.left = x;
this.right = y;
}
@Override
public void evaluate() {
result = left * right;
}
@Override
public void display() {
System.out.println
("The expression and result is: " + left + " * " + right + " = "
+ result);
}
}
// ------------------------------------ Division subclassed from base class
public class Division extends ArithmeticExpression {
public Division(double x, double y) {
this.left = x;
this.right = y;
}
@Override
public void evaluate() {
result = left / right;
}
@Override
public void display() {
System.out.println("The expression and result is: " + left + " / "
+ right + " = " + result);
}
}
这是我擅长制作评估方法的返回值。它有效吗?
public abstract ArithmeticExpression evaluate();
//------------------------------------ Addition subclassed from base class
public class Addition extends ArithmeticExpression {
public Addition(double x, double y) {
this.left = x;
this.right = y;
}
@Override
public ArithmeticExpression evaluate() {
result = left + right;
return this;
}
答案 0 :(得分:0)
不要过于困难,你可以重载你的构造函数,以便它们可以处理其他算术表达式:
public class Division extends ArithmeticExpression {
public Division(ArithmeticExpression x, ArithmeticExpression y) {
this.left = x.evaluate();
this.right = y.evaluate();
}
通过这种方式,您可以使用现有的类并相互引用来创建复合表达式。
编辑 - 虽然现在我认为这不允许操作顺序。为此,你需要创建一个树状结构。
答案 1 :(得分:0)
所以,你需要编写你的算术表达式......
为名为Arithmetic Expression
的{{1}}添加基类,并添加方法Expression
。
getValue()
应该扩展Expression,并且必须只有一个double属性,它将通过getValue()返回。现在,您的算术表达式子类将具有左右属性,并且在您的evaluate方法中,您将调用WrapperExpression
进行添加。
left.getValue() + right.getValue()
(2 + 8) * 10 + 2
希望有所帮助。
编辑: 表达式应该是一个抽象类(你不应该能够表达ex = new Expression();)甚至是一个接口:
Expression wrap2 = new WrapperExpression(2);
// similar, wrap8, wrap10
Expression add2p8 = new Addition(wrap2, wrap8);
Expression add2p8m10 = new Multiplication(add2p8, wrap10);
Expression add2p8m10p2 = new Addition(add2p8m10, wrap2);