From 553a39cc7c9aef76e9c3fc4ffd23cd3a1409c305 Mon Sep 17 00:00:00 2001 From: Jennison Diniz Date: Thu, 21 May 2026 19:54:43 -0400 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20m=C3=B3dulo=202=20resolvido=20-=20J?= =?UTF-8?q?ennison=5FDiniz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jennison_Diniz/modulo-02/exercicios.py | 605 ++++++++++++++++++ 1 file changed, 605 insertions(+) create mode 100644 modulo-02/Jennison_Diniz/modulo-02/exercicios.py diff --git a/modulo-02/Jennison_Diniz/modulo-02/exercicios.py b/modulo-02/Jennison_Diniz/modulo-02/exercicios.py new file mode 100644 index 0000000..dc12475 --- /dev/null +++ b/modulo-02/Jennison_Diniz/modulo-02/exercicios.py @@ -0,0 +1,605 @@ +""" +============================================================= +MÓDULO 2 – Estruturas de Controle +Curso de Capacitação Full Stack – ITEAM + +Aluno(a): Jennison Enthony Oliveira Diniz +Data : 21/05/2026 +============================================================= + +INSTRUÇÕES: + 1. Substitua e acima. + 2. Implemente cada função no espaço indicado com # SUA SOLUÇÃO AQUI. + 3. Não apague os comentários de orientação. + 4. Execute o arquivo para testar suas soluções antes de enviar. + 5. Suba este arquivo na pasta: + alunos//modulo-02/exercicios.py + +COMO EXECUTAR: + python exercicios.py +============================================================= +""" + + +# ============================================================== +# EXERCÍCIO 01 – Classificador de Temperatura +# Conceitos: if / elif / else, float(), input() +# ============================================================== +def ex01_classificador_temperatura(): + """ + Lê uma temperatura em Celsius e exibe sua classificação. + + Faixas: + < 0 → ❄️ Congelante + 0 a 14 → 🥶 Frio + 15 a 24 → 😊 Agradável + 25 a 34 → ☀️ Quente + >= 35 → 🔥 Muito quente + """ + # SUA SOLUÇÃO AQUI + temperatura = float(input("Digite a temperatura em Celsius: ")) + if temperatura < 0: + print("❄️ Congelante") + elif temperatura <= 14: + print("🥶 Frio") + elif temperatura <= 24: + print("😊 Agradável") + elif temperatura <= 34: + print("☀️ Quente") + else: + print("🔥 Muito quente") + + +# ============================================================== +# EXERCÍCIO 02 – Validador de Acesso +# Conceitos: if aninhado, comparação de strings +# ============================================================== +def ex02_validador_acesso(): + """ + Solicita usuário e senha e valida o acesso. + + Credenciais corretas: + usuário → "admin" + senha → "123456" + """ + # SUA SOLUÇÃO AQUI + usuario = input("Digite o usuário: ") + senha = input("Digite a senha: ") + if usuario == "admin": + if senha == "123456": + print("Acesso concedido! Bem-vindo.") + else: + print("Falha no acesso: Senha incorreta.") + else: + print("Falha no acesso: Usuário inexistente.") + + +# ============================================================== +# EXERCÍCIO 03 – Tabuada Interativa +# Conceitos: for, range(), f-string com alinhamento +# ============================================================== +def ex03_tabuada(): + """ + Solicita um número inteiro e exibe sua tabuada de 1 a 10. + """ + # SUA SOLUÇÃO AQUI + numero = int(input("Digite um número para ver sua tabuada: ")) + print(f"\n--- Tabuada do {numero} ---") + for i in range(1, 11): + resultado = numero * i + print(f"{numero} x {i:2} = {resultado:2}") + + +# ============================================================== +# EXERCÍCIO 04 – Contador Regressivo +# Conceitos: while, print com end= +# ============================================================== +def ex04_contador_regressivo(): + """ + Solicita um número inteiro positivo e faz a contagem + regressiva até 0, finalizando com '🚀 Lançamento!'. + """ + # SUA SOLUÇÃO AQUI + numero = int(input("Digite um número inteiro positivo para a contagem: ")) + while numero >= 0: + print(numero, end=" ") + numero -= 1 + print("🚀 Lançamento!") + + +# ============================================================== +# EXERCÍCIO 05 – Buscador com break +# Conceitos: for, break, enumerate() +# ============================================================== +def ex05_buscador_break(): + """ + Percorre o estoque e localiza 'Monitor', exibindo + sua posição. Usa break ao encontrar o item. + """ + estoque = ["Teclado", "Mouse", "Webcam", "Monitor", "Headset", "Notebook"] + + # SUA SOLUÇÃO AQUI + for indice, item in enumerate(estoque): + if item == "Monitor": + print(f"Item 'Monitor' encontrado na posição {indice}!") + break + + +# ============================================================== +# EXERCÍCIO 06 – Filtro de Dados com continue +# Conceitos: for, continue, None, acumuladores +# ============================================================== +def ex06_filtro_continue(): + """ + Percorre a lista de leituras, ignora os valores None + com continue e calcula soma, média e total ignorado. + """ + leituras = [12.5, None, 8.3, None, 15.0, 9.7, None, 11.2, 6.8, None] + + # SUA SOLUÇÃO AQUI + soma = 0 + contagem_validos = 0 + contagem_ignorados = 0 + + for leitura in leituras: + if leitura is None: + contagem_ignorados += 1 + continue + soma += leitura + contagem_validos += 1 + + media = soma / contagem_validos if contagem_validos > 0 else 0 + + print(f"Soma das leituras válidas: {soma:.2f}") + print(f"Média das leituras válidas: {media:.2f}") + print(f"Total de registros ignorados (None): {contagem_ignorados}") + + +# ============================================================== +# EXERCÍCIO 07 – Validação de Entrada com while +# Conceitos: while True, break, if/elif/else, float() +# ============================================================== +def ex07_validacao_nota(): + """ + Solicita a nota do aluno repetidamente até receber + um valor válido (0.0 a 10.0), então exibe o conceito. + + Conceitos: + 9.0 a 10.0 → A – Excelente + 7.0 a 8.9 → B – Bom + 5.0 a 6.9 → C – Regular + < 5.0 → D – Insuficiente + """ + # SUA SOLUÇÃO AQUI + while True: + try: + nota = float(input("Digite uma nota entre 0.0 e 10.0: ")) + if 0.0 <= nota <= 10.0: + break + else: + print("Nota fora do intervalo permitido. Tente novamente.") + except ValueError: + print("Entrada inválida. Digite um número decimal válido.") + + if nota >= 9.0: + print("Conceito: A – Excelente") + elif nota >= 7.0: + print("Conceito: B – Bom") + elif nota >= 5.0: + print("Conceito: C – Regular") + else: + print("Conceito: D – Insuficiente") + + +# ============================================================== +# EXERCÍCIO 08 – Calculadora com try/except +# Conceitos: try/except/else/finally, ValueError, ZeroDivisionError +# ============================================================== +def ex08_calculadora_segura(): + """ + Solicita dois números e uma operação (+, -, *, /). + Trata: ValueError, ZeroDivisionError, operação inválida. + Usa else para exibir o resultado e finally para encerrar. + """ + # SUA SOLUÇÃO AQUI + try: + num1 = float(input("Digite o primeiro número: ")) + num2 = float(input("Digite o segundo número: ")) + operacao = input("Digite a operação (+, -, *, /): ").strip() + + if operacao == "+": + resultado = num1 + num2 + elif operacao == "-": + resultado = num1 - num2 + elif operacao == "*": + resultado = num1 * num2 + elif operacao == "/": + resultado = num1 / num2 + else: + raise ValueError("Operação inválida!") + + except ValueError as e: + if "Operação inválida!" in str(e): + print("Erro: Operação matemática não reconhecida.") + else: + print("Erro: Entrada inválida. Digite números válidos.") + except ZeroDivisionError: + print("Erro: Divisão por zero não é permitida.") + else: + print(f"Resultado da operação: {resultado}") + finally: + print("Processamento da calculadora finalizado.") + + +# ============================================================== +# EXERCÍCIO 09 – Padrão Numérico com for aninhado +# Conceitos: for aninhado, range(), print com end= +# ============================================================== +def ex09_padrao_numerico(): + """ + Gera o triângulo crescente: + 1 + 1 2 + 1 2 3 + ... + 1 2 3 4 5 + + Desafio extra: gera também o triângulo decrescente logo abaixo. + """ + # SUA SOLUÇÃO AQUI + # Triângulo crescente + for i in range(1, 6): + for j in range(1, i + 1): + print(j, end=" ") + print() + + # Triângulo decrescente (Desafio Extra) + for i in range(4, 0, -1): + for j in range(1, i + 1): + print(j, end=" ") + print() + + +# ============================================================== +# EXERCÍCIO 10 – Jogo de Adivinhação +# Conceitos: while, contador, random, if/elif/else +# ============================================================== +def ex10_jogo_adivinhacao(): + """ + O computador sorteia um número entre 1 e 100. + O usuário tem 7 tentativas para adivinhar. + A cada erro, indica se o número é maior ou menor. + """ + import random + numero_secreto = random.randint(1, 100) + + # SUA SOLUÇÃO AQUI + tentativas = 7 + ganhou = False + + print("--- JOGO DE ADIVINHAÇÃO ---") + print("Pensei em um número entre 1 e 100. Você tem 7 tentativas para adivinhar!") + + while tentativas > 0: + try: + palpite = int(input(f"\nTentativas restantes: {tentativas}. Seu palpite: ")) + except ValueError: + print("Por favor, insira apenas números inteiros.") + continue + + if palpite == numero_secreto: + print(f"🎉 Parabéns! Você acertou! O número secreto era {numero_secreto}.") + ganhou = True + break + elif palpite < numero_secreto: + print("O número secreto é MAIOR.") + else: + print("O número secreto é MENOR.") + + tentativas -= 1 + + if not ganhou: + print(f"\n💥 Que pena, suas tentativas acabaram! O número secreto era {numero_secreto}.") + + +# ============================================================== +# EXERCÍCIO 11 – Verificador de Número Primo +# Conceitos: for, break, try/except, otimização com √n +# ============================================================== +def ex11_numero_primo(): + """ + Solicita um número inteiro positivo e verifica se é primo. + Usa break ao encontrar o primeiro divisor. + Trata ValueError e números negativos/zero. + Otimização: verifica divisores somente até √n. + """ + # SUA SOLUÇÃO AQUI + try: + num = int(input("Digite um número inteiro positivo: ")) + if num <= 0: + print("Erro: O número deve ser estritamente positivo.") + return + + if num == 1: + print("O número 1 não é primo.") + return + + primo = True + # Limite otimizado: parte inteira de da raiz quadrada de num + limite = int(num ** 0.5) + + for i in range(2, limite + 1): + if num % i == 0: + primo = False + break + + if primo: + print(f"O número {num} é PRIMO. ✅") + else: + print(f"O número {num} NÃO É PRIMO. ❌") + + except ValueError: + print("Erro: Entrada inválida. Digite um número inteiro.") + + +# ============================================================== +# EXERCÍCIO 12 – Analisador de Senha Forte +# Conceitos: for, if, booleanos, métodos de string +# ============================================================== +def ex12_analisador_senha(): + """ + Análise se uma senha atende aos critérios de segurança: + - Mínimo 8 caracteres + - Pelo menos 1 maiúscula + - Pelo menos 1 minúscula + - Pelo menos 1 dígito + - Pelo menos 1 caractere especial: !@#$%^&* + + Exibe relatório com ✅ ou ❌ para cada critério. + """ + # SUA SOLUÇÃO AQUI + senha = input("Digite a senha para análise: ") + + caracteres_especiais = "!@#$%^&*" + + c_comprimento = len(senha) >= 8 + c_maiuscula = False + c_minuscula = False + c_digito = False + c_especial = False + + for char in senha: + if char.isupper(): + c_maiuscula = True + if char.islower(): + c_minuscula = True + if char.isdigit(): + c_digito = True + if char in caracteres_especiais: + c_especial = True + + print("\n--- RELATÓRIO DE SEGURANÇA DA SENHA ---") + print(f"{'✅' if c_comprimento else '❌'} Mínimo 8 caracteres") + print(f"{'✅' if c_maiuscula else '❌'} Pelo menos 1 maiúscula") + print(f"{'✅' if c_minuscula else '❌'} Pelo menos 1 minúscula") + print(f"{'✅' if c_digito else '❌'} Pelo menos 1 dígito") + print(f"{'✅' if c_especial else '❌'} Pelo menos 1 caractere especial (!@#$%^&*)") + + if c_comprimento and c_maiuscula and c_minuscula and c_digito and c_especial: + print("\nResultado: Senha FORTE! 💪") + else: + print("\nResultado: Senha FRACA! ⚠️") + + +# ============================================================== +# EXERCÍCIO 13 – Simulador de Caixa Eletrônico +# Conceitos: while, //, if/else, try/except +# ============================================================== +def ex13_caixa_eletronico(): + """ + Solicita um valor de saque (múltiplo de R$10, máx R$3.000). + Calcula o menor número de cédulas: R$200, R$100, R$50, R$20, R$10. + Trata entradas inválidas. + """ + cedulas = [200, 100, 50, 20, 10] + + # SUA SOLUÇÃO AQUI + try: + valor = int(input("Digite o valor para saque (Múltiplos de R$10 até R$3000): R$ ")) + + if valor <= 0 or valor > 3000: + print("Erro: Valor de saque inválido. O limite é de R$ 10 a R$ 3000.") + return + if valor % 10 != 0: + print("Erro: Valor indisponível. Este caixa possui apenas cédulas de R$200, R$100, R$50, R$20 e R$10.") + return + + print(f"\nRealizando saque de R$ {valor}:") + resto = valor + idx = 0 + + while resto > 0 and idx < len(cedulas): + cedula_atual = cedulas[idx] + qtd_cedulas = resto // cedula_atual + + if qtd_cedulas > 0: + print(f"- {qtd_cedulas} cédula(s) de R$ {cedula_atual}") + resto %= cedula_atual + + idx += 1 + + except ValueError: + print("Erro: Entrada inválida. Por favor, digite um número inteiro.") + + +# ============================================================== +# EXERCÍCIO 14 – Leitura de Múltiplos Dados com Tratamento +# Conceitos: while, break, continue, try/except, pass +# ============================================================== +def ex14_leitura_notas_turma(): + """ + Lê notas de uma turma até o usuário digitar 'fim'. + Ignora notas inválidas com continue + mensagem de aviso. + Ao encerrar, exibe: total, média, maior e menor nota. + """ + notas = [] + + # SUA SOLUÇÃO AQUI + print("Digite as notas da turma (ou digite 'fim' para encerrar):") + while True: + entrada = input("Digite a nota: ").strip().lower() + if entrada == 'fim': + break + + try: + nota = float(entrada) + if 0.0 <= nota <= 10.0: + notas.append(nota) + else: + print("Aviso: Nota fora do intervalo (0.0 a 10.0) ignorada.") + continue + except ValueError: + print("Aviso: Entrada inválida. Digite um número ou 'fim'.") + continue + + if len(notas) > 0: + total_notas = len(notas) + media = sum(notas) / total_notas + maior = max(notas) + menor = min(notas) + + print("\n--- RESUMO DOS DADOS DA TURMA ---") + print(f"Total de notas válidas digitadas: {total_notas}") + print(f"Média da turma: {media:.2f}") + print(f"Maior nota: {maior:.1f}") + print(f"Menor nota: {menor:.1f}") + else: + print("\nNenhuma nota válida foi registrada.") + + +# ============================================================== +# EXERCÍCIO 15 – Desafio Final: Menu de Sistema +# Conceitos: while True, if/elif/else, break, continue, try/except +# ============================================================== +def ex15_menu_sistema(): + """ + Menu interativo que permanece ativo até o usuário sair. + + Opções: + [1] Conversor de temperatura (Celsius → Fahrenheit) + [2] Verificador de número primo (versão simplificada) + [3] Analisador de senha (apenas comprimento e dígito) + [4] Calculadora segura (só +, -, *, /) + [0] Sair + + Usa try/except em toda entrada do usuário. + """ + while True: + print("\n" + "=" * 29) + print(" SISTEMA ITEAM - MENU ") + print("=" * 29) + print("[1] Conversor de temperatura") + print("[2] Verificador de número primo") + print("[3] Analisador de senha") + print("[4] Calculadora segura") + print("[0] Sair") + print("=" * 29) + + # SUA SOLUÇÃO AQUI — leia a opção e implemente cada funcionalidade + try: + opcao = int(input("Escolha uma opção: ")) + except ValueError: + print("Erro: Opção inválida! Digite um número do menu.") + continue + + if opcao == 0: + print("Encerrando o Sistema ITEAM. Até logo!") + break + + elif opcao == 1: + print("\n[1] Conversor de temperatura") + try: + celsius = float(input("Digite a temperatura em Celsius: ")) + fahrenheit = (celsius * 9/5) + 32 + print(f"Resultado: {celsius}°C equivale a {fahrenheit:.1f}°F") + except ValueError: + print("Erro: Entrada de dados inválida.") + + elif opcao == 2: + print("\n[2] Verificador de número primo") + try: + num = int(input("Digite um número inteiro: ")) + if num <= 1: + print(f"O número {num} não é primo.") + else: + primo = True + for i in range(2, int(num**0.5) + 1): + if num % i == 0: + primo = False + break + if primo: + print(f"O número {num} é primo! ✅") + else: + print(f"O número {num} não é primo. ❌") + except ValueError: + print("Erro: Entrada de dados inválida.") + + elif opcao == 3: + print("\n[3] Analisador de senha simplificado") + senha = input("Digite a senha para avaliar: ") + tem_digito = any(char.isdigit() for char in senha) + comprimento_ok = len(senha) >= 6 + + print(f"- Pelo menos 6 caracteres: {'✅' if comprimento_ok else '❌'}") + print(f"- Possui ao menos 1 número: {'✅' if tem_digito else '❌'}") + + elif opcao == 4: + print("\n[4] Calculadora segura") + try: + n1 = float(input("Primeiro número: ")) + n2 = float(input("Segundo número: ")) + op = input("Operação (+, -, *, /): ").strip() + if op == "+": + print(f"Resultado: {n1 + n2}") + elif op == "-": + print(f"Resultado: {n1 - n2}") + elif op == "*": + print(f"Resultado: {n1 * n2}") + elif op == "/": + print(f"Resultado: {n1 / n2}") + else: + print("Operação inválida.") + except ZeroDivisionError: + print("Erro: Divisão por zero!") + except ValueError: + print("Erro: Dados numéricos inválidos.") + else: + print("Opção inválida! Escolha um número de 0 a 4.") + + +# ============================================================== +# EXECUÇÃO PRINCIPAL +# Descomente as chamadas dos exercícios que você já resolveu. +# ============================================================== +if __name__ == "__main__": + print("\n" + "=" * 50) + print("MÓDULO 2 – Estruturas de Controle") + print(f"Aluno(a): Jennison Enthony Oliveira Diniz") + print("=" * 50) + + # Descomente linha por linha conforme for resolvendo: + # ex01_classificador_temperatura() + # ex02_validador_acesso() + # ex03_tabuada() + # ex04_contador_regressivo() + # ex05_buscador_break() + # ex06_filtro_continue() + # ex07_validacao_nota() + # ex08_calculadora_segura() + # ex09_padrao_numerico() + # ex10_jogo_adivinhacao() + # ex11_numero_primo() + # ex12_analisador_senha() + # ex13_caixa_eletronico() + # ex14_leitura_notas_turma() + # ex15_menu_sistema() \ No newline at end of file From ffaf8ebb69bc409590c79795de59f04bbb792357 Mon Sep 17 00:00:00 2001 From: Jennison Diniz Date: Thu, 21 May 2026 19:57:46 -0400 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20m=C3=B3dulo=201=20=20resolvido=20-?= =?UTF-8?q?=20Jennison=5FDiniz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Exerc\303\255cio/Exerc\303\255cio 01.py" | 3 + .../Exerc\303\255cio/Exerc\303\255cio 02 .py" | 3 + .../Exerc\303\255cio/Exerc\303\255cio 03.py" | 4 + .../Exerc\303\255cio/Exerc\303\255cio 04 .py" | 12 ++ .../Exerc\303\255cio/Exerc\303\255cio 05.py" | 10 ++ .../Exerc\303\255cio/Exerc\303\255cio 06.py" | 25 +++ .../Exerc\303\255cio/Exerc\303\255cio 07.py" | 9 ++ .../Exerc\303\255cio/Exerc\303\255cio 08.py" | 13 ++ .../Exerc\303\255cio/Exerc\303\255cio 09.py" | 11 ++ .../Exerc\303\255cio/Exerc\303\255cio 10.py" | 16 ++ .../Exerc\303\255cio/Exerc\303\255cio 11.py" | 19 +++ .../Exerc\303\255cio/Exerc\303\255cio 12.py" | 22 +++ .../Exerc\303\255cio/Exerc\303\255cio 13 .py" | 24 +++ .../Exerc\303\255cio/Exerc\303\255cio 14.py" | 27 ++++ .../Exerc\303\255cio/Exerc\303\255cio 15.py" | 22 +++ .../Exerc\303\255cio/Exerc\303\255cio 16.py" | 18 +++ .../Exerc\303\255cio/Exerc\303\255cio 17.py" | 23 +++ .../Exerc\303\255cio/Exerc\303\255cio 18 .py" | 25 +++ .../Exerc\303\255cio/Exerc\303\255cio 19.py" | 25 +++ .../Exerc\303\255cio/Exerc\303\255cio 20.py" | 18 +++ .../Exerc\303\255cio/Exerc\303\255cio 21.py" | 21 +++ .../Exerc\303\255cio/Exerc\303\255cio 22.py" | 39 +++++ .../Exerc\303\255cio/Exerc\303\255cio 23 .py" | 26 +++ .../Exerc\303\255cio/Exerc\303\255cio 24.py" | 31 ++++ .../Exerc\303\255cio/Exerc\303\255cio 25.py" | 28 ++++ .../Exerc\303\255cio/Exerc\303\255cio 26.py" | 32 ++++ .../Exerc\303\255cio/Exerc\303\255cio 27.py" | 29 ++++ .../Exerc\303\255cio/Exerc\303\255cio 28.py" | 29 ++++ .../Exerc\303\255cio/Exerc\303\255cio 29.py" | 33 ++++ .../Exerc\303\255cio/Exerc\303\255cio 30.py" | 32 ++++ .../Exerc\303\255cio/Exerc\303\255cio 31.py" | 34 ++++ .../Exerc\303\255cio/Exerc\303\255cio 32.py" | 68 ++++++++ .../Exerc\303\255cio/Exerc\303\255cio 33 .py" | 94 +++++++++++ .../Exerc\303\255cio/Exerc\303\255cio 34.py" | 72 +++++++++ .../Exerc\303\255cio/Exerc\303\255cio 35.py" | 68 ++++++++ .../Exerc\303\255cio/Exerc\303\255cio 36.py" | 106 ++++++++++++ .../Exerc\303\255cio/Exerc\303\255cio 37 .py" | 68 ++++++++ .../Exerc\303\255cio/Exerc\303\255cio 38.py" | 43 +++++ .../Exerc\303\255cio/Exerc\303\255cio 39.py" | 97 +++++++++++ .../Exerc\303\255cio/Exerc\303\255cio 40.py" | 151 ++++++++++++++++++ .../modulo-01/Exerc\303\255cio/produto.json" | 12 ++ 41 files changed, 1442 insertions(+) create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 03.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 04 .py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 05.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 06.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 07.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 08.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 09.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 10.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 11.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 12.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 13 .py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 14.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 15.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 16.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 17.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 18 .py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 19.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 20.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 21.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 22.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 23 .py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 24.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 25.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 26.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 27.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 28.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 29.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 30.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 31.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 32.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 33 .py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 34.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 35.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 36.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 37 .py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 38.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 39.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 40.py" create mode 100644 "modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/produto.json" diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" new file mode 100644 index 0000000..bd6151e --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" @@ -0,0 +1,3 @@ +print("Olá, Mundo!") +print("Jennison Enthony Oliveira Diniz") +print("Python: simples, poderoso e elegante.") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" new file mode 100644 index 0000000..6060234 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" @@ -0,0 +1,3 @@ +import sys +print(sys.version) +print(sys.platform) \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 03.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 03.py" new file mode 100644 index 0000000..a280270 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 03.py" @@ -0,0 +1,4 @@ +import this + +# Minha explicação: É sempre melhor deixar claro o que o seu código está fazendo +# evita mal-entendidos e facilita a vida de quem vai dar manutenção depois. \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 04 .py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 04 .py" new file mode 100644 index 0000000..1bb9431 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 04 .py" @@ -0,0 +1,12 @@ +""" +Programa para gerenciamento de dados cadastrais de funcionários. +Este script define as informações básicas de um colaborador, como nome, +idade, salário e status de atividade, e exibe esses dados no console. +""" + +nome = "Ana Lima" # Cria uma variável do tipo string (texto) para armazenar o nome +idade = 29 # Cria uma variável do tipo int (inteiro) para armazenar a idade +salario = 4500.00 # Cria uma variável do tipo float (decimal) para armazenar o salário +ativo = True # Cria uma variável do tipo bool (booleano) para indicar se o cadastro está ativo + +print(nome, idade, salario, ativo) # Exibe os valores de todas as variáveis na tela, separados por espaço \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 05.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 05.py" new file mode 100644 index 0000000..f37a099 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 05.py" @@ -0,0 +1,10 @@ +# ERRO 1: 'Print' estava com a inicial maiúscula. O Python diferencia maiúsculas de minúsculas. +print("Bem-vindo ao curso de Python") + +# ERRO 2: Faltava fechar as aspas no nome "Carlos". +nome = "Carlos" + +print("Aluno: " + nome) + +# ERRO 3: O texto 'Curso de Python' estava sem aspas, o que fazia o Python achar que eram variáveis não declaradas. +print("Curso de Python") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 06.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 06.py" new file mode 100644 index 0000000..360a43e --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 06.py" @@ -0,0 +1,25 @@ +# 1. Ano atual (Número inteiro) +ano_atual = 2026 + +# 2. Temperatura em Celsius (Número de ponto flutuante) +temperatura = 28.5 + +# 3. Nome de uma cidade brasileira (String) +cidade = "Boa Vista" + +# 4. Se está chovendo (Booleano) +esta_chovendo = False + +# 5. Valor especial None (previsao) +previsao = None + +# 6. Uma string genérica +uma_corda = "Exemplo de texto" + +# Exibindo o valor e o tipo de cada variável no formato solicitado +print(f"{ano_atual} → {type(ano_atual)}") +print(f"{temperatura} → {type(temperatura)}") +print(f"'{cidade}' → {type(cidade)}") +print(f"{esta_chovendo} → {type(esta_chovendo)}") +print(f"{previsao} → {type(previsao)}") +print(f"'{uma_corda}' → {type(uma_corda)}") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 07.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 07.py" new file mode 100644 index 0000000..60f941d --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 07.py" @@ -0,0 +1,9 @@ +# Armazena a largura e o comprimento do terreno em variáveis +largura = 12.5 +comprimento = 30.0 + +# Calcula a área (largura multiplicada pelo comprimento) +area = largura * comprimento + +# Exibe o resultado formatado com a unidade de medida m² +print(f"Área do terreno: {area} m²") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 08.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 08.py" new file mode 100644 index 0000000..98d49a5 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 08.py" @@ -0,0 +1,13 @@ +# Temperatura inicial em Celsius +celsius = 36.5 + +# Conversão para Fahrenheit: F = (C × 9/5) + 32 +fahrenheit = (celsius * 9/5) + 32 + +# Conversão para Kelvin: K = C + 273.15 +kelvin = celsius + 273.15 + +# Exibe os resultados formatados +print(f"Temperatura em Celsius: {celsius}°C") +print(f"Temperatura em Fahrenheit: {fahrenheit}°F") +print(f"Temperatura em Kelvin: {kelvin}K") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 09.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 09.py" new file mode 100644 index 0000000..5663461 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 09.py" @@ -0,0 +1,11 @@ +# Solicitando o nome do usuário +nome = input("Digite o seu nome: ") + +# Solicitando a idade e convertendo para número inteiro (int) +idade = int(input("Digite a sua idade: ")) + +# Calculando o ano de nascimento aproximado baseado no ano atual (2026) +ano_nascimento = 2026 - idade + +# Exibindo a mensagem personalizada +print(f"Olá, {nome}! Você tem {idade} anos e nasceu por volta de {ano_nascimento}.") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 10.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 10.py" new file mode 100644 index 0000000..6295efc --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 10.py" @@ -0,0 +1,16 @@ +# Dados do problema +capacidade_caminhao = 850 +peso_caixa = 32 + +# 1. Quantas caixas completas cabem no caminhão (Divisão Inteira) +caixas_completas = capacidade_caminhao // peso_caixa + +# 2. O peso restante que não completa uma nova caixa (Resto da Divisão) +peso_restante = capacidade_caminhao % peso_caixa + +# Exibindo os resultados com mensagens claras +print(f"Capacidade total do caminhão: {capacidade_caminhao} kg") +print(f"Peso de cada caixa: {peso_caixa} kg") +print("-" * 40) +print(f"O caminhão consegue transportar {caixas_completas} caixas completas.") +print(f"Ficarão sobrando {peso_restante} kg de capacidade que não completam uma caixa.") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 11.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 11.py" new file mode 100644 index 0000000..0c0daff --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 11.py" @@ -0,0 +1,19 @@ +# Armazenando os dados da funcionária +nome = "Mariana Souza" +cargo = "Analista de Dados" +salario = 7850.50 +anos_empresa = 3 + +# Criando a string do salário formatada no padrão brasileiro (R$ X.XXX,XX) +# Primeiro limitamos a duas casas decimais, depois trocamos o ponto da máquina pela vírgula +salario_formatado = f"R$ {salario:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") + +# Exibindo a ficha formatada profissionalmente +print("=============================") +print(" FICHA DO FUNCIONÁRIO ") +print("=============================") +print(f"Nome : {nome}") +print(f"Cargo : {cargo}") +print(f"Salário: {salario_formatado}") +print(f"Tempo : {anos_empresa} ano(s) de empresa") +print("=============================") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 12.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 12.py" new file mode 100644 index 0000000..7a8215d --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 12.py" @@ -0,0 +1,22 @@ +# Solicitando os dados do usuário +peso = float(input("Digite seu peso em kg (ex: 70.5): ")) +altura = float(input("Digite sua altura em metros (ex: 1.75): ")) + +# Calculando o IMC +# O operador ** é usado para elevar ao quadrado (altura²) +imc = peso / (altura ** 2) + +# Exibindo o resultado formatado com 2 casas decimais +print("-" * 40) +print(f"Seu IMC atual é: {imc:.2f}") +print("-" * 40) + +# Uma breve mensagem informativa baseada na tabela da OMS +if imc < 18.5: + print("Classificação: Abaixo do peso ideal.") +elif imc < 25.0: + print("Classificação: Peso normal (Parabéns!).") +elif imc < 30.0: + print("Classificacão: Sobrepeso.") +else: + print("Classificação: Obesidade.") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 13 .py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 13 .py" new file mode 100644 index 0000000..aaca64d --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 13 .py" @@ -0,0 +1,24 @@ +# Solicitando e armazenando os dois números +num1 = float(input("Digite o primeiro número: ")) +num2 = float(input("Digite o segundo número: ")) + +print("\n" + "="*40) +print(" RESULTADOS LÓGICOS") +print("="*40) + +# 1. O primeiro número é maior que o segundo? +print(f"O primeiro é maior que o segundo? {num1 > num2}") + +# 2. Os dois são iguais? +print(f"Os dois são iguais? {num1 == num2}") + +# 3. Ambos são maiores que zero? (Operador AND) +print(f"Ambos são maiores que zero? {num1 > 0 and num2 > 0}") + +# 4. Pelo menos um é maior que 100? (Operador OR) +print(f"Pelo menos um é maior que 100? {num1 > 100 or num2 > 100}") + +# 5. O primeiro é diferente de zero? (Operador de diferença) +print(f"O primeiro é diferente de zero? {num1 != 0}") + +print("="*40) \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 14.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 14.py" new file mode 100644 index 0000000..c430088 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 14.py" @@ -0,0 +1,27 @@ +# Código Original do Exercício: +# a = 10 +# b = 20 +# a = b +# b = a +# print(a, b) # Erro: imprime 20 20 + +print("======= FORMA 1: VARIÁVEL AUXILIAR =======") +a = 10 +b = 20 + +# Correção usando o terceiro "copo" para guardar o valor +auxiliar = a +a = b +b = auxiliar + +print(a, b) # Resultado: 20 10 + + +print("\n======= FORMA 2: MÉTODO IDIOMÁTICO (PYTHON) =======") +a = 10 +b = 20 + +# Correção usando a atribuição múltipla nativa do Python +a, b = b, a + +print(a, b) # Resultado: 20 10 \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 15.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 15.py" new file mode 100644 index 0000000..bf6ed82 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 15.py" @@ -0,0 +1,22 @@ +# 1. Solicitando o valor da compra ao usuário +valor_compra = float(input("Digite o valor total da compra (R$): ")) + +# 2. Calculando o desconto (10%) e o valor final +valor_desconto = valor_compra * 0.10 +valor_final = valor_compra - valor_desconto + +# 3. Formatando os valores para o padrão de moeda brasileiro (R$ X.XXX,XX) +# Usamos a formatação de f-string e o .replace() para ajustar os pontos e vírgulas +compra_pt = f"R$ {valor_compra:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") +desconto_pt = f"R$ {valor_desconto:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") +final_pt = f"R$ {valor_final:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") + +# 4. Exibindo o cupom de desconto formatado na tela +print("\n" + "="*35) +print(" EXTRATO DA COMPRA") +print("="*35) +print(f"Valor Original : {compra_pt}") +print(f"Desconto (10%) : {desconto_pt}") +print("-" * 35) +print(f"Valor Final : {final_pt}") +print("="*35) \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 16.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 16.py" new file mode 100644 index 0000000..42f7536 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 16.py" @@ -0,0 +1,18 @@ +import math + +# Definindo as coordenadas dos pontos P1 e P2 +x1, y1 = 3, 4 +x2, y2 = 7, 1 + +# Aplicando a fórmula passo a passo: d = √((x2 - x1)² + (y2 - y1)²) +diferenca_x = x2 - x1 +diferenca_y = y2 - y1 + +# Calculando a distância usando math.sqrt para a raiz quadrada +distancia = math.sqrt((diferenca_x ** 2) + (diferenca_y ** 2)) + +# Exibindo os dados e o resultado formatado com 4 casas decimais +print(f"Ponto 1: ({x1}, {y1})") +print(f"Ponto 2: ({x2}, {y2})") +print("-" * 40) +print(f"A distância entre P1 e P2 é: {distancia:.4f}") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 17.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 17.py" new file mode 100644 index 0000000..1b41949 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 17.py" @@ -0,0 +1,23 @@ +# 1. Solicitando os dados da Nota Fiscal via input() +descricao = input("Descrição do produto: ") +quantidade = int(input("Quantidade comprada: ")) +preco_unitario = float(input("Preço unitário (R$): ")) + +# 2. Realizando os cálculos matemáticos +subtotal = quantidade * preco_unitario +imposto = subtotal * 0.12 +total = subtotal + imposto + +# 3. Função rápida para formatar os números no padrão de moeda brasileiro (R$ X.XXX,XX) +def formatar_real(valor): + return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") + +# 4. Exibindo a Nota Fiscal perfeitamente formatada +print("\n===== NOTA FISCAL =====") +print(f"Produto : {descricao}") +print(f"Quantidade: {quantidade} unidade(s)") +print(f"Preço Unit: {formatar_real(preco_unitario)}") +print(f"Subtotal : {formatar_real(subtotal)}") +print(f"Imposto : {formatar_real(imposto)} (12%)") +print(f"Total : {formatar_real(total)}") +print("=======================") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 18 .py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 18 .py" new file mode 100644 index 0000000..d030f66 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 18 .py" @@ -0,0 +1,25 @@ +# 1. Solicitando a distância em metros +metros = float(input("Digite a distância em metros (m): ")) + +# 2. Realizando os cálculos de conversão +km = metros / 1000 +cm = metros * 100 +mm = metros * 1000 +polegadas = metros * 39.3701 +pes = metros * 3.28084 + +# 3. Exibindo o cabeçalho da tabela +print("\n" + "=" * 35) +print(f"CONVERSÃO DE: {metros:.2f} METROS") +print("-" * 35) +# O símbolo < alinha à esquerda e > alinha à direita. O número define a largura. +print(f"{'Unidade':<15} | {'Valor Convertido':>15}") +print("-" * 35) + +# 4. Exibindo as linhas da tabela perfeitamente alinhadas +print(f"{'Quilômetros':<15} | {km:>15.4f} km") +print(f"{'Centímetros':<15} | {cm:>15.2f} cm") +print(f"{'Milímetros':<15} | {mm:>15.2f} mm") +print(f"{'Polegadas':<15} | {polegadas:>15.2f} in") +print(f"{'Pés':<15} | {pes:>15.2f} ft") +print("=" * 35) \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 19.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 19.py" new file mode 100644 index 0000000..61b4cd2 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 19.py" @@ -0,0 +1,25 @@ +# E-mail original mal formatado +email_bruto = " joao.silva@EMPRESA.com.br " + +# 1. Removendo espaços extras no início e no fim +email_limpo = email_bruto.strip() + +# 2. Convertendo todo o texto para letras minúsculas +email_normalizado = email_limpo.lower() + +# 3. Extraindo o usuário e o domínio +# O método .split("@") divide a string em duas partes onde estiver o caractere "@" +# gerando uma lista: ['joao.silva', 'empresa.com.br'] +partes = email_normalizado.split("@") +usuario = partes[0] +dominio = partes[1] + +# 4. Exibindo os resultados com etiquetas claras +print("========== ANÁLISE DE E-MAIL ==========") +print(f"E-mail Original : '{email_bruto}'") +print(f"E-mail Limpo : '{email_limpo}'") +print(f"E-mail Normalizado: '{email_normalizado}'") +print("-" * 39) +print(f"Usuário Extraído : {usuario}") +print(f"Domínio Extraído : {dominio}") +print("=======================================") \ No newline at end of file diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 20.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 20.py" new file mode 100644 index 0000000..911c1cf --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 20.py" @@ -0,0 +1,18 @@ +# Solicitar dados ao usuário +capital_inicial = float(input("Digite o capital inicial (R$): ")) +taxa_juros = float(input("Digite a taxa de juros ao mês (%): ")) / 100 +periodo = int(input("Digite o período em meses: ")) + +# Cálculo do montante +montante = capital_inicial * (1 + taxa_juros * periodo) + +# Juros totais +juros_totais = montante - capital_inicial + +# Exibição formatada +print("\n--- Resultado da Simulação ---") +print(f"Capital inicial: R$ {capital_inicial:,.2f}") +print(f"Taxa de juros ao mês: {taxa_juros*100:.2f}%") +print(f"Período: {periodo} meses") +print(f"Juros totais: R$ {juros_totais:,.2f}") +print(f"Montante final: R$ {montante:,.2f}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 21.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 21.py" new file mode 100644 index 0000000..2ce4860 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 21.py" @@ -0,0 +1,21 @@ +def saudacao(nome): + """ + Retorna uma mensagem de boas-vindas personalizada. + + Args: + nome (str): Nome da pessoa a ser saudada. + + Returns: + str: String com a mensagem de boas-vindas. + + Example: + >>> saudacao("Ana") + 'Olá, Ana! Seja bem-vinda ao curso.' + """ + return f"Olá, {nome}! Seja bem-vinda ao curso." + + +# Chamando a função com 3 nomes diferentes +print(saudacao("Ana")) +print(saudacao("Carlos")) +print(saudacao("Mariana")) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 22.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 22.py" new file mode 100644 index 0000000..ee3c8fa --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 22.py" @@ -0,0 +1,39 @@ +def calcular_area(largura: float, altura: float) -> float: + """ + Calcula a área de um retângulo. + + Args: + largura (float): Largura do retângulo. + altura (float): Altura do retângulo. + + Returns: + float: Área calculada. + """ + return largura * altura + + +def formatar_nome(nome: str, sobrenome: str) -> str: + """ + Formata o nome completo com inicial maiúscula. + + Args: + nome (str): Primeiro nome. + sobrenome (str): Sobrenome. + + Returns: + str: Nome completo formatado. + """ + return f"{nome} {sobrenome}".title() + + +def eh_maior_de_idade(idade: int) -> bool: + """ + Verifica se a pessoa é maior de idade. + + Args: + idade (int): Idade da pessoa. + + Returns: + bool: True se for maior de idade, False caso contrário. + """ + return idade >= 18 diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 23 .py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 23 .py" new file mode 100644 index 0000000..352a849 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 23 .py" @@ -0,0 +1,26 @@ +import json + +# Dicionário inicial +aluno = { + "nome": "Pedro Henrique", + "idade": 22, + "curso": "Full Stack", + "ativo": True, + "notas": [8.5, 9.0, 7.5] +} + +# Converter para JSON com indentação de 2 espaços +aluno_json = json.dumps(aluno, indent=2) +print("--- JSON Gerado ---") +print(aluno_json) + +# Converter de volta para dicionário +aluno_dict = json.loads(aluno_json) + +# Calcular média das notas +media_notas = sum(aluno_dict["notas"]) / len(aluno_dict["notas"]) + +# Exibir nome e média +print("\n--- Resultado ---") +print(f"Nome: {aluno_dict['nome']}") +print(f"Média das notas: {media_notas:.2f}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 24.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 24.py" new file mode 100644 index 0000000..c0b0f61 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 24.py" @@ -0,0 +1,31 @@ +def converter_moeda(valor_brl: float) -> tuple[float, float]: + """ + Converte um valor em reais (BRL) para dólar (USD) e euro (EUR). + + Args: + valor_brl (float): Valor em reais a ser convertido. + + Returns: + tuple[float, float]: Uma tupla contendo: + - valor_usd (float): Valor convertido em dólares. + - valor_eur (float): Valor convertido em euros. + + Example: + >>> converter_moeda(100.0) + (19.42, 17.92) + """ + cotacao_usd = 5.15 + cotacao_eur = 5.58 + + valor_usd = valor_brl / cotacao_usd + valor_eur = valor_brl / cotacao_eur + + return valor_usd, valor_eur + + +# Testando a função +valor = 100.0 +usd, eur = converter_moeda(valor) +print(f"Valor em BRL: R$ {valor:.2f}") +print(f"Convertido em USD: $ {usd:.2f}") +print(f"Convertido em EUR: € {eur:.2f}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 25.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 25.py" new file mode 100644 index 0000000..f05c684 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 25.py" @@ -0,0 +1,28 @@ +import json + +# Criando o dicionário de produto +produto = { + "id": 101, + "nome": "Smartphone X", + "preco": 1999.90, + "estoque": 35, + "disponivel": True, + "categorias": ["Eletrônicos", "Celulares", "Promoção"] +} + +# Salvando em produto.json +with open("produto.json", "w", encoding="utf-8") as f: + json.dump(produto, f, indent=2, ensure_ascii=False) + +# Lendo o arquivo de volta +with open("produto.json", "r", encoding="utf-8") as f: + produto_lido = json.load(f) + +# Exibindo cada campo com etiqueta +print("--- Dados do Produto ---") +print(f"ID: {produto_lido['id']}") +print(f"Nome: {produto_lido['nome']}") +print(f"Preço: R$ {produto_lido['preco']:.2f}") +print(f"Estoque: {produto_lido['estoque']} unidades") +print(f"Disponível: {'Sim' if produto_lido['disponivel'] else 'Não'}") +print(f"Categorias: {', '.join(produto_lido['categorias'])}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 26.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 26.py" new file mode 100644 index 0000000..9d07fd5 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 26.py" @@ -0,0 +1,32 @@ +from typing import Optional, Union, Dict + +def buscar_usuario(id: int, nome: Optional[str]) -> Optional[Dict[str, Union[int, str]]]: + """ + Busca um usuário pelo ID e nome. + + Args: + id (int): Identificador único do usuário. + nome (Optional[str]): Nome do usuário. Pode ser uma string ou None. + + Returns: + Optional[Dict[str, Union[int, str]]]: + - Um dicionário com os dados do usuário se o ID for positivo. + - None se o ID for negativo. + + Example: + >>> buscar_usuario(1, "Maria") + {'id': 1, 'nome': 'Maria'} + + >>> buscar_usuario(-5, "João") + None + """ + if id < 0: + return None + + return {"id": id, "nome": nome if nome is not None else "Desconhecido"} + + +# Testando a função +print(buscar_usuario(1, "Maria")) # {'id': 1, 'nome': 'Maria'} +print(buscar_usuario(2, None)) # {'id': 2, 'nome': 'Desconhecido'} +print(buscar_usuario(-5, "João")) # None diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 27.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 27.py" new file mode 100644 index 0000000..d9fd209 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 27.py" @@ -0,0 +1,29 @@ +import json + +# Lista de funcionários +funcionarios = [ + {"nome": "Alice", "carga": "40h", "salario": 3500.00, "departamento": "TI"}, + {"nome": "Bruno", "carga": "30h", "salario": 2800.00, "departamento": "Marketing"}, + {"nome": "Carla", "carga": "40h", "salario": 4200.00, "departamento": "Financeiro"} +] + +# Salvando em funcionarios.json +with open("funcionarios.json", "w", encoding="utf-8") as f: + json.dump(funcionarios, f, indent=2, ensure_ascii=False) + +# Lendo o arquivo de volta +with open("funcionarios.json", "r", encoding="utf-8") as f: + funcionarios_lidos = json.load(f) + +# Exibindo em tabela formatada +print("--- Funcionários ---") +print(f"{'Nome':<10} {'Carga':<6} {'Salário':<10} {'Departamento':<12}") +print("-" * 40) +for f in funcionarios_lidos: + print(f"{f['nome']:<10} {f['carga']:<6} R$ {f['salario']:<8.2f} {f['departamento']:<12}") + +# Calculando salário médio +salarios = [f["salario"] for f in funcionarios_lidos] +media_salario = sum(salarios) / len(salarios) + +print("\nSalário médio da equipe: R$ {:.2f}".format(media_salario)) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 28.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 28.py" new file mode 100644 index 0000000..11d8716 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 28.py" @@ -0,0 +1,29 @@ +def calcular_juros_compostos(capital: float, taxa: float, periodo: int) -> float: + """ + Calcula o montante final utilizando juros compostos. + + Args: + capital (float): Valor inicial investido. Deve ser não negativo. + taxa (float): Taxa de juros em porcentagem (%). Deve ser não negativa. + periodo (int): Número de períodos (meses, anos, etc.) de aplicação. + + Returns: + float: Montante final após a aplicação dos juros compostos. + + Raises: + ValueError: Se o capital ou a taxa forem negativos. + + Example: + >>> calcular_juros_compostos(1000.0, 5.0, 12) + 1795.8563260221301 + """ + if capital < 0: + raise ValueError("O capital não pode ser negativo.") + if taxa < 0: + raise ValueError("A taxa de juros não pode ser negativa.") + + return capital * (1 + taxa / 100) ** periodo + + +# Testando a função +print(calcular_juros_compostos(1000.0, 5.0, 12)) # Saída: 1795.8563260221301 diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 29.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 29.py" new file mode 100644 index 0000000..2b39888 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 29.py" @@ -0,0 +1,33 @@ +import json + +# String JSON recebida da API +resposta_api = """ +{ + "cidade": "Manaus", + "pais": "BR", + "temperatura": { + "atual": 32.4, + "minima": 26.1, + "maxima": 35.8, + "sensacao": 38.2 + }, + "umidade": 87, + "condicao": "Parcialmente nublado", + "vento": { "velocidade_kmh": 12, "direcao": "NE" }, + "atualizado_em": "2025-01-15T14:30:00" +} +""" + +# Converter JSON para dicionário +dados = json.loads(resposta_api) + +# Criar boletim meteorológico +print("--- Boletim Meteorológico Ambiental ---") +print(f"Cidade: {dados['cidade']} - País: {dados['pais']}") +print(f"Temperatura atual: {dados['temperatura']['atual']} °C") +print(f"Mínima: {dados['temperatura']['minima']} °C | Máxima: {dados['temperatura']['maxima']} °C") +print(f"Sensação térmica: {dados['temperatura']['sensacao']} °C") +print(f"Umidade relativa: {dados['umidade']}%") +print(f"Condição do tempo: {dados['condicao']}") +print(f"Vento: {dados['vento']['velocidade_kmh']} km/h - Direção {dados['vento']['direcao']}") +print(f"Última atualização: {dados['atualizado_em']}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 30.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 30.py" new file mode 100644 index 0000000..76c3ddc --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 30.py" @@ -0,0 +1,32 @@ +import json +from typing import TypedDict, List + +class ItemPedido(TypedDict): + produto: str + quantidade: int + preco_unitario: float + +class Pedido(TypedDict): + id_pedido: int + cliente: str + itens: List[ItemPedido] + status: str + +# Criando um pedido de exemplo +pedido_exemplo: Pedido = { + "id_pedido": 2025, + "cliente": "João Silva", + "itens": [ + {"produto": "Notebook", "quantidade": 1, "preco_unitario": 3500.00}, + {"produto": "Mouse Gamer", "quantidade": 2, "preco_unitario": 150.00}, + {"produto": "Headset", "quantidade": 1, "preco_unitario": 300.00} + ], + "status": "Em processamento" +} + +# Serializando para JSON +pedido_json = json.dumps(pedido_exemplo, indent=2, ensure_ascii=False) + +# Exibindo JSON formatado +print("--- Pedido em JSON ---") +print(pedido_json) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 31.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 31.py" new file mode 100644 index 0000000..4066174 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 31.py" @@ -0,0 +1,34 @@ +import json + +# Dicionários de sistemas diferentes +cadastro = {"id": 1042, "nome": "Fernanda Costa", "email": "fernanda@empresa.com"} +perfil = { + "id": 1042, + "cargo": "Engenheira de Software", + "nivel": "Senior", + "salario": 12500.00, + "habilidades": ["Python", "Django", "PostgreSQL"] +} + +# Mesclando os dicionários +funcionario_completo = {**cadastro, **perfil} + +# Salvando em funcionario.json +with open("funcionario.json", "w", encoding="utf-8") as f: + json.dump(funcionario_completo, f, indent=2, ensure_ascii=False) + +# Lendo o arquivo de volta +with open("funcionario.json", "r", encoding="utf-8") as f: + funcionario_lido = json.load(f) + +# Exibindo formatado +print("--- Dados do Funcionário ---") +print(f"ID: {funcionario_lido['id']}") +print(f"Nome: {funcionario_lido['nome']}") +print(f"Email: {funcionario_lido['email']}") +print(f"Cargo: {funcionario_lido['cargo']}") +print(f"Nível: {funcionario_lido['nivel']}") +print(f"Salário: R$ {funcionario_lido['salario']:.2f}") +print("Habilidades:") +for i, habilidade in enumerate(funcionario_lido["habilidades"], start=1): + print(f" {i}. {habilidade}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 32.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 32.py" new file mode 100644 index 0000000..bda8c14 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 32.py" @@ -0,0 +1,68 @@ +from typing import Dict, List, Any + +def validar_cadastro(dados: Dict[str, Any]) -> Dict[str, List[str]]: + """ + Valida os dados de cadastro de um usuário. + + Args: + dados (Dict[str, Any]): Dicionário contendo os campos do cadastro. + Campos esperados: + - nome (str): Nome do usuário, mínimo 3 caracteres. + - email (str): Deve conter '@' e '.'. + - idade (int): Deve estar entre 18 e 120 anos. + - cpf (str): Deve conter exatamente 11 dígitos numéricos. + + Returns: + Dict[str, List[str]]: Dicionário com duas listas: + - "valido": Lista de campos válidos. + - "erros": Lista de mensagens de erro para campos inválidos. + + Example: + >>> validar_cadastro({"nome": "Ana", "email": "ana@email.com", "idade": 25, "cpf": "12345678901"}) + {'valido': ['nome', 'email', 'idade', 'cpf'], 'erros': []} + + >>> validar_cadastro({"nome": "Jo", "email": "joemail.com", "idade": 15, "cpf": "123"}) + {'valido': [], 'erros': ['Nome deve ter pelo menos 3 caracteres.', + 'Email inválido.', + 'Idade deve estar entre 18 e 120.', + 'CPF deve conter 11 dígitos numéricos.']} + """ + resultado = {"valido": [], "erros": []} + + # Validação do nome + if isinstance(dados.get("nome"), str) and len(dados["nome"]) >= 3: + resultado["valido"].append("nome") + else: + resultado["erros"].append("Nome deve ter pelo menos 3 caracteres.") + + # Validação do email + email = dados.get("email", "") + if isinstance(email, str) and "@" in email and "." in email: + resultado["valido"].append("email") + else: + resultado["erros"].append("Email inválido.") + + # Validação da idade + idade = dados.get("idade") + if isinstance(idade, int) and 18 <= idade <= 120: + resultado["valido"].append("idade") + else: + resultado["erros"].append("Idade deve estar entre 18 e 120.") + + # Validação do CPF + cpf = dados.get("cpf", "") + if isinstance(cpf, str) and cpf.isdigit() and len(cpf) == 11: + resultado["valido"].append("cpf") + else: + resultado["erros"].append("CPF deve conter 11 dígitos numéricos.") + + return resultado + + +# Testando com dados válidos +dados_validos = {"nome": "Ana", "email": "ana@email.com", "idade": 25, "cpf": "12345678901"} +print(validar_cadastro(dados_validos)) + +# Testando com dados inválidos +dados_invalidos = {"nome": "Jo", "email": "joemail.com", "idade": 15, "cpf": "123"} +print(validar_cadastro(dados_invalidos)) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 33 .py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 33 .py" new file mode 100644 index 0000000..1977f73 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 33 .py" @@ -0,0 +1,94 @@ +import json +from datetime import datetime +from typing import List, Dict, Any + +def registrar_evento(arquivo: str, nivel: str, mensagem: str) -> None: + """ + Registra um evento em um arquivo de log JSON. + + Args: + arquivo (str): Nome do arquivo de log. + nivel (str): Nível do evento ("INFO", "WARNING", "ERROR"). + mensagem (str): Mensagem descritiva do evento. + + Returns: + None + + Example: + >>> registrar_evento("logs.json", "INFO", "Sistema iniciado") + """ + evento = { + "timestamp": datetime.now().isoformat(), + "nivel": nivel, + "mensagem": mensagem + } + + try: + with open(arquivo, "r", encoding="utf-8") as f: + logs = json.load(f) + except FileNotFoundError: + logs = [] + + logs.append(evento) + + with open(arquivo, "w", encoding="utf-8") as f: + json.dump(logs, f, indent=2, ensure_ascii=False) + + +def ler_logs(arquivo: str) -> List[Dict[str, Any]]: + """ + Lê todos os logs de um arquivo JSON. + + Args: + arquivo (str): Nome do arquivo de log. + + Returns: + List[Dict[str, Any]]: Lista de eventos registrados. + + Example: + >>> ler_logs("logs.json") + [{'timestamp': '2025-01-15T14:30:00', 'nivel': 'INFO', 'mensagem': 'Sistema iniciado'}] + """ + with open(arquivo, "r", encoding="utf-8") as f: + return json.load(f) + + +def filtrar_por_nivel(logs: List[Dict[str, Any]], nivel: str) -> List[Dict[str, Any]]: + """ + Filtra os logs por nível específico. + + Args: + logs (List[Dict[str, Any]]): Lista de eventos registrados. + nivel (str): Nível desejado ("INFO", "WARNING", "ERROR"). + + Returns: + List[Dict[str, Any]]: Lista de eventos filtrados pelo nível. + + Example: + >>> filtrar_por_nivel(logs, "ERROR") + [{'timestamp': '2025-01-15T14:35:00', 'nivel': 'ERROR', 'mensagem': 'Falha crítica'}] + """ + return [log for log in logs if log["nivel"] == nivel] + + +# --- Demonstração --- +arquivo_log = "logs.json" + +# Registrando 5 eventos +registrar_evento(arquivo_log, "INFO", "Sistema iniciado") +registrar_evento(arquivo_log, "WARNING", "Uso de memória elevado") +registrar_evento(arquivo_log, "INFO", "Usuário logado") +registrar_evento(arquivo_log, "ERROR", "Falha na conexão com banco de dados") +registrar_evento(arquivo_log, "ERROR", "Timeout na requisição de API") + +# Lendo todos os logs +todos_logs = ler_logs(arquivo_log) +print("\n--- Todos os Logs ---") +for log in todos_logs: + print(f"[{log['timestamp']}] {log['nivel']}: {log['mensagem']}") + +# Filtrando apenas erros +erros = filtrar_por_nivel(todos_logs, "ERROR") +print("\n--- Logs de ERRO ---") +for log in erros: + print(f"[{log['timestamp']}] {log['nivel']}: {log['mensagem']}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 34.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 34.py" new file mode 100644 index 0000000..9c6293e --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 34.py" @@ -0,0 +1,72 @@ +import json +from typing import Any, Dict + +# Criando config.json +config_data = { + "app": { + "nome": "MeuSistema", + "versao": "1.0.0" + }, + "banco": { + "host": "localhost", + "porta": 5432, + "usuario": "admin", + "senha": "123456" + }, + "email": { + "servidor": "smtp.empresa.com", + "porta": 587, + "usuario": "suporte@empresa.com" + } +} + +# Salvando em config.json +with open("config.json", "w", encoding="utf-8") as f: + json.dump(config_data, f, indent=2, ensure_ascii=False) + + +def carregar_config(caminho: str) -> Dict[str, Any]: + """ + Carrega o arquivo de configuração JSON. + + Args: + caminho (str): Caminho do arquivo JSON. + + Returns: + Dict[str, Any]: Dicionário com os dados da configuração. + """ + with open(caminho, "r", encoding="utf-8") as f: + return json.load(f) + + +def obter_valor(config: Dict[str, Any], chave: str, padrao: Any = None) -> Any: + """ + Obtém um valor de configuração usando notação de ponto para chaves aninhadas. + + Args: + config (Dict[str, Any]): Dicionário de configuração. + chave (str): Chave no formato "nivel.subnivel". + padrao (Any, opcional): Valor padrão caso a chave não exista. + + Returns: + Any: Valor encontrado ou o valor padrão. + """ + partes = chave.split(".") + valor = config + for parte in partes: + if isinstance(valor, dict) and parte in valor: + valor = valor[parte] + else: + return padrao + return valor + + +# --- Demonstração --- +config = carregar_config("config.json") + +print("--- Demonstração de Configuração ---") +print("1.", obter_valor(config, "app.nome")) +print("2.", obter_valor(config, "app.versao")) +print("3.", obter_valor(config, "banco.host")) +print("4.", obter_valor(config, "email.usuario")) +print("5.", obter_valor(config, "email.senha", padrao="(não definido)")) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 35.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 35.py" new file mode 100644 index 0000000..71a7791 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 35.py" @@ -0,0 +1,68 @@ +import json +from typing import List, Dict, Any + +vendas_json = """ +[ + {"mes": "Janeiro", "produto": "Notebook", "quantidade": 45, "valor_unit": 3200.00}, + {"mes": "Janeiro", "produto": "Mouse", "quantidade": 120, "valor_unit": 89.90}, + {"mes": "Fevereiro","produto": "Notebook", "quantidade": 38, "valor_unit": 3200.00}, + {"mes": "Fevereiro","produto": "Teclado", "quantidade": 75, "valor_unit": 149.90}, + {"mes": "Março", "produto": "Monitor", "quantidade": 30, "valor_unit": 1200.00}, + {"mes": "Março", "produto": "Mouse", "quantidade": 200,"valor_unit": 89.90} +] +""" + +# Converter JSON para lista de dicionários +vendas: List[Dict[str, Any]] = json.loads(vendas_json) + + +def calcular_total_mes(vendas: List[Dict[str, Any]], mes: str) -> float: + """ + Calcula o total de vendas em um determinado mês. + + Args: + vendas (List[Dict[str, Any]]): Lista de registros de vendas. + mes (str): Nome do mês a ser analisado. + + Returns: + float: Valor total das vendas no mês. + """ + return sum(v["quantidade"] * v["valor_unit"] for v in vendas if v["mes"] == mes) + + +def produto_mais_vendido(vendas: List[Dict[str, Any]]) -> str: + """ + Identifica o produto mais vendido em quantidade. + + Args: + vendas (List[Dict[str, Any]]): Lista de registros de vendas. + + Returns: + str: Nome do produto mais vendido. + """ + totais: Dict[str, int] = {} + for v in vendas: + totais[v["produto"]] = totais.get(v["produto"], 0) + v["quantidade"] + return max(totais, key=totais.get) + + +def receita_total(vendas: List[Dict[str, Any]]) -> float: + """ + Calcula a receita total de todas as vendas. + + Args: + vendas (List[Dict[str, Any]]): Lista de registros de vendas. + + Returns: + float: Receita total. + """ + return sum(v["quantidade"] * v["valor_unit"] for v in vendas) + + +# --- Demonstração --- +print("--- Relatório de Vendas ---") +print(f"Total em Janeiro: R$ {calcular_total_mes(vendas, 'Janeiro'):.2f}") +print(f"Total em Fevereiro: R$ {calcular_total_mes(vendas, 'Fevereiro'):.2f}") +print(f"Total em Março: R$ {calcular_total_mes(vendas, 'Março'):.2f}") +print(f"Produto mais vendido: {produto_mais_vendido(vendas)}") +print(f"Receita total: R$ {receita_total(vendas):.2f}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 36.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 36.py" new file mode 100644 index 0000000..12c76ec --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 36.py" @@ -0,0 +1,106 @@ +import json +from typing import List, Dict, Optional + +ARQUIVO = "contatos.json" + + +def adicionar_contato(nome: str, telefone: str, email: str) -> None: + """ + Adiciona um contato à agenda. + + Args: + nome (str): Nome do contato. + telefone (str): Telefone do contato. + email (str): Email do contato. + + Returns: + None + """ + try: + with open(ARQUIVO, "r", encoding="utf-8") as f: + contatos = json.load(f) + except FileNotFoundError: + contatos = [] + + contatos.append({"nome": nome, "telefone": telefone, "email": email}) + + with open(ARQUIVO, "w", encoding="utf-8") as f: + json.dump(contatos, f, indent=2, ensure_ascii=False) + + +def listar_contatos() -> List[Dict[str, str]]: + """ + Lista todos os contatos da agenda. + + Returns: + List[Dict[str, str]]: Lista de contatos. + """ + try: + with open(ARQUIVO, "r", encoding="utf-8") as f: + return json.load(f) + except FileNotFoundError: + return [] + + +def buscar_contato(nome: str) -> Optional[Dict[str, str]]: + """ + Busca um contato pelo nome. + + Args: + nome (str): Nome do contato a ser buscado. + + Returns: + Optional[Dict[str, str]]: Contato encontrado ou None. + """ + contatos = listar_contatos() + for contato in contatos: + if contato["nome"].lower() == nome.lower(): + return contato + return None + + +def remover_contato(nome: str) -> bool: + """ + Remove um contato pelo nome. + + Args: + nome (str): Nome do contato a ser removido. + + Returns: + bool: True se o contato foi removido, False caso contrário. + """ + contatos = listar_contatos() + novos_contatos = [c for c in contatos if c["nome"].lower() != nome.lower()] + + if len(novos_contatos) == len(contatos): + return False # não encontrou + + with open(ARQUIVO, "w", encoding="utf-8") as f: + json.dump(novos_contatos, f, indent=2, ensure_ascii=False) + return True + + +# --- Demonstração --- +print("--- Agenda de Contatos ---") + +# 1. Adicionar 3 contatos +adicionar_contato("Alice", "55999999999", "alice@email.com") +adicionar_contato("Bruno", "55888888888", "bruno@email.com") +adicionar_contato("Carla", "55777777777", "carla@email.com") + +# 2. Listar contatos +print("\nLista de contatos:") +for c in listar_contatos(): + print(f"{c['nome']} - {c['telefone']} - {c['email']}") + +# 3. Buscar um contato +print("\nBuscando contato 'Bruno':") +print(buscar_contato("Bruno")) + +# 4. Remover um contato +print("\nRemovendo contato 'Alice':") +print("Removido?" , remover_contato("Alice")) + +print("\nLista atualizada:") +for c in listar_contatos(): + print(f"{c['nome']} - {c['telefone']} - {c['email']}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 37 .py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 37 .py" new file mode 100644 index 0000000..a88abed --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 37 .py" @@ -0,0 +1,68 @@ +import json +from datetime import datetime +from typing import List, Dict + +class Produto: + def __init__(self, nome: str, preco: float, criado_em: datetime): + self.nome = nome + self.preco = preco + self.criado_em = criado_em + + def __repr__(self) -> str: + return f"Produto(nome={self.nome}, preco={self.preco}, criado_em={self.criado_em.isoformat()})" + + +def produto_para_dict(produto: Produto) -> Dict[str, str | float]: + """ + Converte um objeto Produto em dicionário serializável para JSON. + + Args: + produto (Produto): Objeto Produto. + + Returns: + dict: Dicionário com os dados do produto. + """ + return { + "nome": produto.nome, + "preco": produto.preco, + "criado_em": produto.criado_em.isoformat() + } + + +def dict_para_produto(dados: Dict[str, str | float]) -> Produto: + """ + Converte um dicionário em objeto Produto. + + Args: + dados (dict): Dicionário com os dados do produto. + + Returns: + Produto: Objeto Produto reconstruído. + """ + return Produto( + nome=dados["nome"], + preco=dados["preco"], + criado_em=datetime.fromisoformat(dados["criado_em"]) + ) + + +# --- Demonstração --- +produtos: List[Produto] = [ + Produto("Notebook", 3500.00, datetime.now()), + Produto("Mouse Gamer", 150.00, datetime.now()), + Produto("Monitor", 1200.00, datetime.now()) +] + +# Serializar lista de produtos para JSON +produtos_dict = [produto_para_dict(p) for p in produtos] +produtos_json = json.dumps(produtos_dict, indent=2, ensure_ascii=False) +print("--- Produtos Serializados ---") +print(produtos_json) + +# Desserializar de volta para objetos Produto +produtos_lidos = json.loads(produtos_json) +produtos_objetos = [dict_para_produto(d) for d in produtos_lidos] + +print("\n--- Produtos Desserializados ---") +for p in produtos_objetos: + print(p) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 38.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 38.py" new file mode 100644 index 0000000..badd473 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 38.py" @@ -0,0 +1,43 @@ +from typing import TypeVar, List, Callable + +T = TypeVar('T') # Tipo de entrada +R = TypeVar('R') # Tipo de saída + +def aplicar_transformacao(dados: List[T], funcao: Callable[[T], R]) -> List[R]: + """ + Aplica uma função de transformação a cada elemento de uma lista. + + Args: + dados (List[T]): Lista de elementos de tipo genérico T. + funcao (Callable[[T], R]): Função que recebe um elemento T e retorna R. + + Returns: + List[R]: Lista de elementos transformados do tipo R. + + Example: + >>> aplicar_transformacao([1, 2, 3], lambda x: x * 2) + [2, 4, 6] + """ + return [funcao(item) for item in dados] + + +# --- Demonstração --- + +# 1. Lista de strings → confidenciais (ex: mascarar nomes) +nomes = ["Alice", "Bruno", "Carla"] +nomes_confidenciais = aplicar_transformacao(nomes, lambda x: "***") +print("Strings confidenciais:", nomes_confidenciais) + +# 2. Lista de números (carros alegóricos) → arredondados com 2 casas decimais +valores = [1234.5678, 9876.54321, 456.789] +valores_arredondados = aplicar_transformacao(valores, lambda x: round(x, 2)) +print("Valores arredondados:", valores_arredondados) + +# 3. Lista de dicionários → extraindo um campo específico (ex: 'nome') +pessoas = [ + {"nome": "Ana", "idade": 25}, + {"nome": "Carlos", "idade": 30}, + {"nome": "Fernanda", "idade": 28} +] +nomes_extraidos = aplicar_transformacao(pessoas, lambda p: p["nome"]) +print("Nomes extraídos:", nomes_extraidos) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 39.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 39.py" new file mode 100644 index 0000000..fedab1f --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 39.py" @@ -0,0 +1,97 @@ +import json +from typing import List, Dict + +def carregar_dados(caminho: str) -> List[Dict]: + """ + Carrega os dados de clientes de um arquivo JSON. + + Args: + caminho (str): Caminho do arquivo JSON. + + Returns: + List[Dict]: Lista de dicionários com os dados dos clientes. + """ + with open(caminho, "r", encoding="utf-8") as f: + return json.load(f) + + +def normalizar_dados(dados: List[Dict]) -> List[Dict]: + """ + Normaliza os dados dos clientes: + - Nome capitalizado + - Email em minúsculas + - Telefone formatado (DDD + número) + + Args: + dados (List[Dict]): Lista de clientes. + + Returns: + List[Dict]: Lista de clientes normalizados. + """ + normalizados = [] + for cliente in dados: + nome = cliente["nome"].strip().title() + email = cliente["email"].strip().lower() + telefone = cliente["telefone"].replace(" ", "").replace("-", "") + if len(telefone) == 11: + telefone = f"({telefone[:2]}) {telefone[2:7]}-{telefone[7:]}" + normalizados.append({"nome": nome, "email": email, "telefone": telefone}) + return normalizados + + +def enriquecer_dados(dados: List[Dict]) -> List[Dict]: + """ + Enriquece os dados adicionando um campo 'status' + baseado no domínio do email. + + Args: + dados (List[Dict]): Lista de clientes normalizados. + + Returns: + List[Dict]: Lista de clientes enriquecidos. + """ + enriquecidos = [] + for cliente in dados: + dominio = cliente["email"].split("@")[-1] + status = "Interno" if dominio.endswith("empresa.com") else "Externo" + cliente["status"] = status + enriquecidos.append(cliente) + return enriquecidos + + +def exportar_resultado(dados: List[Dict], caminho: str) -> None: + """ + Exporta os dados tratados para um arquivo JSON. + + Args: + dados (List[Dict]): Lista de clientes tratados. + caminho (str): Caminho do arquivo de saída. + """ + with open(caminho, "w", encoding="utf-8") as f: + json.dump(dados, f, indent=2, ensure_ascii=False) + + +# --- Demonstração do Pipeline --- + +# Criando um JSON inicial com dados irregulares +clientes_irregulares = [ + {"nome": " fernanda costa ", "email": "FERNANDA@EMPRESA.COM", "telefone": "55999999999"}, + {"nome": "bruno ", "email": "Bruno@GMAIL.com", "telefone": "55888888888"}, + {"nome": "carla", "email": "Carla@empresa.com", "telefone": "55777777777"}, + {"nome": "joão silva", "email": "Joao@Yahoo.Com", "telefone": "55666666666"}, + {"nome": "ana", "email": "ANA@EMPRESA.COM", "telefone": "55555555555"} +] + +with open("clientes.json", "w", encoding="utf-8") as f: + json.dump(clientes_irregulares, f, indent=2, ensure_ascii=False) + +# Pipeline +dados = carregar_dados("clientes.json") +dados_normalizados = normalizar_dados(dados) +dados_enriquecidos = enriquecer_dados(dados_normalizados) +exportar_resultado(dados_enriquecidos, "clientes_tratados.json") + +# Exibindo resultado final +print("--- Clientes Tratados ---") +for c in dados_enriquecidos: + print(f"{c['nome']} | {c['email']} | {c['telefone']} | {c['status']}") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 40.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 40.py" new file mode 100644 index 0000000..831ed53 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 40.py" @@ -0,0 +1,151 @@ +import json +from typing import List, Dict, Optional + +ARQUIVO = "alunos.json" + + +def carregar_alunos() -> List[Dict]: + """ + Carrega os alunos do arquivo JSON. + + Returns: + List[Dict]: Lista de alunos cadastrados. + """ + try: + with open(ARQUIVO, "r", encoding="utf-8") as f: + return json.load(f) + except FileNotFoundError: + return [] + + +def salvar_alunos(alunos: List[Dict]) -> None: + """ + Salva a lista de alunos no arquivo JSON. + + Args: + alunos (List[Dict]): Lista de alunos. + """ + with open(ARQUIVO, "w", encoding="utf-8") as f: + json.dump(alunos, f, indent=2, ensure_ascii=False) + + +def cadastrar_aluno(nome: str, email: str, idade: int, notas: List[float]) -> Dict: + """ + Cadastra um novo aluno. + + Args: + nome (str): Nome do aluno. + email (str): Email do aluno. + idade (int): Idade do aluno. + notas (List[float]): Lista de notas do aluno. + + Returns: + Dict: Dicionário com os dados do aluno cadastrado. + """ + alunos = carregar_alunos() + novo_id = len(alunos) + 1 + aluno = { + "id": novo_id, + "nome": nome.strip().title(), + "email": email.lower(), + "idade": idade, + "notas": notas, + "ativo": True + } + alunos.append(aluno) + salvar_alunos(alunos) + return aluno + + +def listar_alunos() -> List[Dict]: + """ + Lista todos os alunos cadastrados. + + Returns: + List[Dict]: Lista de alunos. + """ + return carregar_alunos() + + +def buscar_por_nome(nome: str) -> Optional[Dict]: + """ + Busca um aluno pelo nome. + + Args: + nome (str): Nome do aluno. + + Returns: + Optional[Dict]: Aluno encontrado ou None. + """ + alunos = carregar_alunos() + for aluno in alunos: + if aluno["nome"].lower() == nome.lower(): + return aluno + return None + + +def calcular_media_turma() -> float: + """ + Calcula a média geral da turma. + + Returns: + float: Média geral das notas de todos os alunos. + """ + alunos = carregar_alunos() + todas_notas = [nota for aluno in alunos for nota in aluno["notas"]] + return sum(todas_notas) / len(todas_notas) if todas_notas else 0.0 + + +def exportar_relatorio() -> None: + """ + Exporta um relatório da turma para relatorio_turma.json. + + Relatório contém: + - Total de alunos + - Média geral da turma + - Aluno com maior média + - Aluno com menor média + """ + alunos = carregar_alunos() + if not alunos: + return + + medias = [(aluno["nome"], sum(aluno["notas"]) / len(aluno["notas"])) for aluno in alunos] + maior = max(medias, key=lambda x: x[1]) + menor = min(medias, key=lambda x: x[1]) + + relatorio = { + "total_alunos": len(alunos), + "media_geral": calcular_media_turma(), + "maior_media": {"nome": maior[0], "media": maior[1]}, + "menor_media": {"nome": menor[0], "media": menor[1]} + } + + with open("relatorio_turma.json", "w", encoding="utf-8") as f: + json.dump(relatorio, f, indent=2, ensure_ascii=False) + + +# --- Demonstração --- +print("--- Sistema de Cadastro de Alunos ---") + +# 1. Cadastrar 4 alunos +cadastrar_aluno("Alice", "alice@email.com", 20, [8.5, 9.0, 7.5]) +cadastrar_aluno("Bruno", "bruno@email.com", 22, [6.0, 7.0, 6.5]) +cadastrar_aluno("Carla", "carla@email.com", 19, [9.5, 9.0, 10.0]) +cadastrar_aluno("Daniel", "daniel@email.com", 21, [5.0, 6.0, 5.5]) + +# 2. Listar alunos +print("\nLista de alunos:") +for aluno in listar_alunos(): + print(f"{aluno['id']} - {aluno['nome']} ({aluno['email']}) - Idade: {aluno['idade']} - Ativo: {aluno['ativo']}") + +# 3. Buscar um aluno +print("\nBuscando aluno 'Carla':") +print(buscar_por_nome("Carla")) + +# 4. Exibir média da turma +print("\nMédia geral da turma:", calcular_media_turma()) + +# 5. Exportar relatório +exportar_relatorio() +print("\nRelatório exportado para relatorio_turma.json") diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/produto.json" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/produto.json" new file mode 100644 index 0000000..e0f07b9 --- /dev/null +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/produto.json" @@ -0,0 +1,12 @@ +{ + "id": 101, + "nome": "Smartphone X", + "preco": 1999.9, + "estoque": 35, + "disponivel": true, + "categorias": [ + "Eletrônicos", + "Celulares", + "Promoção" + ] +} \ No newline at end of file From 14809454c65aedef7a961060ccc04cfb0609ab8d Mon Sep 17 00:00:00 2001 From: Jennison Diniz Date: Thu, 21 May 2026 20:09:41 -0400 Subject: [PATCH 3/8] respostas --- .../modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" index 6060234..f298af0 100644 --- "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 02 .py" @@ -1,3 +1,3 @@ import sys print(sys.version) -print(sys.platform) \ No newline at end of file +print(sys.platform) \ No newline at end of file From 1bd8f78e1f0830135db97600ccaefab091435901 Mon Sep 17 00:00:00 2001 From: Jennison Diniz Date: Thu, 21 May 2026 20:24:05 -0400 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20m=C3=B3dulo=201=20=20resolvido=20-?= =?UTF-8?q?=20Jennison=5FDiniz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" index bd6151e..ac18829 100644 --- "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" @@ -1,3 +1,3 @@ -print("Olá, Mundo!") +# print("Olá, Mundo!") print("Jennison Enthony Oliveira Diniz") print("Python: simples, poderoso e elegante.") \ No newline at end of file From 9f28917898daccb169b0c007ac075ee3ce7c9af7 Mon Sep 17 00:00:00 2001 From: Jennison Diniz Date: Thu, 21 May 2026 20:38:37 -0400 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20m=C3=B3dulo=201=20=20resolvido=20-?= =?UTF-8?q?=20Jennison=5FDiniz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" index ac18829..bd6151e 100644 --- "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" @@ -1,3 +1,3 @@ -# print("Olá, Mundo!") +print("Olá, Mundo!") print("Jennison Enthony Oliveira Diniz") print("Python: simples, poderoso e elegante.") \ No newline at end of file From 895d8822d727770e4584d11f629095231633d5e7 Mon Sep 17 00:00:00 2001 From: Jennison Diniz Date: Thu, 21 May 2026 20:46:36 -0400 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20m=C3=B3dulo=201=20=20resolvido=20-?= =?UTF-8?q?=20Jennison=5FDiniz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" index bd6151e..ac18829 100644 --- "a/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" +++ "b/modulo-01/Jennison_Diniz/modulo-01/Exerc\303\255cio/Exerc\303\255cio 01.py" @@ -1,3 +1,3 @@ -print("Olá, Mundo!") +# print("Olá, Mundo!") print("Jennison Enthony Oliveira Diniz") print("Python: simples, poderoso e elegante.") \ No newline at end of file From 70e9c921cec6e4db8b6b02f510e28fc8bd29cfbf Mon Sep 17 00:00:00 2001 From: Jennison Diniz Date: Thu, 21 May 2026 20:53:40 -0400 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20m=C3=B3dulo=202=20resolvido=20-=20J?= =?UTF-8?q?ennison=5FDiniz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modulo-02/Jennison_Diniz/modulo-02/exercicios.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modulo-02/Jennison_Diniz/modulo-02/exercicios.py b/modulo-02/Jennison_Diniz/modulo-02/exercicios.py index dc12475..2614c0c 100644 --- a/modulo-02/Jennison_Diniz/modulo-02/exercicios.py +++ b/modulo-02/Jennison_Diniz/modulo-02/exercicios.py @@ -602,4 +602,4 @@ def ex15_menu_sistema(): # ex12_analisador_senha() # ex13_caixa_eletronico() # ex14_leitura_notas_turma() - # ex15_menu_sistema() \ No newline at end of file + ex15_menu_sistema() \ No newline at end of file From b0583bd953442704ad447d45a9b8c0b8e7dcf119 Mon Sep 17 00:00:00 2001 From: Jennison Diniz Date: Fri, 22 May 2026 21:09:18 -0400 Subject: [PATCH 8/8] feat: projeto 01 resolvido - Jennison_Maiko --- .../Jennison_Diniz_Maiko_atividades.py | 393 ++++++++++++++++++ 1 file changed, 393 insertions(+) create mode 100644 projeto-01/Jennison_Diniz_Maicon/Jennison_Diniz_Maiko_atividades.py diff --git a/projeto-01/Jennison_Diniz_Maicon/Jennison_Diniz_Maiko_atividades.py b/projeto-01/Jennison_Diniz_Maicon/Jennison_Diniz_Maiko_atividades.py new file mode 100644 index 0000000..81e8de7 --- /dev/null +++ b/projeto-01/Jennison_Diniz_Maicon/Jennison_Diniz_Maiko_atividades.py @@ -0,0 +1,393 @@ +""" +============================================================= +ATIVIDADES — Registry Pattern em Python +Do fácil ao difícil: 5 desafios em contextos reais + +Curso de Capacitação Full Stack – ITEAM +Professor: Msc. Hygo Sousa De Oliveira +============================================================= + +INSTRUÇÕES GERAIS: + 1. Leia o código "ANTES" de cada atividade com atenção. + 2. Implemente a solução com Registry na seção indicada. + 3. O comportamento de saída deve ser IDÊNTICO ao original. + 4. Não apague o código "ANTES" — ele serve de referência. + 5. Execute e confira: os prints devem ser os mesmos. + +NÍVEIS: + 🟢 Atividade 1 — Básico (dicionário simples) + 🟢 Atividade 2 — Básico+ (classe Registry) + 🟡 Atividade 3 — Intermediário (decorator + classe) + 🟡 Atividade 4 — Intermediário (Decision Engine) + 🔴 Atividade 5 — Avançado (Registry completo + plugins) +============================================================= +""" + + +# ============================================================== +# 🟢 ATIVIDADE 1 — Calculadora de Operações +# Nível: Básico | Conceito: dicionário simples como registry +# ============================================================== + +print("=" * 60) +print("ATIVIDADE 1 — Calculadora de Operações") +print("=" * 60) + +# ── ANTES (if/elif) ────────────────────────────────────────── +def calcular_antes(operacao: str, a: float, b: float) -> float: + """Calculadora com if/elif — para ser refatorada.""" + if operacao == "soma": + return a + b + elif operacao == "subtracao": + return a - b + elif operacao == "multiplicacao": + return a * b + elif operacao == "divisao": + if b == 0: + raise ZeroDivisionError("Divisão por zero.") + return a / b + elif operacao == "potencia": + return a ** b + elif operacao == "modulo": + return a % b + else: + raise ValueError(f"Operação desconhecida: {operacao}") + +print("\n[ANTES]") +print(calcular_antes("soma", 10, 3)) # → 13 +print(calcular_antes("subtracao", 10, 3)) # → 7 +print(calcular_antes("multiplicacao", 10, 3)) # → 30 +print(calcular_antes("divisao", 10, 4)) # → 2.5 +print(calcular_antes("potencia", 2, 8)) # → 256.0 +print(calcular_antes("modulo", 10, 3)) # → 1 + + +# ── DEPOIS (Registry) ──────────────────────────────────────── +""" +TAREFA: + 1. Crie um dicionário OPERACOES_REGISTRY mapeando + nome → função (use lambdas ou funções nomeadas). + 2. Implemente calcular_depois() consultando o dicionário. + 3. Mantenha o tratamento de ZeroDivisionError e ValueError. + 4. Adicione uma operação nova: "raiz" (√a) sem tocar em + calcular_depois() — só adicionando no dicionário. + +DICA: + import math + OPERACOES_REGISTRY = { + "soma": lambda a, b: a + b, + ... + } +""" + +# SUA SOLUÇÃO AQUI Jennison Diniz↓↓↓ +import math + +def _divisao_segura(a: float, b: float) -> float: + if b == 0: + raise ZeroDivisionError("Divisão por zero.") + return a / b + +OPERACOES_REGISTRY: dict = { + "soma": lambda a, b: a + b, + "subtracao": lambda a, b: a - b, + "multiplicacao": lambda a, b: a * b, + "divisao": _divisao_segura, + "potencia": lambda a, b: float(a ** b), + "modulo": lambda a, b: a % b, + "raiz": lambda a, b: math.sqrt(a) # Nova operação! +} + +def calcular_depois(operacao: str, a: float, b: float) -> float: + if operacao not in OPERACOES_REGISTRY: + raise ValueError(f"Operação desconhecida: {operacao}") + return OPERACOES_REGISTRY[operacao](a, b) + +print("\n[DEPOIS]") +print(calcular_depois("soma", 10, 3)) +print(calcular_depois("subtracao", 10, 3)) +print(calcular_depois("multiplicacao", 10, 3)) +print(calcular_depois("divisao", 10, 4)) +print(calcular_depois("potencia", 2, 8)) +print(calcular_depois("modulo", 10, 3)) +print(calcular_depois("raiz", 16, 0)) + +# OPERACOES_REGISTRY: dict = { ... } + +# def calcular_depois(operacao: str, a: float, b: float) -> float: +# ... + +# print("\n[DEPOIS]") +# print(calcular_depois("soma", 10, 3)) +# print(calcular_depois("multiplicacao", 10, 3)) +# print(calcular_depois("raiz", 16, 0)) # nova operação! + +# ============================================================== +# 🟡 ATIVIDADE 3 — Pipeline de Validação de Dados +# Nível: Intermediário | Conceito: decorator + Registry + chain +# ============================================================== + +print("\n" + "=" * 60) +print("ATIVIDADE 3 — Pipeline de Validação de Dados") +print("=" * 60) + +# ── ANTES (if/elif) ────────────────────────────────────────── +def validar_campo_antes(tipo: str, valor) -> tuple[bool, str]: + """ + Valida um valor conforme seu tipo. + Retorna (True, "") se válido, (False, mensagem) se inválido. + """ + if tipo == "email": + valido = "@" in str(valor) and "." in str(valor).split("@")[-1] + return (valido, "" if valido else "Email inválido: falta @ ou domínio") + + elif tipo == "cpf": + digitos = "".join(c for c in str(valor) if c.isdigit()) + valido = len(digitos) == 11 + return (valido, "" if valido else f"CPF inválido: esperado 11 dígitos, got {len(digitos)}") + + elif tipo == "telefone": + digitos = "".join(c for c in str(valor) if c.isdigit()) + valido = len(digitos) in (10, 11) + return (valido, "" if valido else "Telefone inválido: esperado 10 ou 11 dígitos") + + elif tipo == "cep": + digitos = "".join(c for c in str(valor) if c.isdigit()) + valido = len(digitos) == 8 + return (valido, "" if valido else "CEP inválido: esperado 8 dígitos") + + elif tipo == "idade": + try: + idade = int(valor) + valido = 0 <= idade <= 120 + return (valido, "" if valido else f"Idade inválida: {idade} fora de [0, 120]") + except (ValueError, TypeError): + return (False, f"Idade inválida: '{valor}' não é inteiro") + + elif tipo == "nome": + valido = isinstance(valor, str) and len(valor.strip()) >= 2 + return (valido, "" if valido else "Nome inválido: mínimo 2 caracteres") + + else: + return (False, f"Tipo de validação desconhecido: '{tipo}'") + + +print("\n[ANTES]") +casos = [ + ("email", "ana@iteam.com"), + ("email", "invalido_sem_arroba"), + ("cpf", "123.456.789-01"), + ("cpf", "123"), + ("telefone", "(92) 98765-4321"), + ("idade", 25), + ("idade", 200), + ("cep", "69000-000"), +] +for tipo, valor in casos: + ok, msg = validar_campo_antes(tipo, valor) + status = "✅" if ok else "❌" + print(f" {status} {tipo:10} | {str(valor):25} | {msg or 'OK'}") + + +# ── DEPOIS (Registry com decorator) ────────────────────────── +""" +TAREFA: + 1. Crie um Registry e um decorator @registrar_validador("tipo"). + 2. Cada validador vira uma função decorada: + + @registrar_validador("email") + def validar_email(valor) -> tuple[bool, str]: + ... + + 3. Implemente validar_campo_depois() sem if/elif. + 4. DESAFIO: adicione um validador "url" que verifica se o + valor começa com "http://" ou "https://" e contém "." + Apenas criando a função — sem tocar em validar_campo_depois(). + +DICA sobre o decorator: + validador_registry = Registry() + + def registrar_validador(tipo: str): + def decorator(func): + validador_registry.register(tipo, func) + return func + return decorator + + @registrar_validador("email") + def validar_email(valor) -> tuple[bool, str]: + ... +""" + +# SUA SOLUÇÃO AQUI Maikon ↓↓↓ + + +print("ATIVIDADE 3 — Pipeline de Validação de Dados") +print("=" * 60) + +# ── ANTES (if/elif) ────────────────────────────────────────── +def validar_campo_antes(tipo: str, valor) -> tuple[bool, str]: + """ + Valida um valor conforme seu tipo. + Retorna (True, "") se válido, (False, mensagem) se inválido. + """ + if tipo == "email": + valido = "@" in str(valor) and "." in str(valor).split("@")[-1] + return (valido, "" if valido else "Email inválido: falta @ ou domínio") + + elif tipo == "cpf": + digitos = "".join(c for c in str(valor) if c.isdigit()) + valido = len(digitos) == 11 + return (valido, "" if valido else f"CPF inválido: esperado 11 dígitos, got {len(digitos)}") + + elif tipo == "telefone": + digitos = "".join(c for c in str(valor) if c.isdigit()) + valido = len(digitos) in (10, 11) + return (valido, "" if valido else "Telefone inválido: esperado 10 ou 11 dígitos") + + elif tipo == "cep": + digitos = "".join(c for c in str(valor) if c.isdigit()) + valido = len(digitos) == 8 + return (valido, "" if valido else "CEP inválido: esperado 8 dígitos") + + elif tipo == "idade": + try: + idade = int(valor) + valido = 0 <= idade <= 120 + return (valido, "" if valido else f"Idade inválida: {idade} fora de [0, 120]") + except (ValueError, TypeError): + return (False, f"Idade inválida: '{valor}' não é inteiro") + + elif tipo == "nome": + valido = isinstance(valor, str) and len(valor.strip()) >= 2 + return (valido, "" if valido else "Nome inválido: mínimo 2 caracteres") + + else: + return (False, f"Tipo de validação desconhecido: '{tipo}'") + + +print("\n[ANTES]") +casos = [ + ("email", "ana@iteam.com"), + ("email", "invalido_sem_arroba"), + ("cpf", "123.456.789-01"), + ("cpf", "123"), + ("telefone", "(92) 98765-4321"), + ("idade", 25), + ("idade", 200), + ("cep", "69000-000"), +] +for tipo, valor in casos: + ok, msg = validar_campo_antes(tipo, valor) + status = "✅" if ok else "❌" + print(f" {status} {tipo:10} | {str(valor):25} | {msg or 'OK'}") + + +# ── DEPOIS (Registry com decorator) ────────────────────────── +""" +TAREFA: + 1. Crie um Registry e um decorator @registrar_validador("tipo"). + 2. Cada validador vira uma função decorada: + + @registrar_validador("email") + def validar_email(valor) -> tuple[bool, str]: + ... + + 3. Implemente validar_campo_depois() sem if/elif. + 4. DESAFIO: adicione um validador "url" que verifica se o + valor começa com "http://" ou "https://" e contém "." + Apenas criando a função — sem tocar em validar_campo_depois(). + +DICA sobre o decorator: + validador_registry = Registry() + + def registrar_validador(tipo: str): + def decorator(func): + validador_registry.register(tipo, func) + return func + return decorator + + @registrar_validador("email") + def validar_email(valor) -> tuple[bool, str]: + ... +""" + +# SUA SOLUÇÃO AQUI Maikon ↓↓↓ +class Registry: + def __init__(self): + self._items = {} + + def register(self, nome, func): + self._items[nome] = func + + def get(self, nome): + return self._items.get(nome) + + +# Registry global dos validadores +validador_registry = Registry() + + +# Decorator +def registrar_validador(tipo: str): + def decorator(func): + validador_registry.register(tipo, func) + return func + return decorator + +# VALIDADORES + +@registrar_validador("email") +def validar_email(valor) -> tuple[bool, str]: + if "@" in valor and "." in valor: + return True, "Email válido" + + return False, "Email inválido" + + +@registrar_validador("cpf") +def validar_cpf(valor) -> tuple[bool, str]: + if valor.isdigit() and len(valor) == 11: + return True, "CPF válido" + + return False, "CPF inválido" + + +@registrar_validador("telefone") +def validar_telefone(valor) -> tuple[bool, str]: + if valor.isdigit() and len(valor) >= 10: + return True, "Telefone válido" + + return False, "Telefone inválido" + +# DESAFIO + +@registrar_validador("url") +def validar_url(valor) -> tuple[bool, str]: + if ( + (valor.startswith("http://") or valor.startswith("https://")) + and "." in valor + ): + return True, "URL válida" + + return False, "URL inválida" + +# FUNÇÃO PRINCIPAL + +def validar_campo_depois(tipo, valor): + validador = validador_registry.get(tipo) + + if not validador: + return False, f"Validador '{tipo}' não encontrado" + + return validador(valor) + + +# TESTES + +print(validar_campo_depois("email", "caue@gmail.com")) +print(validar_campo_depois("cpf", "12345678901")) +print(validar_campo_depois("telefone", "95999999999")) +print(validar_campo_depois("url", "https://google.com")) + + +