Respostas

Gabarito Comentado: Lista de Exercícios de Estruturas Condicionais

Fundamentos: if, else if, else

Nesta seção, focamos no trio essencial para tomar decisões no código.

1. Pode votar?

Crie um programa que diga se uma pessoa pode votar com base na idade (idade mínima para votar: 16).

Gabarito Comentado:

// 01_pode_votar.js
let idade = 20; // Altere este valor para testar

if (idade >= 16) {
  // A condição (idade >= 16) verifica se a idade é maior ou igual a 16.
  // Se for 'true', este bloco é executado.
  console.log("Você pode votar!");
} else {
  // Se a condição for 'false', o bloco 'else' é executado.
  console.log("Você ainda não pode votar.");
}

💡 Dica: Este é o uso mais clássico do if/else. Temos uma condição e duas respostas possíveis: uma para o caso verdadeiro e outra para o falso.


2. Par ou Ímpar?

Peça um número e diga se ele é par ou ímpar.

Gabarito Comentado:

// 02_par_ou_impar.js
let numero = 7; // Altere este valor para testar

// O operador de módulo (%) retorna o resto de uma divisão.
// Um número é par se o resto da sua divisão por 2 for exatamente 0.
if (numero % 2 === 0) {
  console.log(`O número ${numero} é Par.`);
} else {
  // Se o resto não for 0, o número é ímpar.
  console.log(`O número ${numero} é Ímpar.`);
}

🧠 Como o computador pensa: O segredo aqui é o operador % (módulo). Ele é perfeito para descobrir se um número é divisível por outro.


3. Nota de aprovação

Dada uma nota entre 0 e 10, diga se o aluno foi aprovado (nota maior que 7), em recuperação (nota entre 5 e 7), ou reprovado (menor que 5).

Gabarito Comentado:

// 03_nota_aprovacao.js
let nota = 6.5; // Altere este valor para testar

if (nota >= 7) {
  // Primeira verificação: a nota é suficiente para aprovação?
  console.log("Aprovado! Parabéns! 🎉");
} else if (nota >= 5) {
  // Se não foi aprovado, verificamos se ao menos é suficiente para recuperação.
  // Este bloco só é testado se o primeiro 'if' for falso.
  console.log("Em recuperação. Você consegue! 💪");
} else {
  // Se nenhuma das condições acima for verdadeira, o aluno está reprovado.
  console.log("Reprovado. Não desista! 📚");
}

⚠️ Atenção: A ordem do if/else if é crucial! Se invertêssemos e testássemos nota >= 5 primeiro, um aluno com nota 8 seria considerado "em recuperação", pois 8 também é maior que 5. O código pararia na primeira condição verdadeira.


4. Pode dirigir?

Crie um programa que diga se a pessoa pode dirigir com base na idade (≥ 18).

Gabarito Comentado:

// 04_pode_dirigir.js
let idadeParaDirigir = 18; // Altere este valor para testar

if (idadeParaDirigir >= 18) {
  console.log("Pode dirigir! 🚗");
} else {
  console.log("Ainda não pode dirigir. 🚶");
}

💡 Dica: Similar ao exercício de votação, este reforça a estrutura if/else para uma verificação simples de idade.


5. Temperatura do dia

Dada a temperatura, mostre mensagens específicas.

Gabarito Comentado:

// 05_temperatura_dia.js
let temperatura = 22; // Altere este valor para testar

if (temperatura < 10) {
  console.log("Muito frio ❄️");
} else if (temperatura <= 25) {
  // Se a temperatura não é menor que 10, ela já é >= 10.
  // Então, só precisamos checar se ela é menor ou igual a 25 para definir o intervalo.
  console.log("Temperatura agradável 🌤️");
} else {
  // Se não caiu em nenhuma das condições anteriores, é porque é maior que 25.
  console.log("Muito calor 🔥");
}

🧠 Como o computador pensa: O else if é eficiente aqui. O programa só avalia a segunda condição se a primeira for falsa, criando uma lógica de funil.


🔁 Praticando com situações do dia a dia

Aqui, aplicamos a lógica em cenários mais concretos.

