Faça um programa que imprima a média de
números (
é um valor positivo lido do teclado) excluindo o menor e o maior deles. Seu programa deve tratar casos em que
exibindo uma mensagem de erro. (2)
Passo 1
O enunciado pede que seja feito um programa que:
- Leia um inteiro positivo
, (número de elementos a serem informados). - Se
, 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
, leia , 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:
, inteiro e positivo. - Entrada 2: sequência de
, números reais (ou inteiros). - Saída: mensagem de erro se
; caso contrário, a média dos , 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úmeros para uma lista, ordenar, remover extremos e calcular a média. Simples, mas usa memória . - 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
. - Soma total:
. - Menor valor:
. - Maior valor:
. - Soma sem extremos:
. - Número de valores usados na média:
. - Média desejada:
Cada variável acima tem o seguinte significado prático:
-
,: soma de todos os valores lidos. -
,: menor valor encontrado (inicializado no primeiro valor lido). -
,: maior valor encontrado (inicializado no primeiro valor lido). -
,: média final que será exibida.
Passo 4
Detalhar passo a passo o algoritmo que será implementado (para escrever no programa):
- Ler
, e verificar se é inteiro e . Se , imprimir mensagem de erro e terminar. - Inicializar contadores/variáveis: ler o primeiro número para inicializar
, (assim não precisa usar valores muito grandes/infinito). - Para cada um dos próximos
, números: - Converter o texto de entrada para número (usar tipo float para aceitar reais).
- Somar ao acumulador
. - Atualizar
, se o número for menor que . - Atualizar
, se o número for maior que .
- Ao final, calcular
, e . - 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
).
Passo 5
Exemplo numérico rápido para fixar:
- Suponha
, e os números . -
. -
, . -
. -
. - Média:
.
Isto corresponde a calcular a média de, que é . Viu como a fórmula é direta?
Passo 6
Erros e cuidados práticos que o programa trata:
- Entrada inválida para
, (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
, 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()