C# 随机控制台数学方程游戏 : Converting string back to equation?

标签 c# console-application

我目前正在自学 C#,并提出了如下的程序想法:

  1. 程序生成随机数
  2. 程序生成随机数学运算符
  3. 程序生成随机数
  4. 询问用户随机生成问题的答案
  5. 用户输入答案
  6. 程序将生成的问题的结果与用户的输入进行比较
  7. 程序打印用户是否正确。

我遇到的问题是我只能以以下格式/数据类型打印方程:

(示例)5 + 1 (数字、字符串运算符、数字)

或者将上述数据类型组合成一个字符串

从那里开始,问题是我无法弄清楚如何将所有这些转换为可以存储在变量中然后与用户输入进行比较的数学方程。

我确信我让事情变得比实际情况更加困难,但我已经浏览过这个程序、论坛和大量帖子,但无法将任何内容拼凑在一起。

在我学习 C# 的过程中,任何对我的代码以及我出错的地方的见解都将不胜感激!

public static void Main(string[] args)
{
    mathProblem();
    int userAnswer = Convert.ToInt32(Console.ReadLine());
}

public static void mathProblem()
{
    Random numberGenerator = new Random();
    Random operatorSelect = new Random();

    //Generates random number for 1st part of problem
    int number1 = numberGenerator.Next(1, 11);
    //Generates random number for 2nd part of problem
    int number2 = numberGenerator.Next(1, 11);
    //int to store/assign random operator
    int mathOperator = 0;
    //newOperator set to empty string that will change and store operator generated
    string newOperator = "";

    // gives value of 1-4
    mathOperator = operatorSelect.Next(5);
    switch (mathOperator)
    {
        case 1:
            newOperator = "+";
            break;
        case 2:
            newOperator = "-";
            break;
        case 3:
            newOperator = "*";
            break;
        case 4:
            newOperator = "/";
            break;
        default:
            newOperator = "+"; 
            break;
    }

    Convert.ToString(number1);
    Convert.ToString(number2);

    Console.WriteLine("What is " + number1 + " " + newOperator + " " + number2 + "?");
}

最佳答案

算术运算是接受两个数字并返回第三个数字的函数。一般来说,它们可以表示为函数:

int AddOperation(int a, int b)
{
    return a + b;
}

此类函数的委托(delegate)可以存储在类型为 Func<int,int,int> 的变量中。 .

Func<int,int,int> functionPointer = AddOperation;

而不是仅仅为 AddOperation 声明整个方法,您还可以将其存储为 anonymous methodlambda expression 声明:

Func<int,int,int> functionPointer = (a,b) => a + b;

您可以存储一系列这些函数,例如,存储在字典中:

var operators = new Dictionary<string,Func<int,int,int>>
{
    { "+", (a,b) => a + b },
    { "-", (a,b) => a - b },
    { "*", (a,b) => a * b },
    { "/", (a,b) => a / b }
};

然后要执行操作,请查找函数:

var symbol = "+";
var operation = operators[symbol];

...并用它来计算结果:

var result = operation(arg1,arg2);

下面是对数字 10 和 2 执行所有四种运算的示例:

public static void Main()
{
    var operators = new Dictionary<string,Func<int,int,int>>
    {
        { "+", (a,b) => a + b },
        { "-", (a,b) => a - b },
        { "*", (a,b) => a * b },
        { "/", (a,b) => a / b }
    };

    var arg1 = 10;
    var arg2 = 2;

    foreach (var symbol in operators.Keys)
    {
        var func = operators[symbol];
        var result = func(arg1,arg2);
        Console.WriteLine("{0}{1}{2}={3}", arg1, symbol, arg2, result);
    }
}

输出:

10+2=12
10-2=8
10*2=20
10/2=5

Link to working example on DotNetFiddle

关于C# 随机控制台数学方程游戏 : Converting string back to equation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52844358/

相关文章:

C#:为什么类变量调用实现的接口(interface)方法比接口(interface)变量更快?

c# - 是否可以在 Asp.NET razor 代码中嵌套 foreach 循环?

c++ - 如何在我的 C++ 输出中添加 ಠ 符号

javascript - 如何运行本地 Windows 应用程序并将输出通过管道传输到浏览器

C#,XML 查询问题

c# - 如何压缩随机字符串?

c# - 在控制台应用程序中显示多行文本?

vb.net - 如何使 Visual Basic 控制台应用程序中的输出跨越终端窗口的整个宽度?

powershell - 如何更改 Windows 的默认控制台主机应用程序?

C# 在屏幕上查找图像匹配