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

[Dúvida] Corrigindo posições na lista de uma corrida de atletismo

"""Módulo para manipular a classificação (lista de nomes).

Contém a classe Classificacao que permite inserir nomes em posições
específicas, listar a classificação formatada e remover nomes.
"""

from nome_nao_encontrado import NomeNaoEncontrado
from lista_vazia import ListaVazia
from posicao_invalida import PosicaoInvalida

class Classificacao:
    """Gerencia uma lista ordenada de nomes (classificação).

    A lista usa posições baseadas em 1 ao expor a API ao usuário
    (ou seja, posição 1 é o primeiro elemento).

    Attributes:
        posicao (list): Lista interna de nomes, em ordem.
    """
    def __init__(self):
        """Inicializa uma nova classificação vazia."""
        self.posicao = []

    def adicionar_posicao(self, posicao, nome):
        """Adiciona uma pessoa pelo nome na posição informada.

        Args:
            posicao (int): Posição desejada (base 1). Deve estar entre
                1 e len(posicao) + 1.
            nome (str): Nome da pessoa a inserir.

        Raises:
            PosicaoInvalida: Se a posição estiver fora do intervalo válido.
        """
        if posicao < 1 or posicao > len(self.posicao) + 1:
            raise PosicaoInvalida("Posição inválida. Digite novamente.")
        self.posicao.insert(posicao -1, nome)

    @property
    def ver_posicao(self):
        """Retorna a classificação formatada como uma string.

        Returns:
            str: Cada linha no formato "<posição>º - <nome>" separada por
                quebras de linha.

        Raises:
            ListaVazia: Se não houver nomes na classificação.
        """
        if not self.posicao:
            raise ListaVazia("Nehum nome adicionado.")
        return "\n".join(f"{p}º - {n}" for p, n in enumerate(self.posicao, 1))
    
    def remover_nome(self, nome):
        """Remove um nome da classificação.

        Args:
            nome (str): O nome a ser removido.

        Raises:
            NomeNaoEncontrado: Se o nome não for encontrado.
        """
        if nome not in self.posicao:
            raise NomeNaoEncontrado(f"Nome {nome} não está na lista.")
        self.posicao.remove(nome)
class NomeNaoEncontrado(Exception):
    """Exceção para um nome não encontrado na classificação."""
    pass
class PosicaoInvalida(Exception):
    """Exceção para uma posição inválida na classificação."""
    pass
class ListaVazia(Exception):
    """Exceção para operações em uma classificação vazia."""
    pass
"""Aplicação de linha de comando para gerenciar a tabela de classificação.

Fornece um menu interativo que permite adicionar nomes em posições,
visualizar a classificação e remover nomes. Trata exceções específicas
definidas no pacote.
"""

from lista_vazia import ListaVazia
from posicao_invalida import PosicaoInvalida
from mudar_posicao import Classificacao
from nome_nao_encontrado import NomeNaoEncontrado

tabela = Classificacao()


def menu():
    """Exibe o menu principal da aplicação.

    Não possui parâmetros e apenas imprime as opções disponíveis ao usuário.
    """
    print("\n<<<<< Tabela de Classificação >>>>>")
    print("1. Adicionar nome")
    print("2. Ver classificação")
    print("3. Remover nome")
    print("4. Sair")


def main():
    """Loop principal que processa entradas do usuário.

    Raises:
        ValueError: Se a entrada não for um número.
        NomeNaoEncontrado: Se o nome a ser removido não for encontrado.
        ListaVazia: Se a classificação estiver vazia.
        PosicaoInvalida: Se a posição para adicionar um nome for inválida.
    """
    while True:
        menu()
        try:
            opcao = int(input("Escolha uma opção: "))

            match opcao:
                case 1:
                    nome = input("Digite o nome: ")
                    posicao = int(input("Digite a posição: "))
                    tabela.adicionar_posicao(posicao, nome)
                    print(f"{nome} adicionado na posição {posicao}.")

                case 2:
                    print("\nClassificação:")
                    print(tabela.ver_posicao)

                case 3:
                    nome_remover = input("Digite o nome que deseja remover: ")
                    tabela.remover_nome(nome_remover)
                    print(f"{nome_remover} foi removido com sucesso.")

                case 4:
                    print("Saindo...")
                    break

                case _:
                    print("Digite uma opção entre 1 e 4.")

        except ValueError:
            print("Erro: digite apenas números.")

        except NomeNaoEncontrado as e:
            print(e)

        except ListaVazia as v:
            print(v)

        except PosicaoInvalida as i:
            print(i)


if __name__ == "__main__":
    main()
1 resposta
solução!

Oii, João Filipe! Tudo bem?

Eu preciso te dar os parabéns porque você foi muito além do que o exercício pedia. Você não só resolveu problema de manipulação de listas, mas aplicou conceitos avançados como Orientação a Objetos (POO), Tratamento de Exceções personalizadas, Modularização (separando em arquivos) e até Docstrings para documentar o código. Ficou com uma estrutura super profissional, parecendo projeto de gente grande! O uso do match case também ficou excelente.

Dito isso, tenho um ponto de atenção para te passar, pensando na lógica específica do exercício:

O desafio pedia um script rápido para corrigir um erro pontual em uma lista que já existia. A sua solução criou um sistema completo de gerenciamento (adicionar, remover, ver), o que é ótimo, mas para o caso específico de "Trocar Carlos por João na mesma posição", o usuário do seu sistema teria que remover o Carlos e depois adicionar o João sabendo a posição de cabeça.

Para unir o seu conhecimento avançado com o objetivo da aula (que é usar o index), que tal criar um método novo na sua classe Classificacao? Algo que faça a troca direta?

Poderia ser algo assim:

    def corrigir_nome(self, nome_errado, nome_correto):
        if nome_errado in self.posicao:
            # Pega o índice do nome errado
            indice = self.posicao.index(nome_errado)
            # Remove o errado
            self.posicao.remove(nome_errado)
            # Insere o correto EXATAMENTE no mesmo lugar
            self.posicao.insert(indice, nome_correto)
        else:
            raise NomeNaoEncontrado(f"O nome {nome_errado} não está na lista.")

Isso resolveria o problema do "organizador da corrida" com um único comando, mantendo a sofisticação do seu código!

Continue assim, você está voando nos estudos.

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