6. Verificar login

Verifique se o usuário e a senha estão corretos. Use ===.

Gabarito Comentado:

// 06_verificar_login.js
const usuarioCorreto = "admin";
const senhaCorreta = "senha123";

let usuarioDigitado = "admin";
let senhaDigitada = "senha123";

// O operador '&&' (E) exige que AMBAS as condições sejam verdadeiras.
// Usamos '===' para garantir que tanto o valor quanto o tipo são iguais.
if (usuarioDigitado === usuarioCorreto && senhaDigitada === senhaCorreta) {
  console.log("Login efetuado com sucesso! ✅");
} else {
  console.log("Usuário ou senha incorretos. ❌");
}

✅ Boas práticas: Usar === (igualdade estrita) previne erros de conversão de tipo. Comparar "123" com 123 com === resulta em false, o que é mais seguro.


7. Promoção de cinema

Defina o preço da entrada com base na idade.

Gabarito Comentado:

// 07_promocao_cinema.js
let idadeCliente = 15; // Altere este valor para testar

if (idadeCliente > 60) {
  console.log("Entrada gratuita! 🍿");
} else if (idadeCliente >= 13 && idadeCliente <= 17) {
  // Aqui combinamos duas condições com '&&' para criar um intervalo.
  // A idade precisa ser MAIOR OU IGUAL a 13 E MENOR OU IGUAL a 17.
  console.log("Paga meia entrada! 🎟️");
} else {
  console.log("Paga inteira! 💵");
}

🔗 Lógica combinada: O operador && (E) é perfeito para verificar se um valor está dentro de um intervalo.


8. Desconto em loja

Dê desconto com base no tipo de cliente.

Gabarito Comentado:

// 08_desconto_loja.js
let tipoCliente = "vip"; // Altere para "novo" ou qualquer outra coisa

if (tipoCliente === "vip") {
  console.log("Desconto de 20% aplicado! ✨");
} else if (tipoCliente === "novo") {
  console.log("Desconto de 10% aplicado! 🎉");
} else {
  console.log("Valor cheio. Obrigado pela preferência!");
}

💡 Dica: Este é um ótimo candidato para ser reescrito com switch, como veremos mais à frente. O if/else if funciona perfeitamente para comparar strings.


9. Cálculo de Frete (Novo)

Crie uma lógica para uma loja online. O frete é grátis se o valor da compra for superior a R$ 150,00 ou se o cliente for assinante "premium". Caso contrário, o frete deve ser cobrado.

Gabarito Comentado:

// 09_calculo_frete.js
let valorCompra = 120.50;
let isClientePremium = true; // Altere os valores para testar

// A chave aqui é o operador '||' (OU). A condição será verdadeira
// se PELO MENOS UMA das duas afirmações for verdadeira.
if (valorCompra > 150 || isClientePremium === true) {
  // O cliente ganha frete grátis se:
  // 1. O valor da compra for maior que 150, OU
  // 2. O status de cliente premium for verdadeiro.
  console.log("Parabéns! Você ganhou Frete Grátis! 🎉");
} else {
  // Se nenhuma das duas condições for atendida, o frete é cobrado.
  console.log("Frete: R$ 20,00. Adicione mais itens para frete grátis!");
}

🧠 Como o computador pensa: O segredo aqui é o operador || (OU). Ele é perfeito para situações onde existem múltiplos caminhos para se chegar a um mesmo benefício. Diferente do && (E), que exige que todas as condições sejam verdadeiras, o || precisa que apenas uma delas seja.

🧼 Código limpo: Como isClientePremium já é um valor booleano (true ou false), poderíamos simplificar a condição para if (valorCompra >= 150 && isClientePremium). O === true é redundante, mas deixei para fins didáticos.


10. Dia da semana útil ou fim de semana?

Use .toLowerCase() e switch.

Gabarito Comentado:

// 10_dia_semana.js
let dia = "SáBaDo"; // Altere este valor para testar

