简单计算器程序java
我应该创建一个程序来模拟一个非常简单的计算器 所以我被要求实现一个抽象类,它表示二进制(有两个参数)算术表达式。我还创建了4个子类-除法、加法等 但是,我需要使用这些类来 “能够表示任意表达式(即具有任意数量 术语),例如我的crswork spec引用的表达式,如简单计算器程序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
(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
中返回它。当然,它将扩展表达式
类.