Представлять алгебраические выражения на языке ООП, таком как 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 и используют какую-то рекурсию

Как я могу представить это на своих занятиях?

Я также хочу иметь возможность представлять дроби и другие неполиномы

Как это вписывается в общую картину?


person John ClearZ    schedule 03.03.2014    source источник
comment
x и 3 также являются выражениями. См. также peterjuhasz.net/Articles/Details/extending-c- Sharp-with-алгебра и en.wikipedia.org/wiki/Binary_expression_tree   -  person Robert Harvey    schedule 04.03.2014


Ответы (1)


Наличие базового класса для выражений позволяет создавать выражения из других выражений.

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 = "*"
}
person Wiktor Zychla    schedule 03.03.2014
comment
Итак, вы говорите отказаться от попыток абстрагироваться от математических терминов и использовать шаблон ast, что имеет смысл, поскольку я все равно хочу проанализировать эти термины из строки. - person John ClearZ; 04.03.2014
comment
Да, у такого представления много преимуществ, в том числе возможность легко реализовать синтаксический анализ, рекурсивные алгоритмы, проверку и т. д. - person Wiktor Zychla; 04.03.2014