C # вычтите 2 строки без получения отрицательных значений

#c#

#c#

Вопрос:

мне нужна помощь с моим кодом. я должен создать математическую игру с вычитанием без получения отрицательных значений, но мой код, похоже, не работает.

 int c = a - b;
if (c < 0)
{
    Random ro = new Random();
    a = ro.Next(10)   1;
    b = ro.Next(10)   1;
    lb_getal1.Text = a.ToString();
    lb_getal2.Text = b.ToString();
}
if (txt_antwoord.Text == c.ToString())
{
    MessageBox.Show("You provided the right answer!");
    score  = 1;

    Random r = new Random();
    a = r.Next(10)   1;
    b = r.Next(10)   1;
    lb_getal1.Text = a.ToString();
    lb_getal2.Text = b.ToString();
}
else
{
    MessageBox.Show("You were wrong!");
}
if (score == 5)
{
    MessageBox.Show("You answered 5 answers correctly! Well done!");
    this.Close();
    RM_menu form = new RM_menu();
    form.Show();
}
  

Комментарии:

1. Что именно не работает так, как ожидалось?

2. Пожалуйста, используйте английскую строку при публикации вашего кода. Другие не поймут локализованную строку.

3. Отредактируйте свой вопрос и добавьте ожидаемое поведение, а что не работает

Ответ №1:

В вашем коде есть несколько проблем. Первое, что нужно улучшить: используйте только один экземпляр Random .

Random Класс предоставляет псевдослучайные числа из списка. Если вы создаете экземпляр с конструктором по умолчанию new Random() , экземпляр инициализируется начальным значением, взятым из текущего времени. Поскольку между вашими двумя вызовами проходит не так много времени, оба экземпляра, вероятно, используют одно и то же начальное значение, и вы получите одинаковые значения для a и b снова.
Я предлагаю создать только один экземпляр и сохранить его в переменной-члене вашего класса.

Вторая проблема: если ваша первая попытка дает отрицательный результат c , вы повторяете попытку только один раз, но это не гарантирует, что на этот раз результат будет положительным. Лучший подход — сравнить a и b и переключить, если b больше.

Таким образом, ваш код может выглядеть следующим образом:

 public class YourGame : Form // I guess it's a Form
{
    private Random randomGenerator = new Random();
    private int a;
    private int b;
    private int score;

    public void CreateQuestion()
    {
        a = randomGenerator.Next(10)   1;
        b = randomGenerator .Next(10)   1;
        if (b > a)
        {
            // switch values
            int tmp = b;
            b = a;
            a = tmp;
        }

        lb_getal1.Text = a.ToString();
        lb_getal2.Text = b.ToString();            
    }

    private void OnAnswer()
    {
        int c = a - b; // will never be negative as we checked a and b above
        if (txt_antwoord.Text == c.ToString())
        {
            MessageBox.Show("You provided the right answer!");
            score  = 1;
            CreateQuestion();
        }
        else
            MessageBox.Show("You were wrong!");

        if (score == 5)
        {
            MessageBox.Show("You answered 5 answers correctly! Well done!");
            this.Close();
            RM_menu form = new RM_menu();
            form.Show();
        }
    }
}
  

Комментарии:

1. хороший ответ на неаккуратный вопрос.

2. @Natrium бывают дни, когда я просто голосую за закрытие, а потом бывают дни, когда я думаю: «Эй, это очевидно, давайте поможем»…

Ответ №2:

Я не пытаюсь решить эту проблему, но пытаюсь дать некоторые рекомендации о том, как убедиться, что значение не будет меньше нуля при использовании Random .

 int a, b, c;
Random ro;

ro = new Random();
b = ro.Next(10);
a = ro.Next(b, 10);
c = a - b;
  

Как вы можете видеть, сначала мы устанавливаем случайное значение в b using ro.Next(10) , а затем указываем минимальное значение с помощью ro.Next(b, 10)

При этом гарантируется, что значение при выполнении не будет меньше нуля a-b .

Комментарии:

1. Хорошая идея использовать эту Next перегрузку.

Ответ №3:

вы можете использовать Math.Abs

 int c = Math.Abs (a-b);
  

Комментарии:

1. Как это решает проблему? Нет… Какую проблему, по вашему мнению, вы решали?

2. итак, у этого парня есть 2 числа, и он не хочет вычитать их таким образом, чтобы получить отрицательный ответ, поэтому он, вероятно, даже хотел поменять местами эти числа, как у Рене в его коде. Итак, я просто предложил абсолютную функцию, поэтому вам не придется проверять отрицательное значение или что переменная слева от вычитания должна быть больше. Вы думаете, это не отвечает на вопрос? поскольку вопрос в любом случае расплывчатый, получит он полный ответ или нет, он должен знать, что функция Abs существует.

3. и ваш ответ, и ваш комментарий имеют смысл, но я до сих пор понятия не имею, с какой именно проблемой сталкивается OP.