Поделиться через


Шаг 6. Добавление задачи на вычитание

В шестой части этого учебника вам предстоит добавить задачу на вычитание и научиться выполнять следующие задачи:

  • Хранение значений, которые участвуют в операции вычитания.

  • Создание случайных чисел для задачи (а также гарантия, что ответ лежит в диапазоне от 0 до 100).

  • Обновление метода, который проверяет ответы, таким образом, чтобы он также проверял новую задачу на вычитание.

  • Обновление обработчика событий таймера Tick таким образом, чтобы этот обработчик событий заполнял корректный ответ после истечения времени.

Добавление задачи на вычитание

  1. Добавьте в форму две целочисленные переменные для задачи на вычитание — между целочисленными переменными для задачи на сложение и для таймера.Код должен выглядеть следующим образом.

    Public Class Form1
    
        ' Create a Random object called randomizer  
        ' to generate random numbers. 
        Private randomizer As New Random
    
        ' These integer variables store the numbers  
        ' for the addition problem.  
        Private addend1 As Integer 
        Private addend2 As Integer 
    
        ' These integer variables store the numbers  
        ' for the subtraction problem.  
        Private minuend As Integer 
        Private subtrahend As Integer 
    
        ' This integer variable keeps track of the  
        ' remaining time. 
        Private timeLeft As Integer
    
    public partial class Form1 : Form
    {
        // Create a Random object called randomizer  
        // to generate random numbers.
        Random randomizer = new Random();
    
        // These integer variables store the numbers  
        // for the addition problem.  
        int addend1;
        int addend2;
    
        // These integer variables store the numbers  
        // for the subtraction problem.  
        int minuend;
        int subtrahend;
    
        // This integer variable keeps track of the  
        // remaining time. 
        int timeLeft;
    

    Имена новых целочисленных переменных — minuend и subtrahend — не являются терминами программирования.Это принятые в арифметике обозначения для числа, которое вычитается из другого числа (subtrahend — вычитаемое), и числа, из которого производится вычитание (minuend — уменьшаемое).Остаток — это уменьшаемое за минусом вычитаемого.Можно использовать другие имена, так как программа не требует определенных имен для переменных, элементов управления, компонентов или методов.Необходимо соблюдать правила — например, не начинать имена с цифр — но вообще можно использовать такие имена, как x1, x2, x3 и x4.Однако универсальные имена ухудшают читабельность кода, и при возникновении проблем отследить их источник становится практически невозможно.Чтобы имена переменных были уникальными и информативными, для умножения и деления далее в этом учебнике мы также будем использовать традиционные имена: multiplicand (множимое) × multiplier (множитель) = product (произведение); dividend (делимое) ÷ divisor (делитель) = quotient (частное).

    Затем необходимо изменить метод StartTheQuiz(), чтобы получить случайные значения для задачи на вычитание.

  2. Добавьте после комментария "Fill in the subtraction problem" (Заполнение задачи на вычитание) следующий код.

    ''' <summary> 
    ''' Start the quiz by filling in all of the problem  
    ''' values and starting the timer.  
    ''' </summary> 
    ''' <remarks></remarks> 
    Public Sub StartTheQuiz()
    
        ' Fill in the addition problem. 
        ' Generate two random numbers to add. 
        ' Store the values in the variables 'addend1' and 'addend2'.
        addend1 = randomizer.Next(51)
        addend2 = randomizer.Next(51)
    
        ' Convert the two randomly generated numbers 
        ' into strings so that they can be displayed 
        ' in the label controls.
        plusLeftLabel.Text = addend1.ToString()
        plusRightLabel.Text = addend2.ToString()
    
        ' 'sum' is the name of the NumericUpDown control. 
        ' This step makes sure its value is zero before 
        ' adding any values to it.
        sum.Value = 0
    
        ' Fill in the subtraction problem.
        minuend = randomizer.Next(1, 101)
        subtrahend = randomizer.Next(1, minuend)
        minusLeftLabel.Text = minuend.ToString()
        minusRightLabel.Text = subtrahend.ToString()
        difference.Value = 0
    
        ' Start the timer.
        timeLeft = 30
        timeLabel.Text = "30 seconds"
        Timer1.Start()
    
    End Sub
    
    /// <summary> 
    /// Start the quiz by filling in all of the problem  
    /// values and starting the timer.  
    /// </summary> 
    public void StartTheQuiz()
    {
        // Fill in the addition problem. 
        // Generate two random numbers to add. 
        // Store the values in the variables 'addend1' and 'addend2'.
        addend1 = randomizer.Next(51);
        addend2 = randomizer.Next(51);
    
        // Convert the two randomly generated numbers 
        // into strings so that they can be displayed 
        // in the label controls.
        plusLeftLabel.Text = addend1.ToString();
        plusRightLabel.Text = addend2.ToString();
    
        // 'sum' is the name of the NumericUpDown control. 
        // This step makes sure its value is zero before 
        // adding any values to it.
        sum.Value = 0;
    
        // Fill in the subtraction problem.
        minuend = randomizer.Next(1, 101);
        subtrahend = randomizer.Next(1, minuend);
        minusLeftLabel.Text = minuend.ToString();
        minusRightLabel.Text = subtrahend.ToString();
        difference.Value = 0;
    
        // Start the timer.
        timeLeft = 30;
        timeLabel.Text = "30 seconds"; 
        timer1.Start();
    }
    

    Чтобы в задаче на вычитание не было отрицательных ответов, метод Next() класса Random в этом коде используется несколько иначе, чем в задаче на сложение.Когда методу Next() передается два значения, он выбирает случайное число, которое больше первого значения или равно ему и меньше второго значения.Следующий код выбирает случайное число в диапазоне от 1 до 100 и сохраняет его в переменной minuend.

    minuend = randomizer.Next(1, 101)
    
    minuend = randomizer.Next(1, 101);
    

    Вызвать метод Next() класса Random, который мы ранее в этом руководстве назвали "randomizer", можно различными способами.Методы, которые можно вызывать несколькими способами, называются перегруженными. Для их изучения можно использовать IntelliSense.Посмотрите еще раз на всплывающую подсказку окна IntelliSense для метода Next().

    Подсказка окна Intellisense

    Подсказка окна Intellisense

    В подсказке сказано (+2 перегрузки), что означает, что вызвать метод Next() можно еще двумя способами.Перегрузки методов содержат разное количество или типы аргументов, поэтому работают слегка по-разному.Например, метод может принимать один целочисленный аргумент, тогда как одна из его перегрузок может принимать целое число и строку.Выбирайте подходящую перегрузку в зависимости от того, что требуется сделать.При добавлении кода в метод StartTheQuiz() в окне Intellisense появляется дополнительная информация, как только вы введете randomizer.Next(.Нажимайте клавиши СТРЕЛКА ВВЕРХ и СТРЕЛКА ВНИЗ для перебора перегрузок, как показано на следующем рисунке.

    Перегрузка метода Next() в IntelliSense

    Перегрузка метода Next() в IntelliSense

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

  3. Для проверки правильного ответа для задачи на вычитание, измените метод CheckTheAnswer().

    ''' <summary> 
    ''' Check the answers to see if the user got everything right. 
    ''' </summary> 
    ''' <returns>True if the answer's correct, false otherwise.</returns> 
    ''' <remarks></remarks> 
    Public Function CheckTheAnswer() As Boolean 
    
        If addend1 + addend2 = sum.Value AndAlso 
           minuend - subtrahend = difference.Value Then 
    
            Return True 
        Else 
            Return False 
        End If 
    
    End Function
    
    /// <summary> 
    /// Check the answers to see if the user got everything right. 
    /// </summary> 
    /// <returns>True if the answer's correct, false otherwise.</returns> 
    private bool CheckTheAnswer()
    {
        if ((addend1 + addend2 == sum.Value)
            && (minuend - subtrahend == difference.Value))
            return true;
        else 
            return false;
    }
    

    В Visual C# && — это оператор logical and .Эквивалентный оператор в языке Visual Basic — AndAlso.Эти операторы означают, что "Если addend1 плюс addend2 равно значению NumericUpDown с именем sum и если minuend минус subtrahend равно значению NumericUpDown с именем difference". Метод CheckTheAnswer() возвращает значение true, только если игрок дал правильные ответы и на задачу на сложение, и на задачу на вычитание.

  4. Замените последнюю часть обработчика событий таймера Tick следующим кодом, чтобы по истечении времени этот обработчик событий проставлял правильный ответ.

    Else 
        ' If the user ran out of time, stop the timer, show  
        ' a MessageBox, and fill in the answers.
        Timer1.Stop()
        timeLabel.Text = "Time's up!"
        MessageBox.Show("You didn't finish in time.", "Sorry!")
        sum.Value = addend1 + addend2
        difference.Value = minuend - subtrahend
        startButton.Enabled = True 
    End If
    
    else
    {
        // If the user ran out of time, stop the timer, show 
        // a MessageBox, and fill in the answers.
        timer1.Stop();
        timeLabel.Text = "Time's up!";
        MessageBox.Show("You didn't finish in time.", "Sorry!");
        sum.Value = addend1 + addend2;
        difference.Value = minuend - subtrahend;
        startButton.Enabled = true;
    }
    
  5. Сохраните и выполните код.

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

    Математическая головоломка с задачей на вычитание

    Математическая головоломка с задачей на вычитание

Продолжить или повторить пройденный материал