Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Exercício: Cálculo de frete por distância

Nesta versão, o usuário pode inserir a distância via terminal, com validação para garantir que o valor informado seja numérico e maior que zero.

import { createInterface } from "readline";

const calcularFrete = (distancia) => {
  if (distancia <= 5) return 5;
  if (distancia <= 20) return distancia * 0.5;
  return 20;
};

const rl = createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.question("Insira a distância (em km)\n> ", (input) => {
  const distancia = Number(input);

  if (Number.isNaN(distancia) || distancia <= 0) {
    console.log("Insira uma distância válida.");
    rl.close();
    return;
  }

  console.log(
    `Distância: ${distancia}km\nFrete: R$${calcularFrete(distancia).toFixed(2)}`,
  );

  rl.close();
});
2 respostas
solução!

Olá, Vitor. Como vai?

Parabéns por mais essa entrega! O seu código está muito bem estruturado e você aplicou corretamente as condicionais com retornos antecipados (early returns) dentro da função de frete. Essa técnica deixa o código mais limpo, pois evita o uso excessivo de blocos else.

Gostaria de destacar alguns pontos excelentes na sua implementação:

  • Lógica de Faixas de Preço: Você organizou bem as condições de distância, garantindo que fretes curtos tenham um valor fixo e fretes muito longos tenham um teto de preço (R$ 20,00).
  • Uso do .toFixed(2): Essa é a melhor prática para exibir valores monetários, garantindo que o usuário veja o preço com duas casas decimais, como em um sistema real.
  • Validação de Entrada: O check distancia <= 0 é fundamental, pois distâncias negativas ou zeradas não fariam sentido para o cálculo de logística.

Para complementar seu aprendizado, vale notar um detalhe interessante na sua lógica: no intervalo entre 5km e 10km, o frete calculado (distancia * 0.5) pode acabar sendo mais barato que o valor fixo de R$ 5,00 definido para distâncias menores (por exemplo, 6km resultaria em R$ 3,00).

Se a intenção for que R$ 5,00 seja o valor mínimo de qualquer entrega, uma sugestão seria usar a função Math.max():

const calcularFrete = (distancia) => {
  if (distancia > 20) return 20;
  // Garante que o valor nunca seja menor que 5
  return Math.max(5, distancia * 0.5);
};

Dessa forma, você simplifica ainda mais as condições e garante a viabilidade comercial do frete. Continue com esse ótimo desempenho e atenção aos detalhes!

Espero que possa ter lhe ajudado!

Oi, Evandro! Tudo bem?

Obrigado pelo feedback e pelas observações, gostei bastante das explicações.

Sobre esse ponto do valor mínimo de R$ 5, o enunciado pedia exatamente isso . Também estranhei quando li a regra, mas acabei seguindo a orientação do exercício.

No entanto, confesso que se fosse tentar ajustar a lógica para garantir esse mínimo de R$ 5, eu teria feito algo mais manual como:

const calcularFrete = (distancia) => {
  if (distancia <= 5) return 5;
  if (distancia <= 20) return distancia * 0.5 > 5 ? distancia * 0.5 : 5;
  return 20;
};

Mas a forma que você mostrou com Math.max() é bem mais clean e legível. Com certeza vou usar esse método em projetos futuros.

Valeu pela dica!