def pega_float(pergunta: str, opcoes: list[float] = []) -> float:
"""
Solicita uma entrada do usuário, garantindo que seja um número de ponto
flutuante (float) e, opcionalmente, que esteja dentro de uma lista de opções válidas.
A função converte automaticamente vírgulas (',') para pontos ('.') antes
de tentar a conversão para float.
Args:
pergunta: A mensagem (prompt) a ser exibida ao usuário.
opcoes: Uma lista de floats válidos. Se a lista estiver vazia
(padrão), qualquer número de ponto flutuante é aceito.
Returns:
O número de ponto flutuante digitado pelo usuário.
Raises:
ValueError: Se a entrada não puder ser convertida para `float`
ou se o float digitado não estiver na lista de opções válidas.
"""
resposta: float = 0.0
try:
resposta = float(input(pergunta).replace(',', '.'))
except ValueError:
raise ValueError('Entrada inválida!')
if opcoes == []:
return resposta
if resposta in opcoes:
return resposta
raise ValueError('Opção inválida!')
def calcula_media(notas: dict[str, float]) -> float:
"""
Calcula a média aritmética simples a partir de um dicionário de notas.
Args:
notas: Um dicionário onde a chave é o nome da avaliação (str)
e o valor é a nota correspondente (float).
Returns:
A média aritmética das notas como um número de ponto flutuante.
Raises:
TypeError: Se o argumento `notas` não for um dicionário ou se qualquer
valor dentro do dicionário não for do tipo float.
ValueError: Se o dicionário `notas` estiver vazio.
"""
if not isinstance(notas, dict):
raise TypeError('"notas" não é do tipo [dict]')
if notas == {}:
raise ValueError('"notas" é um dicionário vazio.')
for key, value in notas.items():
if not isinstance(value, float):
raise TypeError(f'["{key}": {value}] não é do tipo [float]')
media: float = 0.0
for nota in notas.values():
media = media + nota
media = media / len(notas.values())
return media
def classifica_aluno(media: float, reprovado: float, aprovado: float) -> str:
"""
Classifica o desempenho de um aluno com base em sua média e nos limites
de reprovação e aprovação.
Args:
media: A média final do aluno.
reprovado: O limite máximo para ser considerado reprovado (exclusivo).
aprovado: O limite mínimo para ser considerado aprovado (inclusivo).
Returns:
Uma string indicando a classificação: 'Reprovado', 'Recuperacao' ou 'Aprovado'.
Raises:
ValueError: Se o limite de `reprovado` não for menor que o limite de `aprovado`.
"""
if not reprovado < aprovado:
raise ValueError('"reprovado" precisa ser, obrigatoriamente, menor que "aprovado"!')
if media <= reprovado:
return 'Reprovado'
elif media > reprovado and media < aprovado:
return 'Recuperacao'
else:
return 'Aprovado'
def main() -> None:
"""
Função principal do programa para o cálculo e classificação da média de notas.
Solicita ao usuário três notas (Prova_1, Prova_2, Prova_Final),
calcula a média e classifica o aluno como Aprovado, Reprovado ou Recuperação,
utilizando limites predefinidos.
"""
NOTA_MINIMA: float = 0.0
NOTA_MAXIMA: float = 10.0
notas: dict[str, float] = {
'Prova_1': 0.0,
'Prova_2': 0.0,
'Prova_Final': 0.0
}
nova_nota: float = 0.0
media: float = 0.0
classificacao: str = ''
for nota in notas:
while True:
try:
nova_nota = pega_float(f'\nDigite a nota referente à "{nota}": ')
if not (nova_nota >= NOTA_MINIMA and nova_nota <= NOTA_MAXIMA):
print(f'A nota deve estar entre {NOTA_MINIMA} e {NOTA_MAXIMA}!')
continue
break
except ValueError as e:
print(e)
notas[nota] = nova_nota
media = calcula_media(notas)
print(f'Média = {media:.2f}')
classificacao = classifica_aluno(
media,
reprovado = 4.9,
aprovado = 7.0
)
print(classificacao)
if __name__ == '__main__':
main()