【问题标题】:How can user input function in C#如何在 C# 中实现用户输入功能
【发布时间】:2019-03-29 20:11:30
【问题描述】:

我在 C# 控制台应用程序中制作了二分法程序。二分法有效,但对于已经写在代码中的函数。我想编辑用户可以输入他们想要用于二分法的函数的程序。例如 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) 部分

中编写的函数
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
        }
    }
}

【问题讨论】:

  • 如果你翻译代码中的字符串和 cmets 可能会很方便,这样每个人都可以理解他们所说的。
  • 你看dotnet-script了吗?在那里,用户可以交互地编写您的代码,并且不需要解析 (hanselman.com/blog/…)。另一种可能性是使用反射将用户输入直接解释为 C# 代码:codeproject.com/Articles/9019/…

标签: c# methods static-methods bisection


【解决方案1】:

看起来this question 在问同样的问题。

有两种解决方案:

解决方案 1 - 只需使用 Flee

documentation复制粘贴:

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 - 手动解析输入字符串。

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

  • 如何将输入字符串解析为expression tree
  • 如何执行这棵树。

对于第一项 - 请检查reverse polish notation。它允许构建计算堆栈。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2023-04-05
    相关资源
    最近更新 更多