Lista de Exercícios — Eventos, componentes e Math
Nesta lista, cada exercício deve ser implementado em uma aplicação Windows Forms. Leia o enunciado, monte o formulário conforme o modelo indicado e implemente o método que reage ao evento principal do exercício. Os modelos abaixo mostram apenas a estrutura esperada do formulário e suas labels de saída.
Exercício 01 — Calculadora de hipotenusa e triângulo retângulo
Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 2 NumericUpDown, 1 Button e 4 Labels de resultado.
- Implemente o método
btnCalcular_Click(object sender, EventArgs e). Esse método deverá calcular a hipotenusa, o seno, o cosseno e a tangente, atualizando as labels do formulário.
Catetos são os dois lados que formam o ângulo reto.
Hipotenusa é o lado inclinado, oposto ao ângulo reto, e sempre é o maior lado do triângulo retângulo.
Para calcular a hipotenusa, é sabido que:
\[ h = \sqrt{catetoA^2 + catetoB^2} \]Depois, calcule as razões trigonométricas:
\[ seno = \frac{catetoA}{h} \qquad cosseno = \frac{catetoB}{h} \qquad tangente = \frac{catetoA}{catetoB} \]Componentes:
numCatetoAnumCatetoBbtnCalcularlblHipotenusa,lblSeno,lblCosseno,lblTangente
Formulário
- Implemente os métodos
numCatetoA_ValueChanged(object sender, EventArgs e)enumCatetoB_ValueChanged(object sender, EventArgs e). Eles deverão realizar o mesmo cálculo e atualizar os resultados sempre que um cateto mudar.
private void CalcularTriangulo()
{
double catetoA = Convert.ToDouble(numCatetoA.Value);
double catetoB = Convert.ToDouble(numCatetoB.Value);
if (catetoA <= 0 || catetoB <= 0)
{
lblHipotenusa.Text = "Hipotenusa: informe catetos maiores que zero";
lblSeno.Text = "Seno: -";
lblCosseno.Text = "Cosseno: -";
lblTangente.Text = "Tangente: -";
return;
}
double hipotenusa = Math.Sqrt(Math.Pow(catetoA, 2) + Math.Pow(catetoB, 2));
double seno = catetoA / hipotenusa;
double cosseno = catetoB / hipotenusa;
double tangente = catetoA / catetoB;
lblHipotenusa.Text = "Hipotenusa: " + hipotenusa.ToString("F2");
lblSeno.Text = "Seno: " + seno.ToString("F3");
lblCosseno.Text = "Cosseno: " + cosseno.ToString("F3");
lblTangente.Text = "Tangente: " + tangente.ToString("F3");
}
private void btnCalcular_Click(object sender, EventArgs e)
{
CalcularTriangulo();
}
private void numCatetoA_ValueChanged(object sender, EventArgs e)
{
CalcularTriangulo();
}
private void numCatetoB_ValueChanged(object sender, EventArgs e)
{
CalcularTriangulo();
}
Exercício 02 — Simulador de juros compostos
Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 3 NumericUpDown, 1 Button e 1 Label de resultado.
- Implemente o método
btnCalcular_Click(object sender, EventArgs e). Esse método deverá calcular o montante final e atualizar a label de resultado.
Para calcular o montante, é sabido que:
\[ M = C \cdot (1 + i)^n \]\(C\) é o capital inicial, \(i\) é a taxa em forma decimal e \(n\) é a quantidade de meses.
Componentes:
numCapitalnumTaxanumMesesbtnCalcularlblMontante
Formulário
- Implemente os métodos
numCapital_ValueChanged(object sender, EventArgs e),numTaxa_ValueChanged(object sender, EventArgs e)enumMeses_ValueChanged(object sender, EventArgs e). Eles deverão refazer o cálculo automaticamente quando algum valor mudar.
private void CalcularJuros()
{
double capital = Convert.ToDouble(numCapital.Value);
double taxaPercentual = Convert.ToDouble(numTaxa.Value);
int meses = Convert.ToInt32(numMeses.Value);
double taxa = taxaPercentual / 100.0;
double montante = capital * Math.Pow(1 + taxa, meses);
lblMontante.Text = "Montante final: " + montante.ToString("C2");
}
private void btnCalcular_Click(object sender, EventArgs e)
{
CalcularJuros();
}
private void numCapital_ValueChanged(object sender, EventArgs e)
{
CalcularJuros();
}
private void numTaxa_ValueChanged(object sender, EventArgs e)
{
CalcularJuros();
}
private void numMeses_ValueChanged(object sender, EventArgs e)
{
CalcularJuros();
}
Exercício 03 — Simulador de pedido em lanchonete
Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 2 RadioButtons, 1 NumericUpDown, 1 Button e 3 Labels de resultado.
- Implemente o método
btnCalcularPedido_Click(object sender, EventArgs e). Esse método deverá calcular o subtotal, o desconto e o total da comanda, atualizando as labels do formulário.
Imagine a lanchonete da escola criando uma comanda simples para o intervalo. O cliente escolhe um produto e informa quantas unidades deseja comprar. Para deixar a regra clara, use os seguintes preços:
\[ preco = \begin{cases} 18, & \text{se for lanche}\\[8pt] 24, & \text{se for combo} \end{cases} \] \[ subtotal = preco \cdot quantidade \] \[ desconto = \begin{cases} subtotal \cdot 0{,}10, & \text{se } quantidade \geq 3\\[8pt] 0, & \text{caso contrário} \end{cases} \] \[ total = subtotal - desconto \]Considere lanche por R$ 18,00 e combo por R$ 24,00. O combo representa lanche, suco e sobremesa.
Componentes:
rdbLanche,rdbCombonumQuantidadebtnCalcularPedidolblSubtotal,lblDesconto,lblTotal
Formulário
- Implemente os métodos
numQuantidade_ValueChanged(object sender, EventArgs e)erdbProduto_CheckedChanged(object sender, EventArgs e). Eles deverão refazer o cálculo sempre que a quantidade ou o tipo de produto mudar.
private void CalcularPedido()
{
double preco;
if (rdbCombo.Checked)
{
preco = 24;
}
else
{
preco = 18;
}
int quantidade = Convert.ToInt32(numQuantidade.Value);
double subtotal = preco * quantidade;
double desconto = 0;
if (quantidade >= 3)
{
desconto = subtotal * 0.10;
}
double total = subtotal - desconto;
lblSubtotal.Text = "Subtotal: " + subtotal.ToString("C2");
lblDesconto.Text = "Desconto: " + desconto.ToString("C2");
lblTotal.Text = "Total do pedido: " + total.ToString("C2");
}
private void btnCalcularPedido_Click(object sender, EventArgs e)
{
CalcularPedido();
}
private void numQuantidade_ValueChanged(object sender, EventArgs e)
{
CalcularPedido();
}
private void rdbProduto_CheckedChanged(object sender, EventArgs e)
{
CalcularPedido();
}
Exercício 04 — Calculadora de distância entre dois pontos
Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 4 NumericUpDown, 1 Button e 1 Label de resultado.
- Implemente o método
btnCalcular_Click(object sender, EventArgs e). Esse método deverá calcular a distância entre os dois pontos e atualizar a label de resultado.
Distância entre dois pontos é o tamanho do segmento que liga \(P1\) até \(P2\).
As diferenças \(x_2 - x_1\) e \(y_2 - y_1\) formam um triângulo retângulo. A distância é a hipotenusa desse triângulo.
Para calcular essa distância, é sabido que:
\[ d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} \]Componentes:
numX1,numY1numX2,numY2btnCalcularlblDistancia
Formulário
- Implemente os métodos
numX1_ValueChanged(object sender, EventArgs e),numY1_ValueChanged(object sender, EventArgs e),numX2_ValueChanged(object sender, EventArgs e)enumY2_ValueChanged(object sender, EventArgs e). Eles deverão refazer o cálculo sempre que uma coordenada mudar.
private void CalcularDistancia()
{
double x1 = Convert.ToDouble(numX1.Value);
double y1 = Convert.ToDouble(numY1.Value);
double x2 = Convert.ToDouble(numX2.Value);
double y2 = Convert.ToDouble(numY2.Value);
double dx = x2 - x1;
double dy = y2 - y1;
double distancia = Math.Sqrt(Math.Pow(dx, 2) + Math.Pow(dy, 2));
lblDistancia.Text = "Distância: " + distancia.ToString("F2");
}
private void btnCalcular_Click(object sender, EventArgs e)
{
CalcularDistancia();
}
private void numX1_ValueChanged(object sender, EventArgs e)
{
CalcularDistancia();
}
private void numY1_ValueChanged(object sender, EventArgs e)
{
CalcularDistancia();
}
private void numX2_ValueChanged(object sender, EventArgs e)
{
CalcularDistancia();
}
private void numY2_ValueChanged(object sender, EventArgs e)
{
CalcularDistancia();
}
Exercício 05 — Simulador de lançamento oblíquo
Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 2 NumericUpDown, 1 Button e 3 Labels de resultado.
- Implemente o método
btnCalcular_Click(object sender, EventArgs e). Esse método deverá calcular o alcance, a altura máxima e o tempo de voo do projétil.
Lançamento oblíquo acontece quando o projétil sai com uma velocidade inicial inclinada.
O programa deve usar a velocidade e o ângulo para estimar até onde ele chega, qual altura máxima atinge e quanto tempo fica no ar.
Para calcular esses valores, considere a gravidade \(g = 9{,}8\) e converta o ângulo de graus para radianos. É sabido que:
\[ alcance = \frac{v_0^2 \cdot \operatorname{sen}(2\theta)}{g} \] \[ altura = \frac{(v_0 \cdot \operatorname{sen}(\theta))^2}{2g} \] \[ tempo = \frac{2 \cdot v_0 \cdot \operatorname{sen}(\theta)}{g} \]Componentes:
numVelocidadevelocidade inicialnumAnguloângulo em grausbtnCalcularlblAlcance,lblAltura,lblTempo
Formulário
- Implemente os métodos
numVelocidade_ValueChanged(object sender, EventArgs e)enumAngulo_ValueChanged(object sender, EventArgs e). Eles deverão realizar o mesmo cálculo e atualizar os resultados quando a velocidade ou o ângulo mudar.
private void CalcularLancamento()
{
double velocidadeInicial = Convert.ToDouble(numVelocidade.Value);
double anguloGraus = Convert.ToDouble(numAngulo.Value);
double gravidade = 9.8;
double angulo = anguloGraus * Math.PI / 180.0;
double alcance = (Math.Pow(velocidadeInicial, 2) * Math.Sin(2 * angulo)) / gravidade;
double altura = Math.Pow(velocidadeInicial * Math.Sin(angulo), 2) / (2 * gravidade);
double tempo = (2 * velocidadeInicial * Math.Sin(angulo)) / gravidade;
lblAlcance.Text = "Alcance: " + alcance.ToString("F2") + " m";
lblAltura.Text = "Altura máxima: " + altura.ToString("F2") + " m";
lblTempo.Text = "Tempo de voo: " + tempo.ToString("F2") + " s";
}
private void btnCalcular_Click(object sender, EventArgs e)
{
CalcularLancamento();
}
private void numVelocidade_ValueChanged(object sender, EventArgs e)
{
CalcularLancamento();
}
private void numAngulo_ValueChanged(object sender, EventArgs e)
{
CalcularLancamento();
}
Exercício 06 — Tela de criação de personagem de RPG
Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 1 TextBox, 3 RadioButtons, 4 CheckBoxes, 3 NumericUpDowns, 1 Button e 1 Label de resumo.
- Implemente o método
btnCriarPersonagem_Click(object sender, EventArgs e). Esse método deverá montar o resumo do personagem e calcular seu poder total.
O personagem possui atributos, uma classe principal e equipamentos. Para calcular o poder, some os atributos, um bônus da classe e os bônus dos itens escolhidos.
\[ atributos = forca + inteligencia + agilidade \] \[ bonusClasse = \begin{cases} 2 \cdot forca, & guerreiro\\ 2 \cdot inteligencia, & mago\\ 2 \cdot agilidade, & arqueiro \end{cases} \] \[ poderTotal = atributos + bonusClasse + bonusItens \]Considere espada +8, escudo +6, poção +4 e armadura +10.
Componentes:
txtNomerdbGuerreiro,rdbMago,rdbArqueirochkEspada,chkEscudo,chkPocao,chkArmaduranumForca,numInteligencia,numAgilidadebtnCriarPersonagemlblResumo
Formulário
- Implemente os métodos
numForca_ValueChanged(object sender, EventArgs e),numInteligencia_ValueChanged(object sender, EventArgs e),numAgilidade_ValueChanged(object sender, EventArgs e)e os eventosCheckedChangeddas classes e itens. Eles deverão atualizar o resumo quando a ficha mudar.
private void CriarPersonagem()
{
string nome = txtNome.Text;
int forca = Convert.ToInt32(numForca.Value);
int inteligencia = Convert.ToInt32(numInteligencia.Value);
int agilidade = Convert.ToInt32(numAgilidade.Value);
string classe;
int bonusClasse;
if (rdbMago.Checked)
{
classe = "Mago";
bonusClasse = 2 * inteligencia;
}
else if (rdbArqueiro.Checked)
{
classe = "Arqueiro";
bonusClasse = 2 * agilidade;
}
else
{
classe = "Guerreiro";
bonusClasse = 2 * forca;
}
int bonusItens = 0;
if (chkEspada.Checked) bonusItens += 8;
if (chkEscudo.Checked) bonusItens += 6;
if (chkPocao.Checked) bonusItens += 4;
if (chkArmadura.Checked) bonusItens += 10;
int atributos = forca + inteligencia + agilidade;
int poderTotal = atributos + bonusClasse + bonusItens;
lblResumo.Text = nome + " - " + classe + " | Poder total: " + poderTotal;
}
private void btnCriarPersonagem_Click(object sender, EventArgs e)
{
CriarPersonagem();
}
private void numForca_ValueChanged(object sender, EventArgs e)
{
CriarPersonagem();
}
private void numInteligencia_ValueChanged(object sender, EventArgs e)
{
CriarPersonagem();
}
private void numAgilidade_ValueChanged(object sender, EventArgs e)
{
CriarPersonagem();
}
private void opcaoPersonagem_CheckedChanged(object sender, EventArgs e)
{
CriarPersonagem();
}
Exercício 07 — Calculadora de área e volume de figuras
Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 3 RadioButtons, 2 NumericUpDown, 1 Button e 1 Label de resultado.
- Implemente o método
btnCalcular_Click(object sender, EventArgs e). Esse método deverá verificar a figura marcada, calcular o valor correspondente e atualizar a label de resultado.
Área mede o espaço ocupado por uma figura plana, como o círculo.
Volume mede o espaço ocupado por um sólido, como a esfera ou o cilindro.
Na esfera só o raio é necessário. No cilindro, além do raio da base, também é necessário usar a altura.
Para cada opção, use a fórmula correspondente:
\[ A_{circulo} = \pi \cdot raio^2 \] \[ V_{esfera} = \frac{4}{3} \cdot \pi \cdot raio^3 \] \[ V_{cilindro} = \pi \cdot raio^2 \cdot altura \]Componentes:
rdbCirculo,rdbEsfera,rdbCilindronumRaionumAlturabtnCalcularlblResultado
Formulário
- Implemente os métodos
numRaio_ValueChanged(object sender, EventArgs e)enumAltura_ValueChanged(object sender, EventArgs e). Eles deverão refazer o cálculo automaticamente usando a figura que estiver selecionada.
private void CalcularFigura()
{
double raio = Convert.ToDouble(numRaio.Value);
double altura = Convert.ToDouble(numAltura.Value);
double resultado;
if (rdbCirculo.Checked)
{
resultado = Math.PI * Math.Pow(raio, 2);
lblResultado.Text = "Área do círculo: " + resultado.ToString("F2");
}
else if (rdbEsfera.Checked)
{
resultado = (4.0 / 3.0) * Math.PI * Math.Pow(raio, 3);
lblResultado.Text = "Volume da esfera: " + resultado.ToString("F2");
}
else if (rdbCilindro.Checked)
{
resultado = Math.PI * Math.Pow(raio, 2) * altura;
lblResultado.Text = "Volume do cilindro: " + resultado.ToString("F2");
}
else
{
lblResultado.Text = "Escolha uma figura.";
}
}
private void btnCalcular_Click(object sender, EventArgs e)
{
CalcularFigura();
}
private void numRaio_ValueChanged(object sender, EventArgs e)
{
CalcularFigura();
}
private void numAltura_ValueChanged(object sender, EventArgs e)
{
CalcularFigura();
}
private void rdbFigura_CheckedChanged(object sender, EventArgs e)
{
CalcularFigura();
}


