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