2013-11-15 112 views
3

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

所以我一直要求实现一个表示二进制(有2个参数)算术表达式的抽象类。我还由4子类 - 除法,加法,等等

然而,我需要使用这些类是 “能代表任何任意表达(即,具有的 方面的任意数的表达式),用于例如像(5.0+8.1)*(2.0)((5.0+8.1)*(2.0))/12.5一种表现,因为我的crswork规格报价。

换句话说,我的计算器必须能够使用任何算术表达式。

请帮助。

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

一些提示:从右到左解析;找到基于卫生间最内层的操作并从那里开始;递归地定义解析代码。 – vandale

+0

你正在上什么课程?这几乎肯定要求语法树分析器。在调用你实现的4个基本计算之前,表达式字符串被解析。 – neurite

+0

以计算机科学。我应该怎么做?解析表达式字符串?如何? – user2997545

回答

0

所以,你需要撰写你的算术表达式...

添加一个基类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); 

希望帮助实例。

编辑: 表达式应该是一个抽象类(你不应该是能够做到表达EX =新的表达式();),甚至一个接口:

public abstract class Expression { 

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

} 
+0

Thx的帮助 – user2997545

+0

可以让我告诉我什么表达类看起来像什么,我应该如何在我的子类(没有示例数字)实现getValue。 Thx提前 – user2997545

+0

thx为您提供帮助! – user2997545

0

没有得到太多太困难,你可以只超载的构造,使他们能够处理其它算术表达式:

public class Division extends ArithmeticExpression { 

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

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

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

+0

有效的解决方案,当且仅当评估返回的东西。 –

+0

好点...为什么不评估返回的东西? – DanK

+0

他可能是一个新手,他会弄明白:) –