Passaggio 6: aggiungere un problema di sottrazione

Nella sesta parte di questa esercitazione si aggiungerà un problema di sottrazione e si apprenderà come eseguire le attività seguenti:

  • Archiviare i valori della sottrazione.

  • Generare numeri casuali per il problema e verificare che la risposta sia compresa tra 0 e 100.

  • Aggiornare il metodo che controlla le risposte in modo che verifichi anche il nuovo problema di sottrazione.

  • Aggiornare il gestore dell'evento Tick del timer in modo che fornisca la risposta corretta quando il tempo scade.

Per aggiungere un problema di sottrazione

  1. Aggiungere al form due variabili Integer per il problema di sottrazione, tra le variabili Integer per il problema di addizione e il timer.Il codice dovrebbe essere analogo al seguente.

    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;
    

    I nomi delle nuove variabili Integer, minuendo e sottraendo, non sono termini di programmazione.Si tratta dei nomi tradizionali in aritmetica per il numero che si sta sottraendo (il sottraendo) e il numero da cui si sottrae (il minuendo).La differenza è il minuendo meno il sottraendo.È possibile utilizzare altri nomi, perché il programma non richiede nomi specifici per variabili, controlli, componenti o metodi.È necessario attenersi alle regole, ad esempio i nomi non devono iniziare con una cifra, ma è in genere possibile utilizzare nomi quali x1, x2, x3 e x4.Tuttavia, i nomi generici rendono il codice difficile da leggere e complicano il rilevamento dei problemi.Per avere nomi di variabili univoci e significativi, utilizzare i nomi tradizionali per la moltiplicazione (moltiplicando × moltiplicatore = prodotto) e la divisione (dividendo ÷ divisore = quoziente).

    A questo punto, verrà modificato il metodo StartTheQuiz() per fornire valori casuali per il problema di sottrazione.

  2. Aggiungere il codice seguente dopo il commento "Completare il problema di sottrazione".

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

    Per evitare risposte negative per il problema di sottrazione, nel codice il metodo Next() della classe Random viene utilizzato in modo diverso rispetto al problema di addizione.Quando si assegnano due valori al metodo Next(), viene scelto un numero casuale maggiore o uguale al primo valore e minore del secondo.Nel codice seguente viene scelto un numero casuale da 1 a 100, che viene archiviato nella variabile minuendo.

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

    È possibile chiamare in più modi il metodo Next() della classe Random, denominato "randomizer" in questa esercitazione.I metodi che è possibile chiamare in più modi sono denominati metodi di overload ed è possibile utilizzare IntelliSense per esplorarli.Esaminare nuovamente la descrizione comando della finestra di IntelliSense per il metodo Next().

    Descrizione comando della finestra di IntelliSense

    Descrizione comando della finestra di IntelliSense

    La dicitura (+ 2 overload) della descrizione comando indica che è possibile chiamare il metodo Next() in altri due modi.Gli overload contengono numeri o tipi di argomenti diversi, pertanto funzionano in modo leggermente diverso l'uno dall'altro.Ad esempio, un metodo potrebbe accettare un argomento Integer singolo, mentre uno degli overload potrebbe accettare un Integer e una stringa.Scegliere l'overload corretto in base all'operazione da eseguire.Quando si aggiunge codice al metodo StartTheQuiz(), nella finestra di Intellisense vengono visualizzate più informazioni non appena si immette randomizer.Next(.Premere i tasti freccia SU e GIÙ per scorrere gli overload, come illustrato nell'immagine seguente.

    Overload per il metodo Next() in IntelliSense

    Overload per il metodo Next() in IntelliSense

    In questo caso, si desidera scegliere l'ultimo overload, perché consente di specificare i valori minimo e massimo.

  3. Modificare il metodo CheckTheAnswer() per verificare la risposta corretta per la sottrazione.

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

    In Visual C# && corrisponde all'operatore logical and.In Visual Basic l'operatore equivalente è AndAlso.Questi operatori indicano "Se la somma di addendo1 e addendo2 è uguale al valore NumericUpDown della somma e se minuendo meno sottraendo è uguale al valore NumericUpDown della differenza". Il metodo CheckTheAnswer() restituisce true solo se le risposte ai problemi dell'addizione e della sottrazione sono corrette.

  4. Sostituire l'ultima parte del gestore eventi Tick del timer con il codice seguente in modo che inserisca la risposta corretta alla scadenza del tempo.

    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. Salvare ed eseguire il codice.

    Il programma include un problema di sottrazione, come illustrato nella figura seguente.

    Quiz matematico con problema di sottrazione

    Quiz matematico con sottrazione

Per continuare o rivedere l'esercitazione