// .toLowerCase() converte a string para minúsculas, evitando erros.
// Assim, "Sábado", "sábado" e "SÁBADO" funcionam da mesma forma.
switch (dia.toLowerCase()) {
  case "segunda":
  case "terça":
  case "quarta":
  case "quinta":
  case "sexta":
    // O 'case' sem 'break' "cai" para o próximo, agrupando as condições.
    console.log("Dia útil");
    break; // O break finaliza a execução do switch.

  case "sábado":
  case "domingo":
    console.log("Fim de semana");
    break;

  default:
    // O 'default' funciona como o 'else', executado se nenhum 'case' combinar.
    console.log("Dia inválido");
}

🎯 O poder do switch: Note como agrupamos vários case para a mesma saída. Isso deixa o código muito mais limpo do que um if com múltiplas condições || (OU).


🎯 Aprimorando com operadores lógicos e ternário

Vamos refinar nosso código para ser mais conciso e elegante.

11. Mensagem personalizada

Use o operador ternário para uma mensagem simples.

Gabarito Comentado:

// 11_mensagem_personalizada.js
let nome = "Ana";
let idade = 17;

// O operador ternário é uma forma compacta de 'if/else'.
// Estrutura: condição ? valor_se_verdadeiro : valor_se_falso
let mensagem = idade < 18 
  ? `Olá ${nome}, você ainda não é maior de idade.` 
  : `Bem-vindo(a), ${nome}!`;

console.log(mensagem);

⚡ Ternário em ação: Ideal para atribuições condicionais simples. Em uma única linha, definimos o valor da variável mensagem.


12. Bateria do celular

Uma cadeia if/else if clássica.

Gabarito Comentado:

// 12_bateria_celular.js
let porcentagemBateria = 19; // Altere para testar

if (porcentagemBateria >= 50) {
  console.log("Tudo certo com a bateria 🔋");
} else if (porcentagemBateria >= 20) {
  console.log("Melhor economizar... 😬");
} else {
  console.log("Conecte o carregador AGORA! ⚠️🔌");
}

💡 Dica: Esse exercício é idêntico ao da temperatura e ao da nota. A estrutura é a mesma, só mudam os valores e as mensagens. Isso mostra como a mesma lógica se aplica a problemas diferentes.


13. Verificar presença em aula

Duas condições que precisam ser verdadeiras.

Gabarito Comentado:

// 13_verificar_presenca.js
let frequencia = 80; // em porcentagem
let notaAluno = 7;

if (frequencia > 75 && notaAluno > 6) {
  console.log("Aluno aprovado! ✅");
} else {
  console.log("Aluno reprovado. ❌");
}

🔗 Lógica combinada: O && (E) é essencial aqui. Não adianta ter boa nota com baixa frequência, e vice-versa. As duas condições devem ser satisfeitas.


14. Semáforo

Use switch para múltiplas opções de igualdade.

Gabarito Comentado:

// 14_semaforo.js
let cor = "amarelo"; // Altere para "vermelho" ou "verde"

switch (cor) {
  case "vermelho":
    console.log("Pare");
    break;
  case "amarelo":
    console.log("Atenção");
    break;
  case "verde":
    console.log("Siga");
    break;
  default:
    console.log("Cor inválida");
}

🎯 switch vs. if: Este problema poderia ser resolvido com if/else if, mas o switch é mais legível e expressa melhor a intenção: comparar uma única variável contra múltiplos valores possíveis.


15. Ternário simples

Decisão rápida em uma linha.

Gabarito Comentado:

// 15_ternario_simples.js
let idadePessoa = 21;

let statusCompra = idadePessoa >= 18 ? "Pode comprar" : "Não pode comprar";

console.log(statusCompra);

⚡ Eficiência: O operador ternário brilha em situações como esta, onde você precisa de uma string ou valor simples baseado em uma única condição.


🧠 Desafios com boas práticas e lógica combinada

Hora de juntar tudo e escrever código de profissional!

16. Comparação de tipos

Teste as diferenças entre == e ===.

Gabarito Comentado:

// 16_comparacao_tipos.js
let numero = 10;
let texto = "10";

