Imagine que você é um professor de faculdade e está interessado em saber a média que seus alunos tiraram na prova.
Implemente um algoritmo que lê um número por vez e armazena os números em um vetor de inteiros. Quando é digitado um número negativo, o algoritmo deve printar a média das notas que foram digitadas e sair.
Desafio: É possível calcular a média dinâmicamente, ou seja, sem precisar armazenar todos os valores para depois calcular ela. Ao invés de armazenar todos os números, você só armazena a média da iteração anterior e o número de elementos. Implementar dessa forma tem a vantagem direta de reduzir consideravelmente o consumo de memória do programa. Você consegue fazer esse programa calculando a média de forma dinâmica?
Implemente um algoritmo que lê um número por vez e armazena os números em um vetor de inteiros. Quando é digitado um número negativo, o algoritmo deve printar a média das notas que foram digitadas e sair.
Desafio: É possível calcular a média dinâmicamente, ou seja, sem precisar armazenar todos os valores para depois calcular ela. Ao invés de armazenar todos os números, você só armazena a média da iteração anterior e o número de elementos. Implementar dessa forma tem a vantagem direta de reduzir consideravelmente o consumo de memória do programa. Você consegue fazer esse programa calculando a média de forma dinâmica?
Passo 1
O problema pede um algoritmo que leia notas (números inteiros não negativos) uma a uma até que seja digitado um número negativo, e então imprima a média aritmética das notas lidas. O desafio é não armazenar todas as notas num vetor, mas sim manter apenas a média até o momento e o número de elementos lidos, atualizando a média de forma incremental.
Passo 2
Seja
a média das primeiras
notas
:
Quando chegamos à próxima nota
, queremos
sem reter todos os
. Note que
Isso equivale à fórmula de atualização
Passo 3
Agora basta implementar um loop que:
. Inicializa
e
.
. Lê uma nota
.
. Se
, interrompe o loop e imprime
.
. Caso contrário, faz
e repete a leitura.
Resposta
Abaixo um pseudocódigo que calcula a média de forma dinâmica sem armazenar todas as notas:
\mu \leftarrow 0.0
n \leftarrow 0
enquanto verdadeiro:
x \leftarrow \text{ler\_inteiro}()
se x < 0 então
imprimir(\mu)
sair
fim se
n \leftarrow n + 1
\mu \leftarrow \mu + \frac{x - \mu}{n}
fim enquanto