Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中实现用户输入功能#_C#_Methods_Static Methods_Bisection - Fatal编程技术网

C# 如何在C中实现用户输入功能#

C# 如何在C中实现用户输入功能#,c#,methods,static-methods,bisection,C#,Methods,Static Methods,Bisection,我在C#控制台应用程序中编写了对分法程序。二分法是可行的,但对于已经在代码中编写的函数。我想编辑程序,用户可以输入功能,他们想用二分法。例如,Console.ReadLine()用于输入“x^2+x-2”,然后我希望它在下面的代码中返回后自动写入 static double Function(double x) { return x*x - 2; } //this is Function which I used in code. 这是全部代码。

我在C#控制台应用程序中编写了对分法程序。二分法是可行的,但对于已经在代码中编写的函数。我想编辑程序,用户可以输入功能,他们想用二分法。例如,Console.ReadLine()用于输入“x^2+x-2”,然后我希望它在下面的代码中返回后自动写入

        static double Function(double x)
    {
        return x*x - 2;
    } //this is Function which I used in code.
这是全部代码。(正如我提到的,它适用于静态双函数(double x)部分中编写的函数

使用系统;
名称空间MPI
{
类主类
{
公共静态void Main(字符串[]args)
{
//在[a,b]
双inPoc=0;//a
双inKraj=0;//b
双sredina=0;
双塔克诺斯特=0;
开始:
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 taconst:”);
tacnost=Convert.ToDouble(Console.ReadLine());
sredina=(inPoc+inKraj)/2;
if(函数(inPoc)*函数(inKraj)<0)
{
while((Math.Abs(inPoc-inKraj))>tacnost)
{
sredina=(inPoc+inKraj)/2;
控制台写入线(“trenutno X:+sredina”);
控制台写入线(“Funkcija za trenutno x ima vrednost:”+函数(sredina));
控制台。写线(“”);
i++;
if(函数(sredina)<0)
{
inPoc=sredina;
}
其他的
{
inKraj=sredina;
}
}
控制台写入线(“X:+sredina);
控制台写入线(“Broj izvrsenih koraka je”+i);
}
其他的
{
Console.WriteLine(“Krajevi intervala funkcije su istog znaka”);
Console.WriteLine();
}
goto Start;//sluzi da vrati计划的一部分
}
静态双功能(双x)
{
返回x*x-2;//primer funkcije
}
}
}
看起来他也在问同样的问题

为此,有两种解决方案:

解决方案1-只需使用即可

复制粘贴自:

ExpressionContext=newexpressioncontext();
VariableCollection变量=context.variables;
变量。添加(“a”,100);
变量。添加(“b”,1);
变量。添加(“c”,24);
IGenericExpression e=context.CompileGeneric((a=100或b>0)和c2”);
bool result=e.Evaluate();
因此,您也可以这样做,只需更改输入/输出类型并将您的输入行放入
CompileGeneric

解决方案2-手动解析输入字符串

所以问题可以分为两部分:

  • 如何将输入字符串解析为
  • 如何执行此树
对于第一项-请检查。它允许构造计算堆栈


接下来,您将能够计算表达式树。每个操作数(修剪后)将具有变量或整数常量。因此,只需将变量替换为实际值,并将字符串解析为整数即可。

如果您在代码中翻译字符串和注释,这样每个人都可以理解它们所说的内容,可能会很方便。您是否查看了
dotnet脚本
?用户可以在那里以交互方式编写代码,而无需parsi需要ng()。另一种可能是使用反射将用户输入直接解释为C代码:
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
        }
    }
}
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();