Faça um programa que imprima a média de n números ( n é um valor positivo lido do teclado) excluindo o menor e o maior deles. Seu programa deve tratar casos em que n<3 exibindo uma mensagem de erro. (2)

Passo 1

O enunciado pede que seja feito um programa que:
  • Leia um inteiro positivo \,n, (número de elementos a serem informados).
  • Se \,n<3, exiba uma mensagem de erro (porque não é possível excluir o menor e o maior e ainda ter números para calcular a média).
  • Caso \,n\ge 3, leia \,n, números (podem ser reais) e calcule a média desses números excluindo o menor e o maior valor (cada um excluído uma vez).
  • Exiba a média resultante.
Informações relevantes que o enunciado dá (resumindo):
  • Entrada 1: \,n\in\mathbb{Z}, inteiro e positivo.
  • Entrada 2: sequência de \,n, números reais (ou inteiros).
  • Saída: mensagem de erro se \,n<3; caso contrário, a média dos \,n-2, valores que restam após remover o menor e o maior valor (cada um contado uma vez).

Passo 2

Decidir como implementar o cálculo sem desperdiçar recursos e de forma robusta. Existem duas abordagens comuns:
  • Ler todos os \,n, números para uma lista, ordenar, remover extremos e calcular a média. Simples, mas usa memória \mathcal{O}(n).
  • Fazer uma única passagem (streaming): manter a soma acumulada, o menor atual e o maior atual enquanto os números são lidos. Depois calcular a média ajustando a soma. Essa é a abordagem que vamos usar porque é eficiente em memória e fácil de implementar.
Observação importante sobre “excluir o menor e o maior”: aqui vamos excluir exatamente uma ocorrência do menor e uma do maior. Se houver repetições (por exemplo, vários valores iguais ao mínimo), apenas uma dessas ocorrências será subtraída da soma — isso é o comportamento mais comum nesse tipo de exercício.

Passo 3

Explicar as fórmulas e variáveis que vamos usar:
  • Denotar os números lidos por \,x_1,x_2,\dots,x_n.
  • Soma total: \displaystyle S=\sum_{i=1}^{n} x_i.
  • Menor valor: \displaystyle m=\min\{x_1,\dots,x_n\}.
  • Maior valor: \displaystyle M=\max\{x_1,\dots,x_n\}.
  • Soma sem extremos: \displaystyle S_{\text{adj}} = S - m - M.
  • Número de valores usados na média: \displaystyle n_{\text{adj}} = n-2.
  • Média desejada:
\bar{x}_{\text{excl}}=\frac{S_{\text{adj}}}{n_{\text{adj}}}=\frac{S-m-M}{n-2}.
Cada variável acima tem o seguinte significado prático:
  • \,S,: soma de todos os valores lidos.
  • \,m,: menor valor encontrado (inicializado no primeiro valor lido).
  • \,M,: maior valor encontrado (inicializado no primeiro valor lido).
  • \,\bar{x}_{\text{excl}},: média final que será exibida.

Passo 4

Detalhar passo a passo o algoritmo que será implementado (para escrever no programa):
  1. Ler \,n, e verificar se é inteiro e \,n\ge 1. Se \,n<3, imprimir mensagem de erro e terminar.
  2. Inicializar contadores/variáveis: ler o primeiro número para inicializar \,S,m,M, (assim não precisa usar valores muito grandes/infinito).
  3. Para cada um dos próximos \,n-1, números:
    • Converter o texto de entrada para número (usar tipo float para aceitar reais).
    • Somar ao acumulador \,S.
    • Atualizar \,m, se o número for menor que \,m.
    • Atualizar \,M, se o número for maior que \,M.
  4. Ao final, calcular \,S_{\text{adj}}=S-m-M, e \,\bar{x}_{\text{excl}}=S_{\text{adj}}/(n-2).
  5. Exibir a média com um formato adequado (por exemplo, imprimir o número em ponto flutuante). Tratar possíveis casos numéricos (não haverá divisão por zero porque já garantimos \,n\ge 3).

Passo 5

Exemplo numérico rápido para fixar:
  • Suponha \,n=5, e os números 1,\,2,\,3,\,4,\,5.
  • \,S=1+2+3+4+5=15.
  • \,m=1, \,M=5.
  • \,S_{\text{adj}}=15-1-5=9.
  • \,n_{\text{adj}}=5-2=3.
  • Média: \displaystyle \bar{x}_{\text{excl}}=\frac{9}{3}=3.
    Isto corresponde a calcular a média de 2,3,4, que é 3. Viu como a fórmula é direta?

Passo 6

Erros e cuidados práticos que o programa trata:
  • Entrada inválida para \,n, (não inteiro): o programa pode assumir que o usuário digitou corretamente um inteiro; em implementações robustas seria verificado com try/except. No código abaixo incluo tratamento básico para conversões.
  • Se \,n<3, mostrar mensagem clara, por exemplo: “Erro: n deve ser pelo menos 3.”.
  • Aceitar números reais (float) para a sequência.
  • Se desejar ler todos os valores numa linha só, adaptações simples podem ser feitas; a versão abaixo pede um valor por linha (mais didático para provas).

Resposta

# Programa para calcular a média de n números excluindo o menor e o maior (uma ocorrência cada)

def main():
    try:
        n = int(input("Digite o valor de n (inteiro positivo): ").strip())
    except ValueError:
        print("Erro: n deve ser um número inteiro.")
        return

    if n < 3:
        print("Erro: n deve ser pelo menos 3.")
        return

    # Ler o primeiro número para inicializar soma, menor e maior
    try:
        primeiro = float(input("Digite o número 1: ").strip())
    except ValueError:
        print("Erro: entrada inválida para número.")
        return

    soma = primeiro
    menor = primeiro
    maior = primeiro

    # Ler os n-1 números restantes
    for i in range(2, n + 1):
        try:
            x = float(input(f"Digite o número {i}: ").strip())
        except ValueError:
            print("Erro: entrada inválida para número.")
            return
        soma += x
        if x < menor:
            menor = x
        if x > maior:
            maior = x

    soma_adj = soma - menor - maior
    media = soma_adj / (n - 2)

    print("Média excluindo o menor e o maior:", media)

if __name__ == "__main__":
    main()

Exercícios relacionados