Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Dört öğreticiden oluşan bu seride bir matematik testi oluşturacaksınız. Test, bir sınava girişenin belirli bir süre içinde yanıtlamaya çalıştığı dört rastgele matematik sorunu içerir.
Test bir Zamanlayıcı denetimi kullanır. Bu denetimin arkasındaki kod, geçen süreyi izler ve test seçicinin yanıtlarını denetler.
Bu üçüncü öğreticide şunların nasıl yapılacağını öğreneceksiniz:
- Zamanlayıcı denetimi ekleyin.
- Zamanlayıcı için bir olay işleyicisi ekleyin.
- Kullanıcının yanıtlarını denetlemek, iletileri görüntülemek ve doğru yanıtları doldurmak için kod yazın.
Önkoşullar
Bu öğretici, Matematik testi oluşturma WinForms uygulamasıile başlayarak önceki öğreticileri temel alır. Henüz bu öğreticileri tamamlamadıysanız, önce onları tamamlayın.
Geri sayım zamanlayıcısı ekleme
Test sırasında zamanı izlemek için bir zamanlayıcı bileşeni kullanırsınız. Kalan süreyi depolamak için bir değişkene de ihtiyacınız vardır.
timeLeft adlı bir tamsayı değişkeni, önceki öğreticilerde değişkenleri bildirdiğiniz gibi ekleyin. timeLeft bildirimini diğer bildirimlerin hemen arkasına yerleştirin. Kodunuz aşağıdaki örneğe benzer olmalıdır.
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;
Windows Forms Designer'nde, Araç KutusuBileşenleri kategorisinden formunuza bir Timer denetimi taşıyın. Denetim, tasarım penceresinin altındaki gri alanda görünür.
Formda, yeni eklediğiniz timer1 simgesini seçin ve Interval özelliğini 1000olarak ayarlayın. Bu aralık milisaniye cinsinden olduğundan, 1000 değeri zamanlayıcının saniyede bir Tick olayı oluşturmasına neden olur.
Yanıtları kontrol edin
Zamanlayıcı her saniye bir Tick olayı tetiklediğinden, bir Tick olay işleyicisinde geçen süreyi denetlemek mantıklıdır. Bu olay işleyicisindeki yanıtları denetlemek de pratiktir. Zaman dolduysa veya yanıtlar doğruysa test sona ermelidir.
Bu olay işleyicisini yazmadan önce matematik sorunlarının yanıtlarının doğru olup olmadığını belirlemek için CheckTheAnswer() adlı bir yöntem ekleyin. Bu yöntem, StartTheQuiz()gibi diğer yöntemlerle aynı olmalıdır. Kodunuz aşağıdaki örneğe benzer olmalıdır.
/// <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;
}
Bu yöntem matematik sorunlarının yanıtlarını belirler ve sonuçları NumericUpDown denetimlerindeki değerlerle karşılaştırır. Bu kodda:
Visual Basic sürümü, her zamanki
Subanahtar sözcüğü yerineFunctionanahtar sözcüğünü kullanır çünkü bu yöntem bir değer döndürür.Klavyeyi kullanarak çarpma işaretini (×) ve bölme işaretini (÷) kolayca giremezsiniz; bu nedenle C# ve Visual Basic çarpma için yıldız işareti (*) ve bölme için eğik çizgi (/) kabul eder.
C# dilinde
&&logical andişlecidir. Visual Basic'te eşdeğer işleçAndAlso. Birden fazla koşulun doğru olup olmadığını denetlemek içinlogical andişlecini kullanırsınız. Bu durumda, değerlerin tümü doğruysa, yöntemitruedeğerini döndürür. Aksi takdirde, yöntemifalsedeğerini döndürür.ifdeyimi, denetimin geçerli değerine erişmek için NumericUpDown denetiminin Value özelliğini kullanır. Sonraki bölümde, her denetimde doğru yanıtı görüntülemek için aynı özelliği kullanacaksınız.
Zamanlayıcıya olay işleyicisi ekleme
Artık yanıtları denetlemenin bir yolunuz olduğuna göre, Tick olay işleyicisinin kodunu yazabilirsiniz. Zamanlayıcı bir Tick olayı tetikledikten sonra bu kod her saniye çalışır. Bu olay işleyicisi, CheckTheAnswer()çağırarak sınav katılımcısının yanıtlarını denetler. Ayrıca testte geçen süreyi de denetler.
Formda, Süreölçer denetimine çift tıklayın veya bu denetimi seçip Enterdüğmesine basın. Bu eylemler bir Tick olay işleyicisi ekler. Kod düzenleyicisi görüntülenir ve Tick işleyicisinin yöntemini görüntüler.
C# için, Form1.Designer.cs kod dosyasına olay işleyicisini bağlayan bir kod satırı ekler:
timer1.Tick += new EventHandler(timer1_Tick);(Visual Basic için bu satıra gerek yoktur, ancak olay işleyicisi aynı şeyi yapan bir
handles Timer1.Tickiçerir.)Yeni olay işleyici yöntemine aşağıdaki deyimleri ekleyin.
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; } }
Testin her saniyesi, bu yöntem çalışır. Kod CheckTheAnswer()'ın döndürdüğü değeri önce kontrol eder.
Tüm yanıtlar doğruysa, bu değer
trueolur ve test sona erer:- Zamanlayıcı durur.
- Bir tebrik iletisi görüntülenir.
-
startButton denetiminin Etkin özelliği
trueolarak ayarlanmıştır, böylece kullanıcı başka bir testi başlatabilir.
CheckTheAnswer()falsedöndürürse kod, timeLeftdeğerini denetler:- Bu değişken 0'dan büyükse, zamanlayıcı timeLeft'den 1 çıkarır. Ayrıca timeLabel denetiminin Metin özelliğini de güncelleştirerek teste kaç saniye kaldığını gösterir.
- Süre kalmazsa, zamanlayıcı durur ve timeLabel metnini Süre doldu! olarak değiştirir. Bir ileti kutusu testin bittiğini duyurur ve yanıtlar gösterilir. Başlangıç düğmesi yeniden kullanılabilir duruma gelir.
Zamanlayıcıyı başlatma
Test başladığında zamanlayıcıyı başlatmak için, aşağıdaki örnekte gösterildiği gibi StartTheQuiz() yönteminin sonuna üç satır ekleyin.
/// <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();
}
Testiniz başladığında, bu kod timeLeft değişkenini 30, timeLabel denetiminin Text özelliğini 30 saniye olarak ayarlar. Ardından Zamanlayıcı denetiminin Start() yöntemi geri sayımı başlatır.
Uygulamanızı çalıştırma
Programınızı kaydedin ve çalıştırın.
Testi başlat'ı seçin. Zamanlayıcı geri saymaya başlar. Zaman dolduğunda test sona erer ve yanıtlar görüntülenir.
Başka bir test başlatın ve matematik sorunlarına doğru yanıtlar sağlayın. Zaman sınırı içinde doğru yanıt verdiğinizde, bir ileti kutusu açılır, başlangıç düğmesi kullanılabilir hale gelir ve zamanlayıcı durur.
Sonraki adımlar
Matematik testinizi özelleştirmeyi öğrenmek için sonraki öğreticiye geçin.