Ввод функции в 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];
            }
            
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы