2013-01-25 50 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())); 
    } 
} 

请评论如果有什么需要做的工作做的比这样 快乐编码