【问题标题】:Simple Calculator program java简单的计算器程序java
【发布时间】:2013-11-29 07:31:53
【问题描述】:

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

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

【问题讨论】:

  • 一些提示:从右到左解析;根据 parenteses 找到最里面的操作并从那里开始;递归地定义你的解析代码。
  • 你上什么课?这几乎肯定需要语法树解析器。表达式字符串在调用您实现的 4 个基本计算之前被解析。
  • 学习计算机科学。那是我应该做的吗?解析表达式字符串?以及如何?
  • 表示任何表达式的类并不意味着您应该解析,但是,如果您可以添加此功能,那就太好了。

标签: java object calculator abstract


【解决方案1】:

所以,您需要编写算术表达式...

Arithmetic Expression 添加一个名为Expression 的基类并添加一个方法getValue()

WrapperExpression 应该扩展 Expression 并且必须只有一个将通过 getValue() 返回的 double 属性。现在,您的算术表达式子类将有一个表达式作为左右属性,并且在您的评估方法中,您将调用 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();

}

【讨论】:

  • 您能否告诉我表达式类的外观,以及我应该如何在我的子类中实现 getValue(没有示例编号)。提前谢谢
  • 很抱歉一再打扰你,但你能告诉我 WrapperExpression 类会是什么样子吗?
  • 它将只有一个double 属性,您将通过constructor 设置此属性,在getValue 中,您将返回它。当然,它会扩展 Expression 类。
【解决方案2】:

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

public class Division extends ArithmeticExpression {

public Division(ArithmeticExpression x, ArithmeticExpression y) {
this.left = x.evaluate();
this.right = y.evaluate();
}

这样您就可以使用现有的类并相互引用来创建复合表达式。

编辑-尽管现在我考虑一下,这不允许操作顺序。为此,您需要创建一个树层次结构。

【讨论】:

  • 当且仅当评估返回某些东西时才有效。
  • 好点...为什么评估不返回一些东西?
  • 他可能是个新手,他会想办法的:)
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 2013-06-27
  • 2011-02-13
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多