2013-01-25 56 views
0

我必須寫在Java類,它支持代表與2方法 - EVAL和toString具有以下暗箱使用算術表達式:編寫Java類,用於評估算術表達式

Expression e = 
new Multiplication( 
    new Addition( 
     new Double(2.5), 
     new Double(3.5)), 
    new UnaryMinus( 
     new Integer(5))); 
System.out.println(e.eval()); // should print out -30.0 
System.out.println(e.toString()); // should print out ((2.5 + 3.5) * (-(5))) 

我怎麼能設計這樣的類?哪些工具?哪種設計模式?

+2

哪一類(ES)更多更好地做自己想做的設計?你試過什麼了? –

+0

聽起來像是給我的功課。 –

+0

聽起來很像我的功課。 –

回答

2

你只需要適當地實現每個運營商的toStringeval。然後,根據需要在每個組件上分別調用toStringeval,然後應用它們自己的零件。

所以Addition.eval()將執行return left.eval() + right.eval();

同樣,Addition.toString()將執行return "(" + left.toString() + " + " + right.toString() + ")";

爲了實現這一點,你會使用一個接口與Composite模式羅布建議建立適當的類重寫這些方法。

1

您需要Expression類,然後是CompoundExpressionTerminalExpression。這聽起來像什麼模式? Composite。然後,如果你喜歡,你可以使用Visitor進行解析。當你提供一種小語言時,無論是算術還是其他解釋的命令集,都會有複合命令,例如,表達式4 +(5 * 2)將被解析爲多個命令並添加到CompoundExpression中,當您調用eval時,它將遍歷其表達式樹來計算答案。 (設計模式對你很好,順便說一句,學習它們會使你成爲一個更好的編碼器。)

+0

我以爲我已經鏈接複合材料,傑夫。我會編輯。 – Rob

1

如果您可以修改黑匣子的使用情況,那麼一個小建設者模式可能是一個不錯的方法。它可能看起來更像:

