用像C#这样的OOP语言表示代数表达式

时间:2014-03-03 20:13:38

标签: c# oop algebra

我试图在C#中表示代数表达式,例如多项式和非多项式。目前我有以下课程

class Variable {
    public char Var {get; set;}
    public int Exponent {get; set;}
...
}

class Term {
    public IList<Variable> {get; set;}
    public int CoEfficient {get; set;}
...
}

class Expression {
    public IList<Term> {get; set;}
...
}

这允许我表示简单的多项式,例如x ^ 2 + 3x-8,但我希望能够将这样的表达式表示为(x + 3)(x-2)和3x(y + 2)。我一直试图找出这个术语,我认为第一个是表达式'(x + 3)(x-2)'包含两个表达式'x + 3'和'x-2'各包含两个术语'x','3'和'x',' - 2'。第二个是表达式'3x(y + 2)',其中包含一个表达式'y + 2'乘以术语'3x'我在想,而不是Expression类中的术语列表,它是一个对象列表,它是Expression和Term的基类,并使用某种递归

我怎样才能在课程中代表这一点?

我还希望能够表示分数和其他非多项式

这如何适应图片?

1 个答案:

答案 0 :(得分:2)

拥有表达式的基类可以让你用其他表达式构建表达式。

public abstract class BaseExpression
{
}

public class VariableExpression : BaseExpression
{
   public string Var {get; set;}
   public int Exponent {get; set;}
}

public class ConstExpression : BaseExpression
{
   public object Val {get; set;}
}

public class BinExpression : BaseExpression
{
   public BaseExpression Left { get; set; }
   public BaseExpression Right { get; set; }
   public string Operator { get; set; }
}

例如x(y-1)将是

var xy_1 = new BinExpression()
{
   Left  = new VariableExpression() { Var = "x" },
   Right = new BinExpression()
   {
       Left     = new VariableExpression() { Var = "y" },
       Right    = new ConstExpression() { Val = "1" },
       Operator = "-"
   },
   Operator = "*"
}