0
respostas

[Sugestão] Hora da prática: listas, for e try except

import os
import platform
import datetime
import logging

logging.basicConfig(level=logging.INFO, format='[%(levelname)s] %(message)s')

def limpar_tela():
    if platform.system() == 'Windows':
        os.system('cls')
    else:
        os.system('clear')

def prosseguir(mensagem="Pressione Enter para continuar..."):
    input(f"\n{mensagem}")
    limpar_tela()

def validar_nome(nome):
    if nome.isalpha():
        return nome.upper()
    return False

def validar_ano(ano, ano_atual):
    idade = ano_atual - ano
    return 1 <= idade <= 125

if __name__ == "__main__":
    limpar_tela()
    
    numeros = list(range(1, 11))
    logging.info("Lista de números gerada com sucesso.\n")
    
    print("=== ETAPA 2: COLETANDO NOMES ===")
    nomes = []
    for i in range(5):
        while True:
            nome = input(f"Digite o nome {i + 1}: ").strip()
            nome_validado = validar_nome(nome)
            if nome_validado:
                nomes.append(nome_validado)
                logging.info(f"Nome {i + 1} coletado: {nome_validado}")
                break
            else:
                logging.error("Nome inválido. Deve conter apenas letras.")
    
    prosseguir()

    print("=== ETAPA 3: ANO DE NASCIMENTO ===")
    ano_atual = datetime.datetime.now().year
    while True:
        try:
            ano = int(input("Digite o ano de nascimento (4 dígitos): "))
            if len(str(ano)) == 4 and validar_ano(ano, ano_atual):
                logging.info(f"Ano de nascimento válido: {ano}")
                break
            else:
                logging.error("Ano inválido. A idade deve estar entre 1 e 125 anos.")
        except ValueError:
            logging.error("Entrada inválida. Digite um ano com 4 dígitos.")
    
    prosseguir()

    print("=== RESULTADOS GERAIS ===")
    logging.info("Exibindo os resultados finais.")
    print(f"Números: {numeros}")
    print(f"Nomes: {nomes}")
    print(f"Ano atual: {ano_atual} - Ano de nascimento: {ano}")
    prosseguir()

    print("=== ETAPA 5: CONTAGEM DE ELEMENTOS ===")
    listas = {"numeros": numeros, "nomes": nomes}
    for nome_lista, lista in listas.items():
        quantidade = len(lista)
        logging.info(f"Lista '{nome_lista}' verificada com {quantidade} item(ns).")
    prosseguir()

    print("=== ETAPA 6: NÚMEROS ÍMPARES ===")
    numeros_impares = [num for num in numeros if num % 2 != 0]
    soma_impares = sum(numeros_impares)
    print(f"Números ímpares: {numeros_impares}")
    print(f"Soma dos números ímpares: {soma_impares}")
    logging.info("Etapa 6 concluída: números ímpares processados.")
    prosseguir()

    print("=== ETAPA 7: NÚMEROS EM ORDEM DECRESCENTE ===")
    print("Números em ordem decrescente:", sorted(numeros, reverse=True))
    logging.info("Etapa 7 concluída: lista decrescente exibida.")
    prosseguir()

    print("=== ETAPA 8: TABUADA POR OPERAÇÃO ===")
    operacoes = {
        "ADIÇÃO": lambda a, b: f"{a} + {b} = {a + b}",
        "SUBTRAÇÃO": lambda a, b: f"{a} - {b} = {a - b}",
        "MULTIPLICAÇÃO": lambda a, b: f"{a} x {b} = {a * b}",
        "DIVISÃO": lambda a, b: f"{a} / {b} = {a / b:.2f}",
    }
    while True:
        try:
            numero = int(input("Digite um número da lista para ver a tabuada completa: "))
            if numero in numeros:
                print(f"\nTabuada completa do número {numero}:\n")
                for nome_op, op_func in operacoes.items():
                    print(f"--- {nome_op} ---")
                    for i in range(1, 11):
                        print(op_func(numero, i))
                    print()
                logging.info(f"Etapa 8 concluída: tabuada completa do número {numero} exibida por operação.")
                break
            else:
                logging.error("Número não encontrado na lista.")
        except ValueError:
            logging.error("Entrada inválida. Digite um número inteiro.")
    prosseguir()

    print("=== ETAPA 9: MÉDIA DOS NÚMEROS ===")
    try:
        media = sum(numeros) / len(numeros)
        print(f"Média dos números: {media:.2f}")
        logging.info(f"Etapa 9 concluída: média calculada como {media:.2f}.")
    except ZeroDivisionError:
        print("Não há números na lista para calcular a média.")
        logging.error("Divisão por zero ao calcular a média.")
    
    prosseguir("Fim do programa. Pressione Enter para sair...")