Questão 55 · Informática: Programação e algoritmos
O código em PHP (versão 5.4.4) apresentado a seguir deve calcular e exibir a média de uma lista de números, utilizando uma versão que não requer o cálculo e armazenamento da soma dos números. <?php function media($lista) { $atual = 0; for ($i = 0; $i < count($lista); $i++) { $atual += ($lista[$i]+$atual)/($i+1); } return $atual; } $a = array(1, 2, 3.5, 7.5); echo media($a);?> O programa, porém, não produz o resultado esperado.
Assinale a opção que indica, respectivamente, o valor exibido e a correção que deve ser feita.
- A) 7.5; trocar ($i+1) por ($i).
- B) 6.5; trocar ($i+1) por ($i).
- C) 7.5; trocar o sinal de adição antes de $atual por um sinal de subtração.
- D) 6.5; trocar o sinal de adição antes de $atual por um sinal de subtração.
- E) 7.5; remover o sinal de adição antes do operador de atribuição.
Marque a alternativa correta:
Gabarito: C
Gabarito definitivo divulgado pela banca FGV (DPE/MT 2015).
Comentário
Gabarito: C.
O código calcula a média de forma incremental, sem guardar a soma: a cada passo, o valor atual deve se aproximar do novo elemento em uma fração de 1 / (i + 1). Essa é a fórmula da média acumulada: média_i = média_(i-1) + (x_i - média_(i-1)) / (i + 1).
Ao executar o código como está, com a lista 1, 2, 3.5, 7.5, o resultado é:
- i = 0: 0 + (1 + 0) / 1 = 1
- i = 1: 1 + (2 + 1) / 2 = 2.5
- i = 2: 2.5 + (3.5 + 2.5) / 3 = 4.5
- i = 3: 4.5 + (7.5 + 4.5) / 4 = 7.5
O programa exibe 7.5. O erro está no sinal de adição dentro do parêntese, em ($lista[$i] + $atual). Trocando esse sinal por subtração, a expressão fica ($lista[$i] - $atual), que corresponde à fórmula acima e produz a média correta, 14 / 4 = 3.5. Por isso, a alternativa C é a correta.
Por que as outras estão erradas:
- (A) trocar ($i + 1) por ($i) causaria divisão por zero na primeira passagem, e o valor 7.5 não seria a correção.
- (B) o valor 6.5 não é o exibido pelo código, que é 7.5.
- (D) o valor 6.5 não corresponde à execução; a troca de sinal é a correção, mas o valor exibido é 7.5.
- (E) remover o sinal de adição antes da atribuição muda o cálculo e não corrige a média.
Dica de prova: em questões de código, rastreie a execução passo a passo antes de decidir o valor exibido e a correção. Confira também a fórmula descrita pelo enunciado: a média acumulada usa a diferença entre o novo valor e a média atual.
Fundamentos: média incremental sem armazenar a soma · rastreamento de código em PHP · fórmula da média acumulada
Comentário gerado pela Cravei IA a partir do enunciado e do gabarito definitivo divulgado pela banca, e conferido por uma verificação automática. A IA pode errar: o gabarito oficial sempre prevalece.
Fonte: prova FGV DPE/MT 2015 (Analista de Sistemas), questão 55, com o gabarito definitivo da banca. Comentário: Equipe Cravei · como fazemos e revisamos.