LP2

LP2

LP2

profile-pic

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

NumericUpDownButton ClickMath.SqrtMath.Pow

Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 2 NumericUpDown, 1 Button e 4 Labels de resultado.

  1. 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.
Triângulo retângulo com catetos e hipotenusa Desenho de um triângulo retângulo indicando cateto A, cateto B e hipotenusa. cateto B cateto A hipotenusa

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:

  • numCatetoA
  • numCatetoB
  • btnCalcular
  • lblHipotenusa, lblSeno, lblCosseno, lblTangente

Formulário

  1. Implemente os métodos numCatetoA_ValueChanged(object sender, EventArgs e) e numCatetoB_ValueChanged(object sender, EventArgs e). Eles deverão realizar o mesmo cálculo e atualizar os resultados sempre que um cateto mudar.
Aviso de gabarito: tente resolver o exercício antes de abrir o código. O gabarito só será mostrado depois que você clicar no botão abaixo.
Gabarito sugerido
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

NumericUpDownButton ClickMath.Pow

Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 3 NumericUpDown, 1 Button e 1 Label de resultado.

  1. 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:

  • numCapital
  • numTaxa
  • numMeses
  • btnCalcular
  • lblMontante

Formulário

  1. Implemente os métodos numCapital_ValueChanged(object sender, EventArgs e), numTaxa_ValueChanged(object sender, EventArgs e) e numMeses_ValueChanged(object sender, EventArgs e). Eles deverão refazer o cálculo automaticamente quando algum valor mudar.
Aviso de gabarito: tente resolver o exercício antes de abrir o código. O gabarito só será mostrado depois que você clicar no botão abaixo.
Gabarito sugerido
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

RadioButtonNumericUpDownButton ClickDesconto

Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 2 RadioButtons, 1 NumericUpDown, 1 Button e 3 Labels de resultado.

  1. 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, rdbCombo
  • numQuantidade
  • btnCalcularPedido
  • lblSubtotal, lblDesconto, lblTotal

Formulário

  1. Implemente os métodos numQuantidade_ValueChanged(object sender, EventArgs e) e rdbProduto_CheckedChanged(object sender, EventArgs e). Eles deverão refazer o cálculo sempre que a quantidade ou o tipo de produto mudar.
Aviso de gabarito: tente resolver o exercício antes de abrir o código. O gabarito só será mostrado depois que você clicar no botão abaixo.
Gabarito sugerido
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

NumericUpDownButton ClickMath.SqrtMath.Pow

Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 4 NumericUpDown, 1 Button e 1 Label de resultado.

  1. 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 Desenho de dois pontos no plano cartesiano ligados por um segmento, indicando as diferenças em X e Y. P1 (x1, y1) P2 (x2, y2) x2 - x1 y2 - y1 distância

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, numY1
  • numX2, numY2
  • btnCalcular
  • lblDistancia

Formulário

  1. Implemente os métodos numX1_ValueChanged(object sender, EventArgs e), numY1_ValueChanged(object sender, EventArgs e), numX2_ValueChanged(object sender, EventArgs e) e numY2_ValueChanged(object sender, EventArgs e). Eles deverão refazer o cálculo sempre que uma coordenada mudar.
Aviso de gabarito: tente resolver o exercício antes de abrir o código. O gabarito só será mostrado depois que você clicar no botão abaixo.
Gabarito sugerido
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

NumericUpDownButton ClickMath.SinMath.CosMath.Pow

Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 2 NumericUpDown, 1 Button e 3 Labels de resultado.

  1. 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 Desenho de uma trajetória parabólica indicando velocidade inicial, ângulo, altura máxima e alcance. velocidade inicial ângulo altura máxima alcance

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:

  • numVelocidade velocidade inicial
  • numAngulo ângulo em graus
  • btnCalcular
  • lblAlcance, lblAltura, lblTempo

Formulário

  1. Implemente os métodos numVelocidade_ValueChanged(object sender, EventArgs e) e numAngulo_ValueChanged(object sender, EventArgs e). Eles deverão realizar o mesmo cálculo e atualizar os resultados quando a velocidade ou o ângulo mudar.
Aviso de gabarito: tente resolver o exercício antes de abrir o código. O gabarito só será mostrado depois que você clicar no botão abaixo.
Gabarito sugerido
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

TextBoxRadioButtonCheckBoxNumericUpDown

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.

  1. 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:

  • txtNome
  • rdbGuerreiro, rdbMago, rdbArqueiro
  • chkEspada, chkEscudo, chkPocao, chkArmadura
  • numForca, numInteligencia, numAgilidade
  • btnCriarPersonagem
  • lblResumo

Formulário

  1. Implemente os métodos numForca_ValueChanged(object sender, EventArgs e), numInteligencia_ValueChanged(object sender, EventArgs e), numAgilidade_ValueChanged(object sender, EventArgs e) e os eventos CheckedChanged das classes e itens. Eles deverão atualizar o resumo quando a ficha mudar.
Aviso de gabarito: tente resolver o exercício antes de abrir o código. O gabarito só será mostrado depois que você clicar no botão abaixo.
Gabarito sugerido
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

RadioButtonNumericUpDownButton ClickMath.PIMath.Pow

Construa o formulário conforme é demonstrado abaixo. Esse formulário é composto por 3 RadioButtons, 2 NumericUpDown, 1 Button e 1 Label de resultado.

  1. 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 e volume de figuras Desenho de um círculo, uma esfera e um cilindro, indicando raio e altura. raio área do círculo raio volume da esfera raio altura volume do cilindro

Á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, rdbCilindro
  • numRaio
  • numAltura
  • btnCalcular
  • lblResultado

Formulário

  1. Implemente os métodos numRaio_ValueChanged(object sender, EventArgs e) e numAltura_ValueChanged(object sender, EventArgs e). Eles deverão refazer o cálculo automaticamente usando a figura que estiver selecionada.
Aviso de gabarito: tente resolver o exercício antes de abrir o código. O gabarito só será mostrado depois que você clicar no botão abaixo.
Gabarito sugerido
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();
}