Ввод функции в 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]; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д