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

[Projeto] Exercício: Temporizador de aquecimento

Nesta versão, o usuário pode definir o tempo mínimo que quiser.

import { createInterface } from "readline";

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

rl.question(
  "Defina o tempo mínimo de aquecimento (em segundos):\n> ",
  (input) => {
    const tempoMinimo = Number(input);

    if (
      Number.isNaN(tempoMinimo) ||
      !Number.isInteger(tempoMinimo) ||
      tempoMinimo < 5
    ) {
      console.log("Escolha um tempo maior que 4 segundos.");
      rl.close();
      return;
    }

    rl.question(
      "Em quanto tempo a temperatura ideal é alcançada? (em segundos):\n> ",
      (input) => {
        const tempIdeal = Number(input);

        if (
          Number.isNaN(tempIdeal) ||
          !Number.isInteger(tempIdeal) ||
          tempIdeal < 1
        ) {
          console.log("Escolha uma temperatura maior que 0.");
          rl.close();
          return;
        }

        let i = 1;

        if (tempIdeal <= tempoMinimo) {
          while (i <= tempoMinimo) {
            console.log("Aquecendo... segundo " + i);
            if (i === tempIdeal) console.log("Temperatura ideal atingida.");
            i++;
          }
        } else {
          while (i <= tempIdeal) {
            console.log("Aquecendo... segundo " + i);
            if (i === tempIdeal) console.log("Temperatura ideal atingida.");
            i++;
          }
        }

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

Olá, Vitor. Como vai?

Parabéns pelo projeto! É muito interessante ver como você aplicou os laços de repetição em um cenário de simulação de hardware (um temporizador). O uso de perguntas aninhadas com o readline para captar múltiplos parâmetros mostra que você está evoluindo bem na lógica de fluxos de dados.

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

  • Validação de Regras de Negócio: Você definiu um tempo mínimo de 5 segundos, o que é uma ótima prática para garantir que o simulador faça sentido na vida real.
  • Lógica Condicional: O uso do if dentro do while para verificar o momento exato em que a "Temperatura ideal" é atingida torna o console muito mais informativo para o usuário.
  • Tratamento de Entradas: Novamente, o uso de Number.isInteger e Number.isNaN protege seu código de quebras inesperadas.

Para agregar valor ao seu código, notei que você utilizou dois blocos while quase idênticos dentro de um if/else. Na programação, sempre que percebemos repetição de lógica, podemos tentar simplificar. No seu caso, o objetivo é sempre contar até o maior valor entre o tempoMinimo e o tempIdeal.

Você poderia reduzir a complexidade do código utilizando a função Math.max() para definir o limite da contagem em uma única variável:

// Simplificando a lógica de repetição
const limiteFinal = Math.max(tempoMinimo, tempIdeal);
let i = 1;

while (i <= limiteFinal) {
  console.log("Aquecendo... segundo " + i);
  
  if (i === tempIdeal) {
    console.log("Temperatura ideal atingida.");
  }
  
  i++;
}

Dessa forma, você mantém a mesma funcionalidade, mas com um código muito mais limpo e fácil de dar manutenção. Outro ponto legal de explorar no futuro seria o uso de setInterval para que as mensagens aparecessem com o atraso de 1 segundo real entre elas, simulando um cronômetro de verdade!

Continue com essa ótima sequência de exercícios práticos!

Espero que possa ter lhe ajudado!

Oi, Evandro! Tudo bem?

Obrigado pelo feedback e pelas observações, achei bem interessante.

Eu tinha percebido essa repetição das lógicas dos while dentro do if/else, mas confesso que não sabia exatamente como poderia evitar isso de forma mais elegante. Não conhecia o Math.max(), então essa sugestão ajudou bastante a enxergar uma forma mais limpa de resolver o problema.

Obrigado pela dica, com certeza vou usar isso em projetos futuros!