Megosztás a következőn keresztül:


Oktatóanyag: Időzítő hozzáadása matematikai teszt WinForms-alkalmazáshoz

Ebben a négy oktatóanyagból álló sorozatban matematikai tesztet fog készíteni. A teszt négy véletlenszerű matematikai problémát tartalmaz, amelyeket a tesztválasztó egy megadott időn belül próbál megválaszolni.

A teszt időzítő vezérlőelemet használ. A vezérlő mögötti kód nyomon követi az eltelt időt, és ellenőrzi a tesztválasztó válaszait.

Ebben a harmadik oktatóanyagban megtanulhatja, hogyan:

  • Időzítő vezérlőelem hozzáadása.
  • Adjon hozzá egy eseménykezelőt az időzítőhöz.
  • Írjon kódot a felhasználó válaszainak ellenőrzéséhez, az üzenetek megjelenítéséhez és a helyes válaszok kitöltéséhez.

Előfeltételek

Ez az oktatóanyag a korábbi oktatóanyagokra épül, kezdve Matematikai teszt létrehozása WinForms-alkalmazás. Ha még nem végezte el ezeket az oktatóanyagokat, először haladjon végig rajtuk.

Visszaszámláló időzítő hozzáadása

Az idő nyomon követéséhez a teszt során időzítő összetevőt kell használnia. Egy változóra is szüksége van a hátralévő idő tárolásához.

  1. Adjon hozzá egy timeLeft nevű egész változót, ugyanúgy, ahogyan a korábbi oktatóanyagokban változókat deklarált. Helyezze a timeLeft deklarációt közvetlenül a többi deklaráció után. A kódnak a következő mintához hasonlóan kell kinéznie.

    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;
    
        // These integer variables store the numbers 
        // for the multiplication problem. 
        int multiplicand;
        int multiplier;
    
        // These integer variables store the numbers 
        // for the division problem. 
        int dividend;
        int divisor;
    
        // This integer variable keeps track of the 
        // remaining time.
        int timeLeft;
    

  1. A Windows Forms Designer -ben húzzon egy Timer vezérlőt az EszközkészletÖsszetevők kategóriájából az űrlapjára. A vezérlő a tervezőablak alján, szürke területen jelenik meg.

  2. Az űrlapon válassza ki az imént hozzáadott időzítő1 ikont, és állítsa be a Interval tulajdonságát 1000értékre. Mivel ez az intervallum ezredmásodpercben van megadva, egy 1000 érték hatására az időzítő minden másodpercben egy Tick eseményt generál.

A válaszok ellenőrzése

Mivel az időzítő másodpercenként egy Tick eseményt hoz létre, érdemes ellenőrizni az eltelt időt egy Tick eseménykezelőben. Az eseménykezelőben is célszerű ellenőrizni a válaszokat. Ha elfogy az idő, vagy ha a válaszok helyesek, a tesztnek véget kell vetnie.

Az eseménykezelő írása előtt adjon hozzá egy CheckTheAnswer() nevű metódust annak megállapításához, hogy a matematikai problémákra adott válaszok helyesek-e. Ennek a módszernek összhangban kell lennie a többi metódussal, például StartTheQuiz(). A kódnak a következő mintához hasonlóan kell kinéznie.

/// <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)
        && (multiplicand * multiplier == product.Value)
        && (dividend / divisor == quotient.Value))
        return true;
    else
        return false;
}

Ez a módszer határozza meg a matematikai problémákra adott válaszokat, és összehasonlítja az eredményeket a NumericUpDown vezérlőelemek értékeihez. Ebben a kódban:

  • A Visual Basic verziója a szokásos Sub kulcsszó helyett a Function kulcsszót használja, mert ez a metódus egy értéket ad vissza.

  • A billentyűzettel nem adhatja meg könnyen a szorzásjelet (×) és az osztásjelet (÷), ezért a C# és a Visual Basic a szorzáshoz csillagot (*) és osztáshoz perjelet (/) fogad el.

  • A C#-ban && a logical and operátor. A Visual Basicben az egyenértékű operátor AndAlso. A logical and operátorral ellenőrizheti, hogy egynél több feltétel igaz-e. Ebben az esetben, ha az értékek mind helyesek, a metódus egy trueértéket ad vissza. Ellenkező esetben a metódus falseértéket ad vissza.

  • A if utasítás a NumerikusupDown vezérlőelem Value tulajdonságát használja a vezérlő aktuális értékének eléréséhez. A következő szakaszban ugyanazt a tulajdonságot használva jeleníti meg a megfelelő választ az egyes vezérlőkben.

Eseménykezelő hozzáadása az időzítőhöz

