Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Solução] Classificando estudantes por media

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()

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta
solução!

Bom dia!

Sua resolução ficou excelente! Você fez um ótimo uso do aprendizado.

Parabéns pelo empenho nos estudos e continue praticando.

Para que mais pessoas consigam visualizar a sua solução proposta, é recomendado que você marque este tópico como solucionado. Assim pode ajudar ainda mais pessoas :)

Bons estudos!