C # Случайная консольная математическая игра: Преобразование строки обратно в уравнение? - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время я учу себя 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 голосов
/ 17 октября 2018

Я думаю, что вы идете об этом в неправильном направлении.Зачем вам хранить оператор в виде строки?Почему все эти отдельные случайные экземпляры?В конце дня вам нужно случайным образом генерировать математические задачи, верно?И вы должны определить, правильно ли получил ответ пользователь или нет.

Итак, обо всем по порядку, используйте одиночное static Random поле вместо локальной переменной:

private static Random rnd = new Random();

public static void GenerateRandomMathProblem()
{
    // code
}

См. Здесь для некоторого хорошегоинформация о том, почему вы не хотите использовать несколько 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);
0 голосов
/ 17 октября 2018

Арифметические операции - это функции, которые принимают два числа и возвращают третье число.В общем случае они могут быть выражены как функция:

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

Делегат для такого рода функции может быть сохранен в переменной, которая имеет тип Func<int,int,int>.

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

... и используетечтобы вычислить результат:

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

Ссылка на рабочий пример на DotNetFiddle

...