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