简单计算器程序java

时间:2013-11-15 19:25:39

标签: java object calculator abstract

我应该创建一个模拟一个非常简单的计算器的程序

所以我被要求实现一个表示二进制(有两个参数)算术表达式的抽象类。我还制作了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;
}

2 个答案:

答案 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);