Questâo 3 - Faça um programa que receba uma lista de tamanho indeterminado de números inteiros positivos. Use valor sentinela =0. 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 \;0\; para indicar o fim da lista;
  • ao finalizar a leitura (quando o usuário digitar \;0\;), 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 x_i satisfaz \;x_i>0\; enquanto não for o sentinela).
  • O sentinela é \;0\; 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:
\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i
Explicando cada termo:
  • \bar{x} é a média aritmética.
  • n é o número de valores lidos (quantos números positivos antes do sentinela \;0\;).
  • x_i são os valores lidos, para i=1,2,\dots,n.
    Na prática, basta somar todos os x_i e dividir por n.
Definição da média geométrica:
G = \left(\prod_{i=1}^{n} x_i\right)^{1/n}
ou, de forma numericamente mais estável,
G = \exp\!\left(\frac{1}{n}\sum_{i=1}^{n} \ln x_i\right).
Explicando:
  • \prod_{i=1}^{n} x_i é 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 \ln x_i e depois aplicamos a função exponencial.
Observações importantes para o programa:
  • Não incluir o sentinela \;0\; nos cálculos.
  • Se o usuário digitar \;0\; imediatamente (ou seja, n=0), 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 x_i>0, \ln x_i 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:
G = \exp\!\left(\frac{1}{n}\sum_{i=1}^{n} \ln x_i\right).
Essa forma exige funções matemáticas \ln e \exp, disponíveis em qualquer linguagem de programação padrão (ex.: Python).

Passo 4

Algoritmo passo a passo (pseudocódigo comentado):
  1. Inicialize \text{contador} \leftarrow 0, \text{soma} \leftarrow 0, \text{soma\_logs} \leftarrow 0.
  2. Leia repetidamente um inteiro x.
  3. Se x = 0 então pare a leitura (sentinela).
  4. Se x > 0 então:
    • faça \text{contador} \leftarrow \text{contador} + 1;
    • faça \text{soma} \leftarrow \text{soma} + x;
    • faça \text{soma\_logs} \leftarrow \text{soma\_logs} + \ln(x).
  5. Volte ao passo 2.
  6. Após sair do laço:
    • se \text{contador} = 0 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 \bar{x} = \dfrac{\text{soma}}{\text{contador}};
      • calcule a média geométrica por G = \exp\!\left(\dfrac{\text{soma\_logs}}{\text{contador}}\right);
      • mostre os dois resultados.

Passo 5

Exemplo numérico pequeno (para fixar):
Suponha que o usuário digite, na ordem, \;2, 8, 4, 0\;.
  • Aqui n=3.
  • Soma: 2+8+4=14. Então \bar{x} = 14/3 \approx 4{,}666666.
  • Soma dos logs: \ln 2 + \ln 8 + \ln 4 = \ln(2\cdot 8\cdot 4) = \ln 64.
    \dfrac{1}{3}\ln 64 = \ln(64^{1/3}) = \ln 4. Assim G = e^{\ln 4} = 4.
    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 \;0\;.
  • 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 \ln e \exp, 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}")

Exercícios relacionados