Builder builder = new MathBuilder(); 表達式e = builder.add(new Double(2.5)).add(new Double(3.5).multiply(-5);

您必須按照操作順序制定細節,但總的來說似乎是一個很好的使用模式。快速搜索將大量的實例。

2

我怎麼能設計這樣的課程?

那麼有很多的黑盒線索你已經給出的示例代碼

  • 您需要一個名爲Expressioninterface(或可能是abstract class),它具有eval方法。 eval方法需要返回某種數字類型 - Double將是一個不錯的選擇,但還有其他選項。

  • 您需要一些表達式類(實現或擴展表達式),例如Multiplication,AdditionUnaryMinus。這些需要提供eval方法的實現。他們還需要覆蓋默認的toString()方法來打印表達式。

  • 表達式類還需要參數類型爲的示例所暗示的構造函數。

有出思想需要找出如何處理一點點都

new Multiplication( 
    new Addition( 
     new Double(2.5), 
     new Double(3.5)), 
    new UnaryMinus( 
     new Integer(5))); 

new Multiplication( 
    new Double(2.5), 
    new Double(3.5)); 

...那是你的工作了。並通過爲自己工作而學習。 (或者可能沒有打擾,因爲嚴格來說,實施您向我們展示的示例並非必不可少。)

哪些工具?

無要求......除了一個Java JDK安裝(顯然)。使用您最喜歡的/推薦的Java IDE,或簡單的文本編輯器和JDK命令行工具。

哪種設計模式?

沒有要求。只是一些「常見或花園變種」多態性。定期的OO類和接口。

+0

+1,用於逐一解決問題,但留給OP學習空間。 –

1

希望這有助於

值存取1:

public abstract class Expression 
{ 
    public abstract decimal Evaluate(); 
    public abstract string toString(); 
} 

步驟2:

public abstract class ValueNode:Expression 
{ 
    public int intvalue; 
    public decimal decvalue; 
    public abstract decimal TEvaluate(); 
    public abstract string TtoString(); 

    public override decimal Evaluate() 
    { 
     return TEvaluate(); 
    } 

    public override string toString() 
    { 
     return TtoString(); 
    } 
} 

步驟2。1:

public abstract class OperationNode:Expression 
{ 
    public Expression left; 
    public Expression right; 
    public override decimal Evaluate() 
    { 
     return this.EEvaluate(); 
    } 
    public override string toString() 
    { 
     return this.EtoString(); 
    } 
    public abstract decimal EEvaluate(); 
    public abstract string EtoString(); 

}

步驟3:

public class UnaryMinus:OperationNode 
{ 
    public UnaryMinus(Expression Left) 
    { 
     this.left = Left; 

    } 
    public override decimal EEvaluate() 
    { 
     return -(this.left.Evaluate()); 
    } 

    public override string EtoString() 
    { 
     return string.Format("(-({0}))",left.toString()); ; 
    } 

} 

步驟4:

public class DecimalClass:ValueNode 
{ 
    public DecimalClass(decimal decimalValue) 
    { 
     this.decvalue = decimalValue; 
    } 

    public override decimal TEvaluate() 
    { 
     return this.decvalue; 
    } 

    public override string TtoString() 
    { 
     return this.decvalue.ToString(); 
    } 
} 

步驟5:

public class Integer : ValueNode 
{ 
    public Integer(int decimalValue) 

    { 
     this.intvalue = decimalValue; 
    } 

public override decimal TEvaluate() 

    { 
     return this.intvalue; 
    } 

    public override string TtoString() 

    { 
     return this.intvalue.ToString(); 
    } 
} 

步驟6:

public class Addition:OperationNode 
{ 

    public Addition(Expression Left, Expression Right) 

    { 
     this.left = Left; 
     this.right = Right; 
    } 
    public override decimal EEvaluate() 
    { 
     return left.Evaluate()+ right.Evaluate(); 
    } 
    public override string EtoString() 
    { 
     return string.Format("({0}+{1})",left.toString(),right.toString()); ; 
    } 
} 

步驟7:

public class Multiplication : OperationNode 

{ 
    public Multiplication(Expression Left, Expression Right) 
    { 
     this.left = Left; 
     this.right = Right; 
    } 
    public override decimal EEvaluate() 
    { 
     return left.Evaluate()* right.Evaluate(); 
    } 

    public override string EtoString() 
    { 
     return string.Format("({0}*{1})",left.toString(),right.toString()); ; 
    } 
} 

步驟8:

public class Substraction:OperationNode 
{ 
    public Substraction(Expression Left, Expression Right) 
    { 
     this.left = Left; 
     this.right = Right; 
    } 
    public override decimal EEvaluate() 
    { 
     return left.Evaluate()- right.Evaluate(); 
    } 

    public override string EtoString() 
    { 
     return string.Format("({0}-{1})",left.toString(),right.toString()); ; 
    } 
} 

步驟9:

public class Division: OperationNode 
{ 
    public Division(Expression Left, Expression Right) 
    { 
     this.left = Left; 
     this.right = Right; 
    } 
    public override decimal EEvaluate() 
    { 
     return left.Evaluate()/ right.Evaluate(); 
    } 

    public override string EtoString() 
    { 
     return string.Format("({0}/{1})",left.toString(),right.toString()); ; 
    } 
} 

步驟10:

class Program 
{ 
    static void Main(string[] args) 
    { 

     callComposit(); 
     Console.ReadKey(); 
    } 

    private static void callComposit() 
    { 
     //Expression ((2.5+3.5)*(-(5))) 
     Multiplication multiplication = new Multiplication(new Addition(new DecimalClass(2.5m), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5))); 
     Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication.toString(), multiplication.Evaluate())); 



     //Expression (5/6) 
     Division division = new Division(new Integer(5), new Integer(6)); 
     Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", division.toString(), division.Evaluate())); 
     //Expression ((2.5-3.5)*(-(5))) 
     Multiplication multiplication2 = new Multiplication(new Substraction(new DecimalClass(2.5m), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5))); 
     Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication2.toString(), multiplication2.Evaluate())); 
     //Expression ((2.5/3.5)*(-(5))) 
     Multiplication multiplication3 = new Multiplication(new Division(new DecimalClass(2.5m), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5))); 
     Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication3.toString(), multiplication3.Evaluate())); 

     //Expression ((2.5/3.5)*(-(5))* 3.5) 
     Multiplication multiplication4 = new Multiplication(new Multiplication(new Division(new DecimalClass(2.5m), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5))), new DecimalClass(3.5m)); 
     Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication4.toString(), multiplication4.Evaluate())); 


     //Expression (3.5*(2.5/3.5)*(-(5))) 
     Multiplication multiplication5 = new Multiplication(new Multiplication(new DecimalClass(3.5m), new Division(new DecimalClass(2.5m), new DecimalClass(3.5m))), new UnaryMinus(new Integer(5))); 
     Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication5.toString(), multiplication5.Evaluate())); 

     //Expression (3.5*(2.5/3.5)+ 3.5 *(-(5))) 
     Multiplication multiplication6 = new Multiplication(new Addition(new Multiplication(new DecimalClass(3.5m), new Division(new DecimalClass(2.5m), new DecimalClass(3.5m))), new DecimalClass(3.5m)), new UnaryMinus(new Integer(5))); 
     Console.WriteLine(string.Format("\r\n Expression {0} resulted in {1}", multiplication6.toString(), multiplication6.Evaluate())); 
    } 
} 

請評論如果有什麼需要做的工作做的比這樣 快樂編碼