Как может пользовательский ввод функции в C#

Я сделал программу метода деления пополам в C# Console Application. Метод деления пополам работает, но для функции, которая уже написана в коде. Я хочу отредактировать программу, чтобы пользователь мог ввести функцию, которую он хочет использовать для метода деления пополам. Например, Console.ReadLine() для ввода "x ^ 2 + x - 2", а затем я хочу, чтобы он автоматически записывался после возврата в приведенном ниже коде.

        static double Function(double x)
    {
        return x*x - 2;
    } //this is Function which I used in code.

Вот весь код. (как я уже говорил, это работает для функции, которая написана в статической части двойной функции (двойной х)

using System;

namespace MPI
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            // in [a,b]
            double inPoc = 0; //a
            double inKraj = 0; //b
            double sredina = 0;
            double tacnost = 0;



        Start:
            int i = 0; //brojac


            Console.Write("Unesite početak intervala: ");
            inPoc = Convert.ToDouble(Console.ReadLine());
            Console.Write("Unesite kraj intervala: ");
            inKraj = Convert.ToDouble(Console.ReadLine());
            Console.Write("Unesite tacnost: ");
            tacnost = Convert.ToDouble(Console.ReadLine());

            sredina = (inPoc + inKraj) / 2;

            if (Function(inPoc) * Function(inKraj) < 0)
            {


                while ((Math.Abs(inPoc - inKraj)) > tacnost)
                {
                    sredina = (inPoc + inKraj) / 2;

                    Console.WriteLine("trenutno X: " + sredina);
                    Console.WriteLine("Funkcija za trenutno x ima vrednost: " + Function(sredina));
                    Console.WriteLine("");
                    i++;


                    if (Function(sredina) < 0)
                    {
                        inPoc = sredina;
                    }
                    else
                    {
                        inKraj = sredina;
                    }
                }
                Console.WriteLine("X: " + sredina);
                Console.WriteLine("Broj izvrsenih koraka je " + i);
            }

            else
            {
                Console.WriteLine("Krajevi intervala funkcije su istog znaka");
                Console.WriteLine();

            }


            goto Start; //sluzi da vrati program na pocetak kako bi ga opet koristili

        }


        static double Function(double x)
        {
            return x*x - 2; //primer funkcije
        }
    }
}

1 ответ

Похоже, этот вопрос задает примерно то же самое.

Есть два решения для этого:

Решение 1 - просто используйте Flee.

Скопируйте из документации:

ExpressionContext context = new ExpressionContext();
VariableCollection variables = context.Variables;
variables.Add("a", 100);
variables.Add("b", 1);
variables.Add("c", 24);

IGenericExpression<bool> e = context.CompileGeneric<bool>("(a = 100 OR b > 0) AND c <> 2");
bool result = e.Evaluate();

Таким образом, вы можете сделать то же самое, просто измените типы ввода / вывода и поместите строку ввода в CompileGeneric

Решение 2 - разобрать входную строку вручную.

Так что вопрос можно разделить на две части:

Для первого пункта - пожалуйста, проверьте обратную польскую запись. Это позволяет построить стек вычислений.

Далее вы сможете вычислить ваше дерево выражений. Каждый операнд (после обрезки) будет иметь переменную или целочисленную константу. Так что просто замените переменную на фактическое значение и просто разберите строку на целое число.

Другие вопросы по тегам