Как может пользовательский ввод функции в C # - PullRequest
0 голосов
/ 25 октября 2018

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

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

Вот весь код.(как я уже говорил, это работает для функции, которая записана в static double Function (double x) part

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 Ответ

0 голосов
/ 25 октября 2018

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

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

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

Копирование-вставка из документации :

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 - проанализировать строку ввода вручную.

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

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

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

...