1
resposta

Registrando dados de alunos

Achei essa atividade muito bagunçada, não tem como fazer as validações de erro. Não escolheria esse tipo de entrada.
E depois ao ver que o objetivo era desempacotamento de tupla fiquei surpresa, nem tinha pensado em usar tuplas, fiz uma resolução diferente.

import msvcrt, os

def limpar_tela() -> None:
    os.system("cls")

def pausa_limpa(texto) -> None:
    print()
    print(texto)
    print("Aperte uma tecla para continuar", end="", flush=True)
    msvcrt.getch()
    limpar_tela()

def main() -> None:
    alunos: list[str] = []
    idades: list[int] = []
    notas: list[float] = []

    # João, 16, 8.5, Maria, 17, 9.2, Pedro, 15, 7.8
    while True:
        entradas = input("Digite os dados do aluno no formato Nome, Idade, Nota(colocar .0) separados por vírgula ou 's' para sair: ").strip()

        if entradas.casefold() in ["s", "sair"]:
            print("Fim do programa")
            break

        if not entradas:
            pausa_limpa("Entrada vazia.")
            return
        
        if entradas:
            for entrada in entradas.split(","):
                if isinstance(entrada, str):
                    nome_valido = validar_string(entrada)
                    alunos.append(nome_valido)
                elif isinstance(entrada, int):
                    idade_valida = validar_idade(entrada)
                    idades.append(idade_valida)
                elif isinstance(entrada, float):
                    nota_valida = validar_nota(entrada)
                    notas.append(nota_valida)
        
        imprimir_dados(alunos, idades, notas)

def validar_idade(entrada: str) -> int:
    try:
        idade = int(entrada)
    except ValueError:
        raise TypeError("Deve ser um número inteiro.")
    
    if idade < 0 and idade > 100:
        raise ValueError("Insira uma idade válida.")

    return idade

def validar_string(nome: str) -> str:
    if not isinstance(nome, str) or nome.isdigit():
        raise TypeError("O nome deve ser uma string.")
    if not nome.strip():
        raise ValueError("O nome não pode estar vazio.")
    
    return nome.strip().title()

def validar_nota(entrada: str) -> float:   
    try:
        nota = float(entrada)
    except ValueError:
        raise TypeError("Deve ser um número decimal.")
    
    if nota < 0 or nota > 10:
        raise ValueError(f"Insira uma nota valida, entre 0 e 10.")

    return nota

def imprimir_dados(lista_nome: list[str], lista_idade: list[int], lista_nota: list[float]) -> None:
    
    for nome in lista_nome:
        print(f"Nome: {nome}")

        for idade in lista_idade:
            print(f"Idade: {idade}")

            for nota in lista_nota:
                print(f"Nota: {nota:.2f}")


if __name__ == "__main__":
    main()


1 resposta

Olá, Rafaela! Como vai?

Entendo que a atividade pode parecer um pouco confusa no início, especialmente quando se trata de desempacotamento de tuplas. Vamos simplificar e ajustar o seu código para que ele se alinhe melhor com o objetivo da atividade: registrar e exibir os dados dos alunos de forma organizada.

Pelo que você descreveu, o foco é usar tuplas para armazenar os dados de cada aluno. Vou sugerir uma abordagem que utiliza desempacotamento de tuplas para facilitar a manipulação dos dados. Aqui está uma versão ajustada do seu código:

def main() -> None:
    alunos = []

    while True:
        entradas = input("Digite os dados do aluno no formato Nome, Idade, Nota separados por vírgula ou 's' para sair: ").strip()

        if entradas.casefold() in ["s", "sair"]:
            print("Fim do programa")
            break

        if not entradas:
            print("Entrada vazia.")
            continue

        try:
            nome, idade, nota = map(str.strip, entradas.split(","))
            nome = validar_string(nome)
            idade = validar_idade(idade)
            nota = validar_nota(nota)
            alunos.append((nome, idade, nota))
        except Exception as e:
            print(f"Erro: {e}")
            continue

    imprimir_dados(alunos)

def imprimir_dados(alunos: list[tuple[str, int, float]]) -> None:
    for nome, idade, nota in alunos:
        print(f"Aluno: {nome}")
        print(f"Idade: {idade}")
        print(f"Nota: {nota:.2f}")
        print()

# As funções de validação permanecem as mesmas

Aqui está o que fizemos:

  1. Armazenamos os dados de cada aluno como uma tupla dentro de uma lista alunos.
  2. Utilizamos map e str.strip para limpar os espaços em branco ao redor dos dados.
  3. Validamos os dados de entrada antes de adicioná-los à lista.
  4. Ao imprimir, desempacotamos cada tupla para exibir os dados de forma organizada.

Espero que isso ajude a esclarecer como o desempacotamento de tuplas pode ser usado para organizar e manipular dados de forma eficiente.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.