Nossa coloquei o contador e meu computador travou. Para parar ou evitar a repetição eu preciso decrementá-lo?
Nossa coloquei o contador e meu computador travou. Para parar ou evitar a repetição eu preciso decrementá-lo?
Olá, Marcos! Tudo bem?
Sim, você está absolutamente certo, e sinto muito que seu computador tenha travado. Essa é uma experiência clássica (e um pouco assustadora, eu sei) que quase todo programador passa ao encontrar seu primeiro loop infinito. Fique tranquilo, isso faz parte do aprendizado.
Sua intuição está corretíssima: para o loop parar, você precisa decrementar o contador.
A Lógica do Loop while
:
Pense no while
como um porteiro que só deixa o código dentro dele ser executado se uma condição for verdadeira.
No código do Willian, a condição é: while (contador > 0)
Isso significa: "Enquanto a variável contador
for maior que zero, execute o bloco de código repetidamente".
O problema (O porquê travou):
3
como a quantidade de números. A variável contador
começa valendo 3
.while
verifica: contador
(que é 3) é maior que 0? Sim. Então ele entra no loop.while
pergunta de novo: contador
(que ainda é 3) é maior que 0? Sim. Ele entra no loop de novo.Perceba que o valor da variável contador
nunca muda. Se ela começou com 3, ela será sempre 3. Se a condição 3 > 0
foi verdadeira na primeira vez, ela será verdadeira para sempre. Isso cria um ciclo sem fim, o loop infinito, que consome os recursos do seu computador e o faz travar.
Ao adicionar a linha contador--
dentro do loop, você está criando uma "escada" para que a condição de parada seja alcançada.
Veja o que acontece agora:
contador
começa valendo 3
. A condição 3 > 0
é verdadeira.contador--
transforma o 3
em 2
.while
verifica de novo: contador
(que agora é 2) é maior que 0? Sim.contador--
transforma o 2
em 1
.while
verifica de novo: contador
(que agora é 1) é maior que 0? Sim.contador--
transforma o 1
em 0
.while
verifica pela última vez: contador
(que agora é 0) é maior que 0? Não!O código corrigido fica assim:
let qtdNumeros = prompt('Digite a quantidade de números para o cálculo da média:');
let soma = 0;
let contador = qtdNumeros;
while(contador > 0){
let numero = parseInt(prompt('Digite o numero:'));
soma += numero;
// AQUI ESTÁ A MÁGICA!
// A cada volta, diminuímos 1 do contador para que ele chegue a zero.
contador--;
}
let media = soma / qtdNumeros;
console.log(`A média é: ${media}`);
A regra de ouro para loops é: a variável que controla a condição de parada precisa ser modificada dentro do loop para que, em algum momento, a condição se torne falsa.
Não se preocupe com o travamento. Agora você entende na prática o que é um loop infinito e, mais importante, como corrigi-lo. Parabéns por investigar a fundo e fazer a pergunta certa.