Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Exercícios

Eu nao consegui compreender a resolução desse exercício: Willian está iniciando no mundo da programação e recentemente descobriu que existe uma maneira de executar um bloco de comandos repetidamente enquanto uma condição pré-estabelecida não for satisfeita. Animado com as possibilidades, ele decidiu treinar a utilização da estrutura while() em um projeto pessoal, de cálculo de médias aritméticas. No entanto, acabou se deparando com um loop infinito, e não conseguiu descobrir o por quê. Sabendo que você também está estudando lógica de programação, Willian pediu sua ajuda para localizar onde está o erro em seu código: 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; } let media = soma / qtdNumeros; console.log(media);

Qual alteração você poderia sugerir a Willian para que o código tenha o resultado esperado?

Alguem poderia explicar de outra maneira? Estou com dúvida na hora de escrever o código com o while e não compreendi o exercício a cima

1 resposta
solução!

Olá, Julia! Tudo bom com você?

Eu imagino que, pela sua dúvida, você deve estar começando por agora na área de programação, certo. Se for esse o caso realmente, seja muito bem-vinda, que bom que você está buscando se desenvolver nessa área, e pode ter certeza que essa vai ser a primeira de muitas dúvidas, viu hahaha.

Agora, quanto ao código, eu vou explicar por alto aqui, mas você consegue encontrar uma explicação muito melhor em sites como MDN ou W3Schools. Um laço de repetição é uma estrutura de programação que vai executar aquele código que está dentro dele, do início ao fim, e depois irá se repetir continuamente, até que uma determinada condição se satisfaça e o laço encerre. Vamos tratar do while por enquanto, porque além de ser a sua dúvida, compreendendo ele você vai conseguir compreender demais laços depois. Como a própria tradução de 'while' sugere, 'enquanto', o while executa seu código enquanto a condição que é passada dentro dele não é satisfeita.

Vamos pegar um exemplo básico:

let numero = 0
while(numero <= 10){
    console.log(numero)
    numero++
}

Como pode ver, no código acima nos temos um contador, para isso foi definida a variável 'numero' que inicia com 0 e o laço while para fazer a contagem. Aqui, é como se você lesse o código dessa forma: (Enquanto 'numero' for menor ou igual a 10, imprime esse numero no console e depois incrementa ele). O while poupa o trabalho que teríamos de fazer esse contador manualmente, porque do contrário, teríamos que fazer algo assim:

let numero = 0
console.log(numero)
numero++
console.log(numero)
numero++...

Essa repetição teria que ser feita até chegarmos no valor que queremos, então usamos o laço de repetição justamente para que ele faça esse trabalho pra gente. Agora, explicando um ponto muito importante de laços de repetições, e dando um spoiler da solução do desafio que você apresentou, é que todo laço de repetição precisa de um controle para satisfazer a condição de parada, isso é, precisa de algo que encerre esse laço. Caso não existe um controle, vai acontecer justamente o problema que é apresentado no desafio, em que o laço vai ficar repetindo infinitamente até que ocorre uma estouro na pilha memória do seu computador e ele trave. No caso do código que eu passei, a condição de parada é 'numero <= 10', ou seja, a partir do momento que o valor de 'numero' for 10, o código não vai mais se repetir. Só que isso não é tudo, porque nós também precisamos do controle, que nesse caso, é o 'numero++' no fim do laço, onde é feito o incremento do 'numero', assim ele terá um valor maior na próxima repetição, até que a condição de parada se satisfaça.

Colocando em prática, usando o código do desafio, podemos ver os seguintes comandos:

let qtdNumeros = prompt('Digite a quantidade de números para o cálculo':)
let soma = 0
let contador = qtdNumeros

while(contador > 0){
    let numero = parseInt(prompt('Digite o número:'));
    soma += numero;
}

let media = soma / qtdNumeros;
console.log(media)

Vamos por partes: . Definida a variável 'qtdNumeros', para definir quantos números serão usados no cálculo da média;

. Definida a variável 'soma', que vai armazenar o valor da soma dos números da média;

. Definida a variável 'contador', que é justamente o controle do while, que nós vimos o que é agora há pouco;

. É criado o while e definida a condição de parada (contador > 0), ou seja, o laço vai repetir a até que o contador se torne 0;

. Dentro do laço, tem o input em que o usuário vai digitar o número que ele quer que tire a média, e esse número é armazenado em seguida na variável 'soma';

. Fora do laço, temos então enfim a variável 'media', que vai receber o valor da soma dos números e depois dividir pela quantidade de números, e por fim, o console.log para exibir o resultado de 'media'.

Tudo está perfeito até aqui, com uma exceção: por mais que temos a variável de controle, ela não está controlando a execução do while, ou seja, ele entrará em um loop infinito até que ocorra aquele estouro da pilha de memória. Para resolver isso, basta colocar no fim do código dentro do while o comando 'contador--', para decrementar o valor de contar até que, durante as repetições, ele se torne zera, a condição de parada seja satisfeita, e o código possa prosseguir normalmente.

let qtdNumeros = prompt('Digite a quantidade de números para o cálculo':)
let soma = 0;
let contador = qtdNumeros

while(contador > 0){
    let numero = parseInt(prompt('Digite o número:'));
    soma += numero;
    contador--
}

let media = soma / qtdNumeros;
console.log(media)

Enfim, espero que tenha conseguido te ajudar de alguma forma e que tenha sido claro o que quis explicar. Se tiver alguma dúvida, pode chamar aqui que tento formular uma forma melhor de explicar, tá bom. E caso eu tenha conseguido te ajudar, eu agradeceria demais de marcasse minha resposta como solução! Bons estudos pra você e um grande abraço, Julia!