Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Nesta série de quatro tutoriais, você criará um questionário de matemática. O teste contém quatro problemas matemáticos aleatórios que um participante do questionário tenta responder dentro de um tempo especificado.
O teste usa um controle de temporizador. O código por trás desse controle rastreia o tempo decorrido e verifica as respostas do participante do questionário.
Neste terceiro tutorial, você aprenderá a:
- Adicione um controle de Timer ao seu aplicativo Windows Forms.
- Adicione um manipulador de eventos para o Timer.
- Escreva código para verificar as respostas do usuário, exibir mensagens e preencher as respostas corretas.
Pré-requisitos
Este tutorial baseia-se em tutoriais anteriores, começando com Criar um aplicativo WinForms de questionário de matemática. Se você não concluiu esses tutoriais, analise-os primeiro.
Adicionar um temporizador de contagem regressiva
Para controlar o tempo durante o teste, use um componente Timer. Você também precisa de uma variável para armazenar a quantidade de tempo restante.
Adicione uma variável inteira chamada timeLeft da mesma forma que você declarou variáveis em tutoriais anteriores. Coloque a declaração timeLeft logo após as outras declarações. Seu código deve se parecer com o exemplo a seguir.
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;
No Windows Forms Designer, mova um controle de Timer da categoria Componentes do Caixa de Ferramentas do para o formulário. O controle aparece na área cinza na parte inferior da janela de design.
No formulário, selecione o ícone Timer que você acabou de adicionar e defina sua propriedade Interval como 1000. Como esse intervalo é em milissegundos, um valor de 1000 faz com que o temporizador gere um evento Tick a cada segundo.
Confira as respostas
Como o temporizador gera um evento Tick a cada segundo, faz sentido verificar o tempo decorrido em um manipulador de eventos Tick. Também é prático verificar as respostas nesse manipulador de eventos. Se o tempo se esgotou, ou se as respostas estiverem corretas, o teste deve terminar.
Antes de escrever esse manipulador de eventos, adicione um método chamado CheckTheAnswer() para determinar se as respostas aos problemas matemáticos estão corretas. Este método deve estar em consonância com os outros métodos, como o StartTheQuiz(). Seu código deve se parecer com o exemplo a seguir.
/// <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;
}
Este método determina as respostas aos problemas matemáticos e compara os resultados com os valores nos controles NumericUpDown. Neste código:
A versão do Visual Basic usa a palavra-chave
Functionem vez da palavra-chaveSubusual porque esse método retorna um valor.Você não pode inserir facilmente o sinal de multiplicação (×) ou o sinal de divisão (÷) usando o teclado, então C# e Visual Basic aceitam um asterisco (
*) para multiplicação e uma barra (/) para divisão.Em C#,
&&é o operadorlogical and. No Visual Basic, o operador equivalente éAndAlso. Use o operadorlogical andpara verificar se mais de uma condição é verdadeira. Nesse caso, se os valores estiverem todos corretos, o método retornará um valor detrue. Caso contrário, o método retorna um valor defalse.A instrução
ifusa a propriedade Value de um controle NumericUpDown para acessar o valor atual do controle. Na próxima seção, você usa a mesma propriedade para exibir a resposta correta em cada controle.
Adicionar um manipulador de eventos ao temporizador
Agora que você tem uma maneira de verificar as respostas, você pode escrever o código para o manipulador de eventos Tick. Este código é executado a cada segundo, após o temporizador gerar um evento de Tick. Este manipulador de eventos verifica as respostas do participante do questionário chamando CheckTheAnswer(). Também verifica quanto tempo passou no questionário.
No formulário, clique duas vezes no controle Timer ou selecione-o e, em seguida, selecione Enter. Essas ações adicionam um manipulador de eventos Tick. O editor de código aparece e exibe o método do manipulador Tick.
Para C#, ele adiciona uma linha de código no arquivo de código Form1.Designer.cs que conecta o manipulador de eventos:
timer1.Tick += new EventHandler(timer1_Tick);Para o Visual Basic, não há necessidade dessa linha, mas o manipulador de eventos contém um
handles Timer1.Tickque faz a mesma coisa.Adicione as instruções a seguir ao novo método manipulador de eventos.
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; } }
Este método é executado a cada segundo do questionário. O código primeiro verifica o valor que CheckTheAnswer() retorna.
Se todas as respostas estiverem corretas, esse valor será
truee o questionário terminará:- O temporizador para.
- Aparece uma mensagem de felicitações.
- A propriedade Enabled do controlo startButton é definida como
truepara que o respondente possa iniciar outro teste.
Se
CheckTheAnswer()retornarfalse, o código verificará o valor de timeLeft:- Se esta variável for maior que 0, o temporizador subtrai 1 de timeLeft. Ele também atualiza a propriedade Text do controlo timeLabel para mostrar ao participante do questionário quantos segundos restam.
- Se não restar tempo, o temporizador para e altera o texto timeLabel para O tempo acabou! Uma caixa de mensagem anuncia que o questionário terminou e as respostas são mostradas. O botão Iniciar fica disponível novamente.
Inicie o temporizador
Para iniciar o temporizador quando o teste começar, adicione três linhas ao final do método StartTheQuiz(), como mostra o exemplo a seguir.
/// <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();
}
Quando o teste é iniciado, esse código define a variável timeLeft como 30 e a propriedade Text do controle timeLabel para 30 segundos. Em seguida, o método Start() do controle Timer inicia a contagem regressiva.
Executar seu aplicativo
Salve seu programa e execute-o.
Selecione Iniciar o questionário. O temporizador começa a contagem regressiva. Quando o tempo se esgota, o questionário termina e as respostas aparecem.
Comece outro teste e forneça respostas corretas para os problemas de matemática. Quando você responde corretamente dentro do limite de tempo, uma caixa de mensagem é aberta, o botão Iniciar fica disponível e o temporizador é interrompido.
Próximo passo
Avance para o próximo tutorial para aprender a personalizar o seu questionário de matemática.