Шаг 6. Добавление задачи на вычитание
Чтобы добавить задачу на вычитание необходимо следующее.
Хранение значений, которые участвуют в операции вычитания.
Создание случайных чисел для задачи (а также гарантия, что ответ лежит в диапазоне от 0 до 100).
Обновление метода, который проверяет ответ таким образом, чтобы этот метод также проверял новую задачу на вычитание.
Обновление обработчика событий таймера Tick таким образом, чтобы этот обработчик событий заполнял корректный ответ после истечения времени.
Добавление задачи на вычитание
Сначала необходимо место для хранения значений, поэтому добавьте два целых числа int (Integer) для задачи на вычитание в форму.Новый код добавляется между целыми числами задачи на сложение и целым числом для таймера.Код должен выглядеть следующим образом.
Public Class Form1 ' Create a Random object to generate random numbers. Dim randomizer As New Random ' These Integers will store the numbers ' for the addition problem. Dim addend1 As Integer Dim addend2 As Integer ' These Integers will store the numbers ' for the subtraction problem. Dim minuend As Integer Dim subtrahend As Integer ' This Integer will keep track of the time left. Dim timeLeft As Integer
public partial class Form1 : Form { // Create a Random object to generate random numbers. Random randomizer = new Random(); // These ints will store the numbers // for the addition problem. int addend1; int addend2; // These ints will store the numbers // for the subtraction problem. int minuend; int subtrahend; // This int will keep track of the time left. int timeLeft;
Примечание
Имена новых целых чисел — minuend и subtrahend — это не термины Visual C# и не термины программирования.Это принятые арифметические обозначения для числа, которое вычитается из другого (subtrahend — вычитаемое) и числа, из которого производится вычитание (minuend — уменьшаемое).Остаток — это уменьшаемое за минусом вычитаемого.Можно использовать другие имена, так как программа не требует определенных имен для целых чисел, элементов управления, компонентов или методов.Существуют определенные правила, например, имена не могут начинаться с цифр. В общем случае можно использовать такие имена, как x1, x2, x3, x4 и так далее.Однако это затруднит чтение кода и сделает практически невозможным отслеживание ошибок.Далее в этом руководстве для умножения и для деления будут использоваться принятые имена: multiplicand (множимое) × multiplier (множитель) = product (произведение); dividend (делимое) ÷ divisor (делитель) = quotient (частное).
Затем, измените метод StartTheQuiz() для заполнения задачи на вычитание случайных чисел.Новый код располагается под комментарием "Fill in the subtraction problem" (Заполнение задачи на вычитание).Код должен выглядеть следующим образом.
''' <summary> ''' Start the quiz by filling in all of the problems ''' and starting the timer. ''' </summary> ''' <remarks></remarks> Public Sub StartTheQuiz() ' Fill in the addition problem. addend1 = randomizer.Next(51) addend2 = randomizer.Next(51) plusLeftLabel.Text = addend1.ToString plusRightLabel.Text = addend2.ToString 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 problems /// and starting the timer. /// </summary> public void StartTheQuiz() { // Fill in the addition problem. addend1 = randomizer.Next(51); addend2 = randomizer.Next(51); plusLeftLabel.Text = addend1.ToString(); plusRightLabel.Text = addend2.ToString(); 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(); }
Этот код немного по другому использует у класса Random метод Next().Когда ему передается два значения, он выбирает случайное число, которое меньше или равно первого значения и меньше второго значения.В следующей строке кода выполняется выбор случайного числа от 1 до 100 и производится сохранение его в переменной с именем minuend (уменьшаемое).
minuend = randomizer.Next(1, 101)
minuend = randomizer.Next(1, 101);
Метод Next() класса Random может быть вызван несколькими способами.Когда происходит вызов метода несколькими способами, то такой метод называется перегруженным методом, для его изучения можно использовать IntelliSense.Еще раз посмотрите на подсказку окна IntelliSense для метода Next().
Подсказка окна Intellisense
Обратите внимание, что в подсказке указано (+ 2 overload(s)) (+ 2 перегрузки).Это значит, что существует два других способа, с помощью которых можно вызвать метод Next().При вводе нового кода для метода StartTheQuiz() можно увидеть дополнительные сведения.Как только будет введено randomizer.Next(,, откроется окно IntelliSense.Чтобы переключиться между перегрузками, которые показаны на рисунке ниже, используйте клавиши СТРЕЛКА ВВЕРХ и СТРЕЛКА ВНИЗ.
Перегрузки в окне Intellisense
Нужна перегрузка, которая показана на рисунке выше, так как она позволяет указать минимальное и максимальное значение.
Для проверки правильного ответа для задачи на вычитание, измените метод CheckTheAnswer().Код должен выглядеть следующим образом.
''' <summary> ''' Check the answer 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 answer 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; }
Два знака && это оператор logical and (логическое И) в языке Visual C# .Эквивалентный оператор в языке Visual Basic — AndAlso.Это тоже самое, как сказать "Если переменную addend1 прибавить к переменной addend2 это равно значению переменной sum в элементе управления NumericUpDown, И если из переменной minuend (уменьшаемое) вычесть переменную subtrahend (вычитаемое) это равно значению переменной difference (разность) элемента управления NumericUpDown". Метод CheckTheAnswer() только лишь возвращает значение true если задача на сложение решена правильно и задача на вычитание решена правильно.
Измените последнюю часть обработчика событий таймера 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; }
Сохраните и выполните код.Теперь программа должна содержать задачу на вычитание, как показано на рисунке ниже.
Математическая головоломка с задачей на вычитание
Продолжить или повторить пройденный материал
Следующий шаг руководства см. в разделе Шаг 7. Добавление задач на умножение и деление.
Предыдущий шаг руководства см. в разделе Шаг 5. Добавление обработчиков событий входа для элементов управления NumericUpDown.