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.