2013-11-15 114 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

他可能是一個新手,他會弄明白:) –