Most, hogy ellenőrizheti a válaszokat, megírhatja a Tick eseménykezelő kódját. Ez a kód másodpercenként fut, miután az időzítő tick eseményt hoz létre. Ez az eseménykezelő az CheckTheAnswer()meghívásával ellenőrzi a tesztválasztó válaszait. Azt is ellenőrzi, hogy mennyi idő telt el a tesztben.

  1. Az űrlapon kattintson duplán az Időzítő vezérlőelemre, vagy jelölje ki, majd válassza az Enterlehetőséget. Ezek a műveletek egy Tick eseménykezelőt adnak hozzá. Megjelenik a kódszerkesztő, és megjeleníti a Tick handler metódusát.

    C# esetén egy kódsort ad hozzá a Form1.Designer.cs kódfájlhoz, amely összekapcsolja az eseménykezelőt:

    timer1.Tick += new EventHandler(timer1_Tick);
    

    (A Visual Basic esetében nincs szükség erre a sorra, de az eseménykezelő tartalmaz egy handles Timer1.Tick, amely ugyanezt teszi.)

  2. Adja hozzá az alábbi utasításokat az új eseménykezelő metódushoz.

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (CheckTheAnswer())
        {
            // If CheckTheAnswer() returns true, then the user 
            // got the answer right. Stop the timer  
            // and show a MessageBox.
            timer1.Stop();
            MessageBox.Show("You got all the answers right!",
                            "Congratulations!");
            startButton.Enabled = true;
        }
        else if (timeLeft > 0)
        {
            // If CheckTheAnswer() returns false, keep counting
            // down. Decrease the time left by one second and 
            // display the new time left by updating the 
            // Time Left label.
            timeLeft = timeLeft - 1;
            timeLabel.Text = timeLeft + " seconds";
        }
        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;
            product.Value = multiplicand * multiplier;
            quotient.Value = dividend / divisor;
            startButton.Enabled = true;
        }
    }
    

A teszt minden másodpercében ez a módszer fut. A kód először ellenőrzi a CheckTheAnswer() visszaadott értéket.

  • Ha minden válasz helyes, az érték true, és a teszt véget ér:

    • Az időzítő leáll.
    • Megjelenik egy gratuláló üzenet.
    • A startButton vezérlőelem Engedélyezett tulajdonsága true van beállítva, hogy a tesztválasztó elindíthasson egy másik tesztet.
  • Ha CheckTheAnswer()falsead vissza, a kód ellenőrzi timeLeftértékét:

    • Ha ez a változó nagyobb, mint 0, az időzítő kivon 1-et timeLeft. A timeLabel vezérlőelem Text tulajdonságát is frissíti, hogy megmutassa a kvíz kitöltőjének, mennyi másodperc van hátra.
    • Ha nem marad idő, az időzítő leáll, és módosítja a timeLabel szöveget Lejárt az idő! Egy üzenetablak bejelenti, hogy a kvíz véget ért, és a válaszok is kiderülnek. A start gomb ismét elérhetővé válik.

Az időzítő indítása

Ha a teszt indításakor szeretné elindítani az időzítőt, adjon hozzá három sort a StartTheQuiz() metódus végéhez, ahogy az alábbi példa is mutatja.

/// <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;

    // Fill in the multiplication problem.
    multiplicand = randomizer.Next(2, 11);
    multiplier = randomizer.Next(2, 11);
    timesLeftLabel.Text = multiplicand.ToString();
    timesRightLabel.Text = multiplier.ToString();
    product.Value = 0;

    // Fill in the division problem.
    divisor = randomizer.Next(2, 11);
    int temporaryQuotient = randomizer.Next(2, 11);
    dividend = divisor * temporaryQuotient;
    dividedLeftLabel.Text = dividend.ToString();
    dividedRightLabel.Text = divisor.ToString();
    quotient.Value = 0;

    // Start the timer.
    timeLeft = 30;
    timeLabel.Text = "30 seconds"; 
    timer1.Start();
}

A teszt indításakor ez a kód a timeLeft változót 30-ra, a timeLabel vezérlőelem Text tulajdonságát pedig 30 másodpercre állítja. Ezután az Időzítő vezérlőelem Start() metódusa elindítja a visszaszámlálást.

Az alkalmazás futtatása

  1. Mentse a programot, és futtassa.

  2. Válassza a Teszt indításalehetőséget. Az időzítő elkezd visszaszámlálni. Amikor elfogy az idő, a teszt véget ér, és megjelennek a válaszok.

  3. Kezdjen el egy másik tesztet, és adjon helyes választ a matematikai problémákra. Ha az időkorláton belül helyesen válaszol, megnyílik egy üzenetmező, elérhetővé válik a start gomb, és az időzítő leáll.

    képernyőkép, amely egy befejezett tesztet jelenít meg, és 19 másodperc van hátra. Elérhető a Teszt indítása gomb.

Következő lépések

Lépjen tovább a következő oktatóanyagra, amelyből megtudhatja, hogyan szabhatja testre a matematikai tesztet.