// '==' (Igualdade Abstrata): Compara apenas o valor, tentando converter os tipos.
// "10" é convertido para o número 10, e 10 == 10 é 'true'.
console.log(`Comparando com '==': ${numero == texto}`); // Resultado: true

// '===' (Igualdade Estrita): Compara o valor E o tipo.
// Como um é 'number' e o outro é 'string', o resultado é 'false'.
console.log(`Comparando com '===': ${numero === texto}`); // Resultado: false

✅ Boas práticas: Use sempre === para evitar surpresas com a conversão automática de tipos do JavaScript. É mais seguro e previsível.


17. Verificação aninhada

Um if dentro de outro if.

Gabarito Comentado:

// 17_verificacao_aninhada.js
let maiorDeIdade = true;
let temCNH = false; // Altere para true para testar

if (maiorDeIdade === true) {
  console.log("É maior de idade, verificando CNH...");
  
  // Este 'if' só é alcançado se o primeiro 'if' for verdadeiro.
  if (temCNH === true) {
    console.log("Pode dirigir! ✅");
  } else {
    console.log("Não tem CNH, não pode dirigir. ❌");
  }
} else {
  console.log("Não é maior de idade, não pode dirigir. ❌");
}

🪺 Aninhamento: Útil quando uma verificação só faz sentido se uma condição anterior já foi atendida.


18. Reduzindo código com operadores lógicos

Reescreva o código aninhado usando &&.

Gabarito Comentado:

// 18_reduzindo_codigo.js
let ehMaiorDeIdade = true;
let possuiCNH = true;

// O código aninhado do exercício anterior pode ser simplificado.
// A condição if (ehMaiorDeIdade && possuiCNH) resume a lógica em uma linha.
// É mais limpo e direto.
if (ehMaiorDeIdade && possuiCNH) {
  console.log("Pode dirigir! ✅");
} else {
  console.log("Não atende aos requisitos para dirigir. ❌");
}

🧼 Código limpo: Usar && em vez de ifs aninhados torna o código menos verboso e mais fácil de ler, desde que a lógica não seja excessivamente complexa.


19. Conversão de letras maiúsculas/minúsculas

Use .toLowerCase() com switch.

Gabarito Comentado:

// 19_conversao_letras.js
let frutaDigitada = "BaNaNa"; // Altere para testar com "Maçã", "uva", etc.

// .toLowerCase() garante que a comparação no 'switch' sempre funcionará.
switch (frutaDigitada.toLowerCase()) {
  case "banana":
    console.log("🍌");
    break;
  case "maçã":
    console.log("🍎");
    break;
  case "laranja":
    console.log("🍊");
    break;
  case "uva":
    console.log("🍇");
    break;
  default:
    console.log("Não temos emoji para esta fruta! 😢");
}

🛠️ Robustez: Normalizar a entrada do usuário (como converter para minúsculas) é uma prática fundamental para criar programas que não quebram com pequenas variações de digitação.


20. Calculadora de IMC

Calcule o IMC e classifique o resultado.

Gabarito Comentado:

// 20_calculadora_imc.js
let peso = 70; // em kg
let altura = 1.75; // em metros

// Fórmula do IMC: peso / (altura * altura)
// .toFixed(2) arredonda o resultado para 2 casas decimais.
const imc = (peso / (altura * altura)).toFixed(2);

console.log(`Seu IMC é: ${imc}`);

if (imc < 18.5) {
  console.log("Classificação: Abaixo do peso");
} else if (imc < 25) { // Já sabemos que é >= 18.5
  console.log("Classificação: Peso ideal");
} else if (imc < 30) { // Já sabemos que é >= 25
  console.log("Classificação: Sobrepeso");
} else if (imc < 40) { // Já sabemos que é >= 30
  console.log("Classificação: Obesidade");
} else { // Se não for nenhum dos anteriores, é >= 40
  console.log("Classificação: Obesidade grave");
}

🧠 Lógica sequencial: Assim como nos exercícios de nota e temperatura, a cadeia if/else if/else funciona como um filtro. Cada condição só é testada se as anteriores falharam, o que nos permite checar os intervalos de forma simples e eficiente.

Last updated