Krok 6. Dodawanie problemu odejmowania

W szóstej części tego samouczka dodasz problem odejmowania i dowiesz się, jak wykonywać następujące zadania:

  • Przechowaj wartości odejmowania.

  • Wygeneruj liczby losowe dla problemu (i upewnij się, że odpowiedź zawiera się w zakresie od 0 do 100).

  • Zaktualizuj metodę, która sprawdza odpowiedzi, tak aby sprawdzała również nowy problem odejmowania.

  • Zaktualizuj swój program obsługi zdarzeń Tick timera, tak aby program obsługi zdarzeń wypełniał poprawną odpowiedź, gdy skończy się czas.

Aby dodać problem odejmowania

  1. Dodać dwie zmienne w postaci liczb całkowitych dla problemu odejmowania do formularza, między zmiennymi w postaci liczb całkowitych dla problemu dodawania oraz czasomierzem.Kod powinien wyglądać następująco.

    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;
    

    Nazwy nowych zmiennych całkowitych —odjemna i odjemnik— to nie terminy programistyczne.Są to tradycyjne nazwy stosowane w operacjach arytmetycznych dla liczby, która jest odejmowana (odjemnik) i liczby, od której odjemnik jest odejmowany (odjemna).Różnica to odjemna minus odjemnik.Możesz używać innych nazw, ponieważ twój program nie wymaga określonych nazw zmiennych, formantów, składników ani metod.Należy przestrzegać reguł, takich jak nierozpoczynanie nazw od cyfr, ale ogólnie można używać nazw takich, jak x1, x2, x3 i x4.Jednak nazwy rodzajowe zmniejszają czytelność kodu i powodują, że śledzenie problemów jest prawie niemożliwe.Aby zachować unikatowe i pomocne nazwy zmiennych, będziesz używać tradycyjnych nazw dla mnożenia (mnożna × mnożnik = iloczyn) i dzielenia (dzielna ÷ dzielnik = iloraz) później w tym samouczku.

    Następnie zmodyfikujesz metodę StartTheQuiz(), aby dostarczyć losowe wartości dla problemu odejmowania.

  2. Dodaj następujący kod po komentarzu „Wypełnij problem odejmowania”.

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

    Aby uniemożliwić ujemne odpowiedzi na problem odejmowania, ten kod używa metody Next() klasy Random trochę inaczej niż w sposób, jakiego używa problem dodawania.Kiedy nadasz metodzie Next() dwie wartości, wybiera liczbę losową, która jest większa lub równa pierwszej wartości i mniejsza niż druga.Poniższy kod wybiera losową liczbę z zakresu od 1 do 100 i zapisuje ją w zmiennej odjemna.

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

    Możesz na wiele sposobów wywołać metodę Next() klasy Random, której wcześniej w tym samouczku nadano nazwę "randomizer".Metody, które można wywoływać na więcej niż jeden sposób, są określane jako przeciążone, i można korzystać z technologii IntelliSense, aby ich używać.Ponownie przyjrzyj się etykiecie narzędzia okna technologii IntelliSense dla metody Next().

    Etykietka narzędzia okna technologii IntelliSense

    Technologia IntelliSense okno etykietka

    Etykietka narzędzia pokazuje (+ 2 overload(s)), co oznacza, że można wywołać metodę Next() na dwa inne sposoby.Przeciążenia zawierają różną liczbę lub typy argumentów, tak że każde działa nieco inaczej niż inne.Na przykład, metoda może przyjmować jeden argument liczby całkowitej, a jedno z jej przeciążeń może przyjmować liczbę całkowitą i ciąg.Wybierz poprawne przeciążenie oparte na roli, jaką ma spełnić.Podczas dodawania kodu do metody StartTheQuiz(), więcej informacji pojawia się w oknie technologii IntelliSense zaraz po wprowadzeniu randomizer.Next(.Wybierz klawisze strzałki w górę i strzałki w dół, aby przechodzić między przeciążeniami, jak na poniższej ilustracji pokazano.

    Przeciążenie dla metody Next() w technologii IntelliSense

    Przeciążenie metody Next() w technologii IntelliSense

    W tym przypadku chcesz wybrać ostatnie przeciążenie, ponieważ możesz określić wartości minimalne i maksymalne.

  3. Zmodyfikuj metodę CheckTheAnswer(), tak aby sprawdzała poprawną odpowiedź odejmowania.

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

    W Visual C#, && to operator logicznego i (logical and).W Visual Basic, równorzędny operator to AndAlso.Te operatory wskazują "Jeśli suma addend1 i addend2 jest równa wartości sumy NumericUpDown i jeśli odjemna minus odjemnik jest równa wartości różnicy NumericUpDown." Metoda CheckTheAnswer() zwraca true tylko wtedy, gdy odpowiedzi na problemy dodawania i odejmowania są poprawne.

  4. Zastąp ostatnią część programu obsługi zdarzeń timera Tick poniższym kodem, tak aby wypełnił poprawną odpowiedź, gdy skończy się czas.

    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. Zapisz i uruchom kod.

    Program obejmuje problem odejmowania, jak pokazano na poniższej ilustracji.

    Quiz matematyczny z problemem odejmowania

    Test Math z problemem odejmowania

Aby kontynuować lub przeglądnąć