Ввод функции в textbox и ее вычисление - C#
Формулировка задачи:
У меня задача в том, чтобы написать программу, которая выполняла бы метод дихотомии. Алгоритм простой. Но у меня возникла сложность в том, чтобы можно было ввести в textbox функцию, например "x^2+2x" и чтобы программа поняла, что это и смогла бы работать с ней, а не тупо приняла бы за непонятный набор символов. Подскажите способы решения данной проблемы, пожалуйста.
Решение задачи: «Ввод функции в textbox и ее вычисление»
textual
Листинг программы
public class Polynomial
{
public string strPolynom;
public double [,] Members;
readonly public int nCoutmembers;
static public Polynomial NewPolynom ()/// <summary>
/// Метод для создания объекта типа Polynomial
/// </summary>
/// <returns></returns>
{
Console.WriteLine("Введите многочлен:");
string strPoly = Console.ReadLine ();
Polynomial a = new Polynomial (strPoly);
if (a.strPolynom !=Polynomial.Reduction(a).strPolynom)
{
Console.WriteLine("Введённый многочлен возможно упростить. Упростить? (y/n) ");
if (Console.ReadLine().ToUpper() =="Y")
a=Polynomial.Reduction(a);
Console.WriteLine("Массив выглядит как: ");
a.Write ();
}
return a;
}
private int CoutMembers (string str)/// <summary>
/// Счётчик членов в многочлене
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
{
return (str.Length - str.Replace("+","").Replace("-","").Length)+1;
}
private void WriteMembers (string str )/// <summary>
/// Метод вычленяет из строки коэффициент перед X и степень X и присваивает в соответствующие поля члена Polynomial
/// </summary>
/// <param name="str"></param>
{
string member = null;
int nIndex = 1;
int i =0;
int flag =1;
do
{
if ((str[nIndex]=='+')||(str[nIndex]=='-')||(str[nIndex]==' '))
{
member = str.Substring(0,nIndex);
int nIndexOfX = member.Contains("x")?member.IndexOf("x",0):0;
Members[i,0]=MakeDouble(member.Substring(0,nIndexOfX))*flag;
flag=(str[nIndex]=='-')?-1:1;
Members[i,1] = member.Contains("^")?MakeDouble(member.Substring(nIndexOfX+=2,member.Length-nIndexOfX)):member.Contains("x")?1:0;
str = str.Remove(0,nIndex+1);
nIndex=-1;
i++;
}
}while (str.Length>++nIndex);
}
private double MakeDouble (string str)/// <summary>
/// Метод принимает строковое значение числа и возвращает его эквивалент типа double, адаптированно для распознавания коэффициентов перед X
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
{
double result = 0;
if (str == "")str = "1";
if (str == "-")str = "-1";
if (!(Double.TryParse(str,out result)))
throw new ArgumentException("Введённый многочлен некоректен");
return result;
}
static public Polynomial Reduction (Polynomial a)/// <summary>
/// Метод осуществляет упрощение многочлена. Не все баги выловленны.
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
{
Polynomial b = new Polynomial (a.Members);
double [,] newMembers = new double[b.nCoutmembers,2];
for (int i = 0;i<b.nCoutmembers;i++)
{
double help = newMembers[i,0]=b.Members[i,0];
double help2 =newMembers[i,1]=b.Members[i,1];
for (int j=i+1; j<b.nCoutmembers;j++)
{
if (a.Members[i,1]==b.Members[j,1])
{
double d = b.Members[j,0];
d = b.Members[i,0];
newMembers[i,0]=b.Members[j,0]+newMembers [i,0];
d = newMembers[i,0];
b.Members[j,0]=0;
}
}
}
Polynomial c = new Polynomial (Polynomial.ToString (newMembers));
return c;
}
public double ResOfPolynominal (double X)/// <summary>
/// Считает значение многочлена при подстановке значения X
/// </summary>
/// <param name="X"></param>
/// <returns></returns>
{
double result = 0;
for (int i = 0; i < this.nCoutmembers; i++)
result+=Members[i,0]*Math.Pow(X,Members[i,1]);
return result;
}
public void Write()//Вывод на консоль многочлена
{
Console.WriteLine (this.strPolynom);
}
public Polynomial(string strPoly)//Конструктор многочлена по строковому представлению
{
strPolynom = strPoly.Replace (".",",")+" ";
nCoutmembers = this.CoutMembers (strPolynom);
Members = new double[nCoutmembers,2];
WriteMembers(strPolynom);
}
static private string ToString(double [,] Poly)/// <summary>
/// Метод создаёт сроковое представление многочлена из двумерного массива, описывающего многочлен
/// </summary>
/// <param name="Poly"></param>
/// <returns></returns>
{ string strPoly = "";
for (int i = 0;i<Poly.Length/2;i++)
{
double help = Poly[i,0];
double help2 = Poly[i,1];
strPoly=strPoly;
if (Poly[i,0]!=0)
{
if (Poly[i,0] ==-1)strPoly+="-";
else
if (Poly[i,0]!=1)
strPoly+=Poly[i,0].ToString();
if ((Poly[i,1]!=0))strPoly+="x";
}
if ((Poly[i,1]!=0)&&(Poly[i,1]!=1)&&(Poly[i,0]!=0))strPoly+=("^"+Poly[i,1].ToString());
if ((i<Poly.Length/2-1)&&(Poly[i+1,0]>=0)&&(Poly[i+1,0]!=0)) strPoly +="+";
}
return strPoly;
}
public Polynomial(double [,] Poly)//Конструктор многочлена по двумерному массиву
{
strPolynom = ToString(Poly);
nCoutmembers = this.CoutMembers (strPolynom);
Members = new double[nCoutmembers,2];
for (int i =0;i<nCoutmembers;i++)
{
Members[i,0]=Poly[i,0];
Members[i,1]=Poly[i,1];
}
}
}