简单计算器程序java

简单计算器程序java,java,object,calculator,abstract,Java,Object,Calculator,Abstract,我应该创建一个程序来模拟一个非常简单的计算器 所以我被要求实现一个抽象类,它表示二进制(有两个参数)算术表达式。我还创建了4个子类-除法、加法等 但是,我需要使用这些类来 “能够表示任意表达式(即具有任意数量 术语),例如我的crswork spec引用的表达式,如(5.0+8.1)*(2.0)或((5.0+8.1)*(2.0))/12.5 换句话说,我的计算器必须能够使用任何算术表达式 请帮忙 public abstract class ArithmeticExpression { // ba

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

所以我被要求实现一个抽象类,它表示二进制(有两个参数)算术表达式。我还创建了4个子类-除法、加法等

但是,我需要使用这些类来 “能够表示任意表达式(即具有任意数量 术语),例如我的crswork spec引用的表达式,如
(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);

    }

}
这是我在使evaluate方法返回值方面的专长。它有效吗

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

在不太困难的情况下,您可以重载构造函数,以便它们可以处理其他算术表达式:

public class Division extends ArithmeticExpression {

public Division(ArithmeticExpression x, ArithmeticExpression y) {
this.left = x.evaluate();
this.right = y.evaluate();
}
这样,您就可以使用现有的类并相互引用来创建复合表达式


编辑-虽然现在我想这不允许操作顺序。为此,您需要创建一个树层次结构。

因此,您需要编写算术表达式

为名为
Expression
算术表达式添加一个基类,并添加一个方法
getValue()

WrapperExpression
应该扩展表达式,并且必须只有一个通过getValue()返回的double属性。现在,算术表达式子类将有一个表达式作为left和right属性,并且在求值方法中,您将调用
left.getValue()+right.getValue()
进行添加

(2+8)*10+2

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);
希望有帮助

编辑: 表达式应该是一个抽象类(您不应该执行Expression ex=new Expression();)甚至是一个接口:

public abstract class Expression {

  // override this method in your subclasses, WrapperExpression, Addition and so on
  public abstract double getValue();

}

一些提示:从右到左解析;找到基于parentese的最内部的操作并从那里开始;递归地定义解析代码。你学的是什么课程?这几乎肯定需要一个语法树解析器。在调用你实现的4个基本计算之前解析表达式字符串。学习计算机科学。这是什么我不应该做什么?解析表达式字符串?以及如何解析?表示任何表达式的类并不意味着您应该解析,但是,如果您可以添加此功能,那就太好了。有效的解决方案是当且仅当evaluate返回某个内容时。好的一点…evaluate为什么不返回某个内容?他可能是个新手,他会明白:)可以吗告诉我expression类是什么样子,以及我应该如何在我的子类中实现getValue(没有示例编号).Thx非常抱歉一再打扰您,但是您能告诉我WrapperExpression类的外观吗?它只有一个
double
属性,您将通过
constructor
设置此属性,并在
getValue
中返回它。当然,它将扩展
表达式
类.