C#随机控制台数学方程式游戏:将字符串转换回方程式?

时间:2018-10-16 21:35:35

标签: 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 + "?");
}

2 个答案:

答案 0 :(得分:3)

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

kwargs = kwarg1 kwarg2 kwarg3

if kwarg1: python script1.py
if kwarg2: python name2000.py
if kwarg3: python program30.py

此类函数的委托可以存储在键入为int AddOperation(int a, int b) { return a + b; } 的变量中。

Func<int,int,int>

您可以将其存储为用anonymous method声明的lambda expression,而不是只为Func<int,int,int> functionPointer = AddOperation; 声明整个方法:

AddOperation

您还可以将一系列这些功能存储在字典中,例如:

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];

这是一个对数字10和2执行全部四个运算的示例。

var result = operation(arg1,arg2);

输出:

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);
    }
}

Link to working example on DotNetFiddle

答案 1 :(得分:0)

我认为您正在朝错误的方向前进。为什么需要将运算符存储为字符串?为什么所有这些单独的随机实例?最后,您需要随机生成一个数学问题,对吗?并且您必须确定用户是否获得正确的答案。

首先,请使用单个 static Random字段而不是局部变量:

private static Random rnd = new Random();

public static void GenerateRandomMathProblem()
{
    // code
}

See here提供了一些很好的信息,说明了为什么不想像以前那样使用多个Random变量。

也考虑使用比mathProblem()更佳的名称,使用更具描述性的内容( 数学问题?),并使用正确的大小写(PascalCase)。

第二个问题:您跟踪的变量。我认为您应该只关心这些变量:

int number1 = rnd.Next(1, 11);

int number2 = rnd.Next(1, 11);

// Store the answer, has to be a double since you have some division operation
double answer = 0;

// Store the question so you can ask the user
string question = string.Empty;

现在,您的开关盒必须执行双重职责。执行实际的数学运算并将结果存储在answer中,并生成实际的 string 问题并分配给question

// Case of '-'
case 1:
    answer = number1 - number2; //Gets the answer
    question = $"{number1} - {number2}"; //Syntax is called string interpolation, its a little cleaner than concatenation
    break;

我们已经生成了问题,因此我们不再需要数字变量,但是请注意,您进行的Convert调用完全没有必要。 Console.WriteLine()自动调用其参数的ToString()。而且C#中的每件事都可以调用.ToString(),因为它是object的成员,并且C#中的所有东西都继承自System.Object

现在,最后,当您提出问题时,可以使用Console.WriteLine()的“格式化”功能来代替字符串连接,以使您的代码更简洁:

// The {0} will be replaced with the value of 'question' in the console
Console.WriteLine("What is {0}?", question);