Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
3
respostas

Resolução de Atividades - 05 Organizando notas de um concurso de redação

PARTE 2


main.py


from models.aluno import Aluno

def exibir_apresentacao():

    """Exibe no console uma apresentação ao programa"""

    print ("\nOlá, seja bem-vindo ao sistema de gerenciamento de notas do Concurso Nacional de Redação\n")

def selecao_opcoes():

    """Permite o usuário escolher uma opção dentre as disponíveis"""

    opcao_usuario = input (
        "Selecione as seguintes opções:" \
        "\n1 - Adicionar aluno" \
        "\n2 - Remover aluno" \
        "\n3 - Mostrar a lista de alunos" \
        "\n4 - Adicionar nota;" \
        "\n5 - Remover nota;" \
        "\n6 - Mostrar as notas de um aluno;" \
        "\n7 - Sair. \n Digite o número da opção desejada: ")
    
    return opcao_usuario

def confirmador():

    """ Trava o sistema até o usuário digitar uma tecla para que o texto do console não passe muito depressa"""

    input("\nAperte qualquer tecla para continuar")
    print("\n\n\n")

def inserir_id():

    """ Permite ao usuário inserir o ID do aluno que deseja adicionar uma nota """

    id_aluno = input ("Digite o ID do aluno: ")

    aluno_selecionado = Aluno.buscar_aluno_por_id (id_aluno)

    return aluno_selecionado

def main():

    while True:

        exibir_apresentacao()

        try: 
            opcao_usuario = int (selecao_opcoes())

            if opcao_usuario == 1:

                Aluno.adicionar_aluno()
                confirmador()

            elif opcao_usuario == 2:

                Aluno.remover_aluno()
                confirmador()

            elif opcao_usuario == 3:

                Aluno.mostrar_lista_alunos()
                confirmador()

            elif opcao_usuario == 4:

                aluno_selecionado = inserir_id()

                if aluno_selecionado == None:
                
                    print("Aluno não encontrado. Tente novamente")

                else:

                    nota = float (input ("Digite a nota que deseja adicionar: "))

                    aluno_selecionado.adicionar_nota(nota)
                    
                confirmador()

            elif opcao_usuario == 5:

                aluno_selecionado = inserir_id()

                if aluno_selecionado == None:
                
                    print("Aluno não encontrado. Tente novamente")

                else:

                    nota = float (input ("Digite a nota que deseja remover: "))

                    aluno_selecionado.remover_nota(nota)
                    
                confirmador()

            elif opcao_usuario == 6:

                aluno_selecionado = inserir_id()

                if aluno_selecionado == None:
                
                    print("Aluno não encontrado. Tente novamente")

                else:

                    print(f"Aluno: {aluno_selecionado.nome.upper()} \
                        \n Notas:")
                    
                    aluno_selecionado.notas.sort()       

                    for nota in aluno_selecionado.notas:

                        print (f" - {nota}")

                confirmador()

            elif opcao_usuario == 7:

                print ("\n\nObrigado por utilizar nossos serviços. Até mais!")
                break

            else:

                print ("Opção inválida. Por favor, tente novamente.")

        except ValueError:

            print ("Digite um número válido. Por favor, tente novamente.")
        

if __name__ == "__main__":

    main()
3 respostas
solução!

Olá, Victor! Como vai?

Parabéns pela resolução da atividade!

Vi que você explorou a estrutura de repetição com while para manter o programa ativo em Python, utilizou muito bem a organização em funções para separar responsabilidades e ainda compreendeu a importância da tratativa de erros com try/except para garantir que o usuário insira valores válidos.

Uma dica interessante para o futuro é criar uma camada de persistência (por exemplo: salvar os alunos e notas em um arquivo JSON ou banco de dados SQLite). Assim, os dados não se perdem quando o programa é encerrado:

import json

def salvar_alunos(lista_alunos, arquivo="alunos.json"):
    with open(arquivo, "w") as f:
        json.dump(lista_alunos, f)

def carregar_alunos(arquivo="alunos.json"):
    try:
        with open(arquivo, "r") as f:
            return json.load(f)
    except FileNotFoundError:
        return []

Isso faz com que o sistema seja mais realista e útil em cenários de uso contínuo.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Validação de notas: garantir que os valores estejam entre 0 e 10.
  • Interface clara: manter mensagens consistentes e amigáveis para o usuário.
  • Encapsular lógica em classes: separar responsabilidades entre Aluno e um GerenciadorDeAlunos.

Alguns materiais podem estar em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Ah, uma pergunta: você acha que adicionar persistência dos dados (como salvar em JSON ou banco de dados) deixaria o sistema mais próximo de um uso real ou prefere manter apenas em memória para simplificar os testes iniciais?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Oii de novo senhor Daniel. Acredito que sim, até porque todo sistema Back-End precisa de um banco de dados, se não, como o senhor mesmo disse, os dados se perderiam. Então salvar as informações dos estudantes em BD é muito importante a longo prazo. Por enquanto, por serem exercícios mais simples de listas e tuplas e por eu ainda não saber a área de sincronia entre o SGBD e o Back-End, eu deixarei por enquanto tudo na memória do computador mesmo. Porém, no futuro, pretendo sim adicionar a camada de persistência dos dados.

Olá, Victor! Tudo bem?

Você trouxe uma ótima reflexão!

De fato, em exercícios iniciais faz sentido manter os dados apenas na memória, porque isso simplifica bastante a prática e permite focar nos fundamentos de listas e tuplas. Mas como você mesmo destacou, em qualquer sistema Back-End real, a camada de persistência é essencial para garantir que as informações não se percam e possam ser consultadas de forma confiável.

O mais interessante é que você já está pensando no futuro, planejando evoluir para integrar um SGBD ao projeto. Esse passo vai te dar não só segurança nos dados, mas também abrir espaço para trabalhar com escalabilidade, relacionamentos entre tabelas e até otimizações de performance.

Parabéns pela visão estratégica, começar simples e depois avançar para persistência de dados é exatamente o caminho certo para evoluir com consistência.

Forte abraço e bons estudos por aí!