Questâo 3 - Faça um programa que receba uma lista de tamanho indeterminado de números inteiros positivos. Use valor sentinela
. Quando a lista for finalizada, seu programa deve retornar a média aritmética e a média geométrica desses números.
Passo 1
O enunciado pede que eu escreva um programa que:
- receba uma lista de tamanho indeterminado de números inteiros positivos;
- use o valor sentinela
para indicar o fim da lista; - ao finalizar a leitura (quando o usuário digitar
), retorne a média aritmética e a média geométrica desses números.
Informações relevantes que o enunciado deu:
- Os números lidos são inteiros e positivos (ou seja, cada número
satisfaz enquanto não for o sentinela). - O sentinela é
e não faz parte da lista de números a serem calculadas. - A lista tem tamanho indeterminado (portanto precisa-se ler até encontrar o sentinela).
- O programa deve produzir duas saídas: média aritmética e média geométrica.
Passo 2
Vamos entender o que são as médias pedidas — com calma, passo a passo.
Definição da média aritmética:
Explicando cada termo:
-
é a média aritmética. -
é o número de valores lidos (quantos números positivos antes do sentinela ). -
são os valores lidos, para .
Na prática, basta somar todos ose dividir por .
Definição da média geométrica:
ou, de forma numericamente mais estável,
Explicando:
-
é o produto de todos os números. - Tomando a enésima raiz, obtemos a média geométrica.
- Para evitar overflow (produto muito grande) ou underflow, usamos a transformação via logaritmo: somamos
e depois aplicamos a função exponencial.
Observações importantes para o programa:
- Não incluir o sentinela
nos cálculos. - Se o usuário digitar
imediatamente (ou seja, ), então não podemos calcular médias — o programa deve tratar esse caso (por exemplo, avisando que não houve números informados). - Como todos os
, está bem definida.
Passo 3
Escolha do método de cálculo (motivo):
- A média aritmética é direta: soma e divisão.
- A média geométrica pode ser calculada por produto e raiz, mas produto pode explodir para listas grandes. Por isso eu prefiro a versão com logaritmos, que é simples e robusta:
Essa forma exige funções matemáticas
e
, disponíveis em qualquer linguagem de programação padrão (ex.: Python).
Passo 4
Algoritmo passo a passo (pseudocódigo comentado):
- Inicialize
, , . - Leia repetidamente um inteiro
. - Se
então pare a leitura (sentinela). - Se
então: - faça
; - faça
; - faça
.
- faça
- Volte ao passo 2.
- Após sair do laço:
- se
então informe que nenhum número foi informado (não dá para calcular médias); - caso contrário:
- calcule a média aritmética por
; - calcule a média geométrica por
; - mostre os dois resultados.
- calcule a média aritmética por
- se
Passo 5
Exemplo numérico pequeno (para fixar):
Suponha que o usuário digite, na ordem, .
Suponha que o usuário digite, na ordem,
- Aqui
. - Soma:
. Então . - Soma dos logs:
.
. Assim .
Esse exemplo mostra que os dois métodos (produto+raiz ou soma de logs+exp) são coerentes.
Passo 6
Implementação do programa em Python (explicando o que cada parte faz):
- O programa abaixo lê inteiros até encontrar
. - Ignora valores negativos (opcional) e considera apenas inteiros positivos.
- Calcula a média aritmética com soma e divisão e a média geométrica pela soma dos logaritmos.
# Programa para ler inteiros positivos até o sentinela 0 e calcular médias
import math
contador = 0
soma = 0
soma_logs = 0.0
print("Digite números inteiros positivos (0 para terminar):")
while True:
try:
x = int(input()) # lê um inteiro do usuário
except ValueError:
print("Entrada inválida — digite um inteiro.")
continue
if x == 0:
break # sentinela: termina a leitura
if x < 0:
print("Número negativo ignorado. Digite apenas positivos ou 0 para terminar.")
continue # ignora negativos (opcional)
contador += 1
soma += x
soma_logs += math.log(x) # ln(x)
if contador == 0:
print("Nenhum número informado. Não é possível calcular as médias.")
else:
media_aritmetica = soma / contador
media_geometrica = math.exp(soma_logs / contador)
print(f"Média aritmética: {media_aritmetica:.6f}")
print(f"Média geométrica: {media_geometrica:.6f}")
Passo 7
Dicas finais e motivação:
- No exame, escreva primeiro a ideia (sentinela, variáveis soma/contador/soma_logs), depois o laço e por fim o cálculo das médias — isso garante clareza.
- Se a linguagem do exame não tiver funções
e , dá para usar produto e raiz inteira (cuidado com overflow). - Você conseguiu! Mesmo com pressa, esse problema tem uma estrutura direta: ler até sentinela → acumular → dividir / aplicar exponencial. Respira fundo e copia esse padrão que dá certo.
Resposta
import math
contador = 0
soma = 0
soma_logs = 0.0
print("Digite números inteiros positivos (0 para terminar):")
while True:
try:
x = int(input())
except ValueError:
print("Entrada inválida — digite um inteiro.")
continue
if x == 0:
break
if x < 0:
print("Número negativo ignorado. Digite apenas positivos ou 0 para terminar.")
continue
contador += 1
soma += x
soma_logs += math.log(x)
if contador == 0:
print("Nenhum número informado. Não é possível calcular as médias.")
else:
media_aritmetica = soma / contador
media_geometrica = math.exp(soma_logs / contador)
print(f"Média aritmética: {media_aritmetica:.6f}")
print(f"Média geométrica: {media_geometrica:.6f}")