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

Duvida no tópico de repetições em JavaScript

No código dado pela aula :

<script>
var totalDeFamiliares = parseInt(prompt("Quantos familiares são?"));
var somaDeIdades = 0;

var numero = 1;
while(numero <= totalDeFamiliares) {
    var idade = parseInt(prompt("Qual é a idade?"));
    somaDeIdades = somaDeIdades + idade;
    numero++;
}

alert("A soma é: " + somaDeIdades);
</script>

Até a parte de que o código recebeu a minha variável e utiliza ela para limitar o numero de vezes em que ele vai perguntar a idade dos meus familiares eu consegui compreender porem queria saber como essa parte do código funciona :

var numero = 1;
while(numero <= totalDeFamiliares) {
    var idade = parseInt(prompt("Qual é a idade?"));
    somaDeIdades = somaDeIdades + idade;
    numero++;
}
3 respostas
solução!

Olá! Vamos analisar esse trecho de código!

O mais importante é notar o uso de while. Essa instrução indica, sem precisarmos olhar muito no código que algo será repetido. O que queremos repetir? A leitura da idade de um familiar através do teclado. Mas quantas familiares você tem e eu tenho? São números iguais? Não, sendo assim, se eu tenho 5 familiares e você 3, o número de vezes que ele deve perguntar ao usuário varia, ou seja, o número de repetições da pergunta varia.

Sendo assim, veja que o while repete sempre uma instrução até que alguma condição seja falsa. Veja que a condição do while é repetir até que o número de leitura de idades seja menor ou igual a quantidade de familiares informadas.

O programa não fez curso "mãe" Diná para saber quantas familiares eu tenho e você tem, por isso a primeira coisa que fazemos no programa é perguntar o total de familiares. Aliás, esse total é utilizando no while. Veja:

while(numero <= totalDeFamiliares)

Sendo sim, ele vai repetir as instruções dentro do bloco while tantas vezes. Quantas? O total de familiares informado.

Agora que matamos o lance da repetição, você sabe que não basta eu ler a idade do familiar. Eu tenho que acumular a idade de cada familiar lido, pois no final eu quero tirar a média das idades. Que é o somatória da idade de cada familiar dividido pelo total de familiares. O total já temos, precisamos é somar cada idade, uma a uma.

while(numero <= totalDeFamiliares) {
   // lê do teclado a idade
    var idade = parseInt(prompt("Qual é a idade?"));
   // acumula a idade na variavel somaDeIndades
    somaDeIdades = somaDeIdades + idade;
    numero++; // IMPORTANTEEEEEEEE!
}

Veja que para cada idade lida, eu acumulo seu valor em somaDeIdades. ATENÇÃO MEGA ULTRA AQUI: a variável somaDeIdades não pode ser declarada com 0 dentro do while, se você fizer isso, ela será zerada a cada leitura de idade. Sendo assim, esse código não funciona conforme o esperado:

while(numero <= totalDeFamiliares) {
    var somaDeIdades = 0; // isso está errado   
    var idade = parseInt(prompt("Qual é a idade?"));
    somaDeIdades = somaDeIdades + idade;
    numero++;
}

É por isso que somaDeIdades é inicializada com 0 ante do while. Mas Flávio, porque eu preciso inicializar somaDeIdades? Se você não atribuir 0, quando ele estiver dentro do while vai tentar somar undefined com a idade lida. Essa operação resulta em NaN (not a number) porque não é possível somar undefined com um número.

Mas não adianta nada você pedir para ler do teclado quantas vezes for o total de familiar. O nosso programa precisa saber que ele já leu uma vez, duas vezes, três vezes. É a quantidade de idades lidas que ele compara com o total de familiares para saber se para de repetir. É por isso que declaramos uma variável chamada numero. Ela começa de 1, depois de você ter lido a idade, ela vai para 2, depois de ler mais uma ela vai para 3. E veja que para cada passada do while ele compara número para ver se é igual ou menor ao total de idades. Se for, o while pode executar seu bloco, se não for, é porque já lemos todas as idades para a quantidade de familiares.

Por fim, como temos a soma total de idades e o total de familiares, podemos executar a média aritmética.

A essência desse curso é fazer com que você entenda que uma variável acumuladora deve ser iniciada fora do bloco de repetição e não dentro dele.

Esclareceu Cardeque? :)

Muito obrigado Flavio, fantástica sua explicação! :)