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?

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 mun a média das primeiras n notas x1,x2,dots,xn:
mun = 1nsumk=1^n xk
Quando chegamos à próxima nota xn+1, queremos mun+1 sem reter todos os xk. Note que
mun+1 = 1n+1l(sumk=1^n xk + xn+1r) = nn+1,mun + 1n+1,xn+1
Isso equivale à fórmula de atualização
mun+1 ;=; mun ;+; xn+1-mun,n+1,

Passo 3

Agora basta implementar um loop que:
1. Inicializa mu 0 e n 0.
2. Lê uma nota x.
3. Se x<0, interrompe o loop e imprime mu.
4. Caso contrário, faz
n n + 1, mu mu + x - mun,
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

Exercícios relacionados