Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
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;
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.
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
Subkulcsszó helyett aFunctionkulcsszó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
&&alogical andoperátor. A Visual Basicben az egyenértékű operátorAndAlso. Alogical andoperátorral ellenőrizheti, hogy egynél több feltétel igaz-e. Ebben az esetben, ha az értékek mind helyesek, a metódus egytrueértéket ad vissza. Ellenkező esetben a metódusfalseértéket ad vissza.A
ifutasí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.
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.)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
truevan 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
Mentse a programot, és futtassa.
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.
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övetkező lépések
Lépjen tovább a következő oktatóanyagra, amelyből megtudhatja, hogyan szabhatja testre a matematikai tesztet.