diff --git a/modulo-01/leticia-alves/alunos.json b/modulo-01/leticia-alves/alunos.json new file mode 100644 index 0000000..76acc6c --- /dev/null +++ b/modulo-01/leticia-alves/alunos.json @@ -0,0 +1,46 @@ +[ + { + "id": 1, + "nome": "Leticia", + "email": "leticia@email.com", + "idade": 20, + "notas": [ + 8.0, + 9.0 + ], + "ativo": true + }, + { + "id": 2, + "nome": "Rafael", + "email": "rafael@email.com", + "idade": 21, + "notas": [ + 7.0, + 6.0 + ], + "ativo": true + }, + { + "id": 3, + "nome": "Maria", + "email": "maria@email.com", + "idade": 19, + "notas": [ + 10.0, + 9.5 + ], + "ativo": true + }, + { + "id": 4, + "nome": "Lucas", + "email": "lucas@email.com", + "idade": 22, + "notas": [ + 5.0, + 6.5 + ], + "ativo": true + } +] \ No newline at end of file diff --git a/modulo-01/leticia-alves/atividade40.py b/modulo-01/leticia-alves/atividade40.py new file mode 100644 index 0000000..6b52277 --- /dev/null +++ b/modulo-01/leticia-alves/atividade40.py @@ -0,0 +1,185 @@ + # Exercício 40 – Desafio Final: Sistema de Cadastro Completo + #Aluna: Leticia Alves + +import json + +ARQUIVO = "alunos.json" + + +def carregar() -> list[dict]: + """Carrega os alunos do arquivo JSON. + + Returns: + list[dict]: Uma lista contendo os dicionários dos alunos. + Retorna uma lista vazia se o arquivo não existir. + + Raises: + ValueError: Se o arquivo JSON existir, mas estiver inválido. + """ + try: + with open(ARQUIVO, "r") as f: + return json.load(f) + except FileNotFoundError: + return [] + except json.JSONDecodeError as exc: + raise ValueError(f"Arquivo JSON inválido: {ARQUIVO}") from exc + + +def salvar(alunos: list[dict]) -> None: + """Salva a lista de alunos no arquivo JSON. + + Args: + alunos (list[dict]): A lista de dicionários dos alunos a ser salva. + """ + with open(ARQUIVO, "w") as f: + json.dump(alunos, f, indent=4) + + +def cadastrar_aluno( + nome: str, email: str, idade: int, notas: list[float] +) -> dict: + """Cadastra um novo aluno no sistema e persiste no arquivo JSON. + + Args: + nome (str): Nome completo do aluno. + email (str): Endereço de e-mail do aluno. + idade (int): Idade do aluno. + notas (list[float]): Lista com as notas do aluno. + + Returns: + dict: O dicionário do aluno recém-criado com ID e status ativo. + """ + alunos = carregar() + + aluno = { + "id": len(alunos) + 1, + "nome": nome, + "email": email, + "idade": idade, + "notas": notas, + "ativo": True, + } + + alunos.append(aluno) + salvar(alunos) + return aluno + + +def listar_alunos() -> list[dict]: + """Lista todos os alunos cadastrados no sistema. + + Returns: + list[dict]: Lista com todos os dicionários de alunos. + """ + return carregar() + + +def buscar_por_nome(nome: str) -> dict | None: + """Busca um aluno no sistema pelo nome. + + A busca ignora diferenças entre letras maiúsculas e minúsculas. + + Args: + nome (str): O nome do aluno a ser buscado. + + Returns: + dict | None: O dicionário do aluno se encontrado, ou None caso contrário. + """ + for aluno in carregar(): + if aluno["nome"].lower() == nome.lower(): + return aluno + return None + + +def calcular_media_turma() -> float: + """Calcula a média geral de todas as notas de todos os alunos da turma. + + Returns: + float: A média geral da turma. Retorna 0.0 se não houver notas. + """ + alunos = carregar() + if not alunos: + return 0.0 + + total_notas = 0 + qtd_notas = 0 + + for aluno in alunos: + total_notas += sum(aluno["notas"]) + qtd_notas += len(aluno["notas"]) + + return total_notas / qtd_notas + + +def exportar_relatorio() -> None: + """Gera um relatório estatístico da turma e salva em 'relatorio_turma.json'. + + O relatório contém o total de alunos, a média geral da turma, e os dados + completos dos alunos com a maior e a menor média observadas. + """ + alunos = carregar() + if not alunos: + return + + aluno_maior = alunos[0] + aluno_menor = alunos[0] + + for aluno in alunos: + media_atual = sum(aluno["notas"]) / len(aluno["notas"]) + media_maior = sum(aluno_maior["notas"]) / len(aluno_maior["notas"]) + media_menor = sum(aluno_menor["notas"]) / len(aluno_menor["notas"]) + + if media_atual > media_maior: + aluno_maior = aluno + if media_atual < media_menor: + aluno_menor = aluno + + # Ajustado para passar o "aluno" (objeto/dict completo) conforme pede o enunciado + relatorio = { + "total_alunos": len(alunos), + "media_geral": calcular_media_turma(), + "aluno_maior_media": aluno_maior, + "aluno_menor_media": aluno_menor, + } + + with open("relatorio_turma.json", "w") as f: + json.dump(relatorio, f, indent=4) + + +# ===================================================================== +# DEMONSTRAÇÃO OBRIGATÓRIA +# ===================================================================== +if __name__ == "__main__": + print("--- INICIANDO SISTEMA DE CADASTRO ---") + + # Limpa o arquivo para o teste rodar limpo + open(ARQUIVO, "w").close() + + # 1. Cadastrar 4 alunos + print("\n[Passo 1] Cadastrando 4 alunos...") + cadastrar_aluno("Leticia", "leticia@email.com", 20, [8.0, 9.0]) + cadastrar_aluno("Rafael", "rafael@email.com", 21, [7.0, 6.0]) + cadastrar_aluno("Maria", "maria@email.com", 19, [10.0, 9.5]) + cadastrar_aluno("Lucas", "lucas@email.com", 22, [5.0, 6.5]) + print("Alunos cadastrados com sucesso!") + + # 2. Listar alunos + print("\n[Passo 2] Listando alunos salvos:") + todos_alunos = listar_alunos() + for aluno in todos_alunos: + print(f"- ID: {aluno['id']} | Nome: {aluno['nome']}") + + # 3. Buscar um aluno por nome + print("\n[Passo 3] Buscando pela 'Maria':") + aluno_encontrado = buscar_por_nome("Maria") + print(aluno_encontrado) + + # 4. Exibir média da turma + print("\n[Passo 4] Calculando média geral da turma...") + media = calcular_media_turma() + print(f"Média da turma: {media:.2f}") + + # 5. Exportar relatório + print("\n[Passo 5] Exportando relatório...") + exportar_relatorio() + print("Arquivo 'relatorio_turma.json' gerado com sucesso!") \ No newline at end of file diff --git a/modulo-01/leticia-alves/relatorio_turma.json b/modulo-01/leticia-alves/relatorio_turma.json new file mode 100644 index 0000000..6d2e89a --- /dev/null +++ b/modulo-01/leticia-alves/relatorio_turma.json @@ -0,0 +1,26 @@ +{ + "total_alunos": 4, + "media_geral": 7.625, + "aluno_maior_media": { + "id": 3, + "nome": "Maria", + "email": "maria@email.com", + "idade": 19, + "notas": [ + 10.0, + 9.5 + ], + "ativo": true + }, + "aluno_menor_media": { + "id": 4, + "nome": "Lucas", + "email": "lucas@email.com", + "idade": 22, + "notas": [ + 5.0, + 6.5 + ], + "ativo": true + } +} \ No newline at end of file diff --git a/modulo-02/leticia-alves/calculadora.py b/modulo-02/leticia-alves/calculadora.py new file mode 100644 index 0000000..0c0ac3c --- /dev/null +++ b/modulo-02/leticia-alves/calculadora.py @@ -0,0 +1,72 @@ +# Atividade 1 - Calculadora de Operações +#Alunos: Leticia Alves e Rafael Nobrega de Lima + +# Contexto: calculadora aritmética com 6 operações. Conceito central: dicionário simples + lambdas como valores. +import math + +# Registry +calculadora_operacoes = {} + +def calcular_depois(nome:str): + def decorator(classe): + calculadora_operacoes[nome] = classe + return classe + return decorator + +# ---------------- OPERAÇÕES ---------------- # +@calcular_depois("soma") +class Soma: + def executar(self, a,b): + return a + b + +@calcular_depois("subtracao") +class Subtracao: + def executar(self, a,b): + return a - b + +@calcular_depois("divisao") +class Divisao: + def executar(self, a,b): + try: + return a / b + except ZeroDivisionError: + raise ValueError("Não é possível dividir por zero") + +@calcular_depois("multiplicacao") +class Multiplicacao: + def executar(self, a,b): + return a * b + +@calcular_depois("potenciacao") +class Potenciacao: + def executar(self, a,b): + return a ** b + +@calcular_depois("raiz") +class Radiciacao: + def executar(self, a, b=None): + + if a < 0: + raise ValueError("Não existe raiz real de número negativo") + + return math.sqrt(a) + + +# ---------------- CALCULADORA ---------------- # +def calcular(operacao: str, a: float, b: float = None): + if operacao not in calculadora_operacoes: + raise ValueError(f"Operação {operacao} inválida!!") + + classe_op = calculadora_operacoes[operacao]() + return classe_op.executar(a,b) + +# ---------------- TESTES ---------------- # + +if __name__ == "__main__": + print(calcular("soma", 10, 10)) + print(calcular("subtracao", 10, 3)) + print(calcular("multiplicacao", 9, 3)) + print(calcular("potenciacao", 2, 3)) + print(calcular("raiz", 25)) + + # print(calcular("divisao", 10, 0)) \ No newline at end of file diff --git a/modulo-02/leticia-alves/e-commerce.py b/modulo-02/leticia-alves/e-commerce.py new file mode 100644 index 0000000..043b7ab --- /dev/null +++ b/modulo-02/leticia-alves/e-commerce.py @@ -0,0 +1,120 @@ +from dataclasses import dataclass + + +# Atividade 4 - Motor de Descontos de E-commerce +#Alunos: Leticia Alves e Rafael Nobrega de Lima + +# Contexto: sistema de descontos para e-commerce. Conceito central: Decision Engine + Registry para separar regras e handlers. + + +@dataclass +class Carrinho: + valor_total: float + cupom: str | None + tipo_cliente: str + dia_semana: int + quantidade_itens: int + + +# ---------------- Decision Engine ---------------- + +def decidir_regra(carrinho: Carrinho) -> str: + + # Regra extra + if carrinho.dia_semana == 2 and carrinho.valor_total >= 300: + return "aniversario_loja" + + # Cupom Black Friday + if carrinho.cupom == "BLACKFRIDAY": + return "cupom:blackfriday" + + # Cliente VIP com compra alta + if carrinho.tipo_cliente == "vip" and carrinho.valor_total >= 500: + return "cliente:vip:alto" + + # Cliente fiel + if carrinho.tipo_cliente == "fiel": + return "cliente:fiel" + + # Cliente novo + if carrinho.tipo_cliente == "novo": + return "cliente:novo" + + # Muitos itens + if carrinho.quantidade_itens >= 10: + return "itens:grande" + + # Fim de semana + if carrinho.dia_semana >= 5: + return "fds:padrao" + + return "padrao" + + +# ---------------- Handlers ---------------- + +def desconto_blackfriday(carrinho): + return (0.30, "Desconto Black Friday") + + +def desconto_vip(carrinho): + return (0.20, "Cliente VIP") + + +def desconto_fiel(carrinho): + return (0.15, "Cliente fiel") + + +def desconto_novo(carrinho): + return (0.05, "Cliente novo") + + +def desconto_itens(carrinho): + return (0.10, "Muitos itens") + + +def desconto_fds(carrinho): + return (0.08, "Fim de semana") + + +def desconto_aniversario(carrinho): + return (0.25, "Aniversário da loja") + + +def desconto_padrao(carrinho): + return (0.00, "Sem desconto") + + +# ---------------- Registry ---------------- + +registry = { + "cupom:blackfriday": desconto_blackfriday, + "cliente:vip:alto": desconto_vip, + "cliente:fiel": desconto_fiel, + "cliente:novo": desconto_novo, + "itens:grande": desconto_itens, + "fds:padrao": desconto_fds, + "aniversario_loja": desconto_aniversario, + "padrao": desconto_padrao +} + + +# ---------------- Função Final ---------------- + +def calcular_desconto_depois(carrinho): + regra = decidir_regra(carrinho) + return registry[regra](carrinho) + + +# ---------------- Teste ---------------- + +if __name__ == "__main__": + carrinho = Carrinho( + valor_total=600, + cupom=None, + tipo_cliente="vip", + dia_semana=1, + quantidade_itens=5 + ) + + print(calcular_desconto_depois(carrinho)) \ No newline at end of file diff --git a/modulo-02/leticia-alves/template_leticia.py b/modulo-02/leticia-alves/template_leticia.py new file mode 100644 index 0000000..164767b --- /dev/null +++ b/modulo-02/leticia-alves/template_leticia.py @@ -0,0 +1,619 @@ +""" +============================================================= +MÓDULO 2 – Estruturas de Controle +Curso de Capacitação Full Stack – ITEAM + +Aluno(a): Letícia Alves dos Santos +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 + temp = float(input("Digite a temperatura em Celsius: ")) + + if temp < 0: + print("❄️ Congelante") + elif 0 <= temp <= 14: + print("🥶 Frio") + elif 15 <= temp <= 24: + print("😊 Agradável") + elif 25 <= temp <= 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 → "iteam2025" + """ + # SUA SOLUÇÃO AQUI + usuario = input("Digite o usuário: ") + senha = input("Digite a senha: ") + + if usuario == "admin": + if senha == "iteam2025": + print("Acesso concedido!") + else: + print("Senha incorreta. Acesso negado.") + else: + print("Usuário não encontrado. Acesso negado.") + + +# ============================================================== +# 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 + num = input("Digite um número inteiro para ver sua tabuada: ") + for i in range(1, 11): + resultado = int(num) * i + print(f"{num} x {i:2} = {resultado}") + + +# ============================================================== +# 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 + num = int(input("Digite um número inteiro positivo para a contagem regressiva: ")) + while num >= 0: + print(num, end=" ") + num -= 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 i, item in enumerate(estoque): + if item == "Monitor": + print(f"Monitor encontrado na posição {i}") + 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 + ignorados = 0 + + for leitura in leituras: + if leitura is None: + ignorados += 1 + continue + + soma += leitura + + validas = len(leituras) - ignorados + media = soma / validas if validas > 0 else 0 + + print(f'A soma é: {soma}') + print(f'A media é: {media}') + print(f'Foram ignorados {ignorados} valores None') + + +# ============================================================== +# 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: + nota = float(input("Digite a nota do aluno (0.0 a 10.0): ")) + + if 0.0 <= nota <= 10.0: + break + + print("Nota inválida. Digite um valor entre 0.0 e 10.0.") + + if nota >= 9.0: + print("A – Excelente") + elif nota >= 7.0: + print("B – Bom") + elif nota >= 5.0: + print("C – Regular") + else: + print("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: + n1 = int(input("Número 1: ")) + n2 = int(input("Número 2: ")) + op = input("Operação: ") + + if op == "+": + r = n1 + n2 + elif op == "-": + r = n1 - n2 + elif op == "*": + r = n1 * n2 + elif op == "/": + r = n1 / n2 + else: + raise ValueError("Operação inválida") + + except ValueError: + print("Erro de valor") + except ZeroDivisionError: + print("Erro de divisão por zero") + else: + print(r) + finally: + print("Fim") + + +# ============================================================== +# 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 + for i in range(1, 6): + 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 + while tentativas > 0: + tentativa = int(input("Digite um número entre 1 e 100: ")) + if tentativa == numero_secreto: + print("Parabéns! Você acertou!") + break + elif tentativa < numero_secreto: + print("O número é maior.") + else: + print("O número é menor.") + tentativas -= 1 + if tentativas == 0: + print(f"Suas tentativas acabaram. O número 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: + entrada = input("Digite um número inteiro positivo: ") + n = int(entrada) + + # Se for menor ou igual a zero, dispara o ValueError de propósito + if n <= 0: + raise ValueError("O número deve ser positivo (maior que zero).") + + if n == 1: + print("O número 1 não é primo.") + return + + eh_primo = True + + for i in range(2, n): + if n % i == 0: + eh_primo = False + print(f"Encontrou o divisor {i}. Interrompendo a busca com 'break'...") + break + + if eh_primo: + print(f"O número {n} é PRIMO!") + else: + print(f"O número {n} NÃO é primo.") + + except ValueError: + print("Erro: Por favor, digite apenas números inteiros e positivos (maiores que zero).") + + +# ============================================================== +# EXERCÍCIO 12 – Analisador de Senha Forte +# Conceitos: for, if, booleanos, métodos de string +# ============================================================== +def ex12_analisador_senha(): + """ + Analisa 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: ") + + comprimento_ok = len(senha) >= 8 + maiuscula_ok = False + minuscula_ok = False + digito_ok = False + especial_ok = False + + especiais = "!@#$%^&*" + + for letra in senha: + if letra.isupper(): + maiuscula_ok = True + if letra.islower(): + minuscula_ok = True + if letra.isdigit(): + digito_ok = True + if letra in especiais: + especial_ok = True + + emoji_tamanho = "❌" + emoji_maiuscula = "❌" + emoji_minuscula = "❌" + emoji_digito = "❌" + emoji_especial = "❌" + + if comprimento_ok: + emoji_tamanho = "✅" + if maiuscula_ok: + emoji_maiuscula = "✅" + if minuscula_ok: + emoji_minuscula = "✅" + if digito_ok: + emoji_digito = "✅" + if especial_ok: + emoji_especial = "✅" + + print("\n=== RELATÓRIO DA SENHA ===") + print(f"{emoji_tamanho} Mínimo 8 caracteres") + print(f"{emoji_maiuscula} Pelo menos 1 maiúscula") + print(f"{emoji_minuscula} Pelo menos 1 minúscula") + print(f"{emoji_digito} Pelo menos 1 dígito") + print(f"{emoji_especial} Pelo menos 1 caractere especial") + print("==========================") + + if comprimento_ok and maiuscula_ok and minuscula_ok and digito_ok and especial_ok: + print("Resultado: Senha FORTE! 💪") + + if not (comprimento_ok and maiuscula_ok and minuscula_ok and digito_ok and especial_ok): + print("Resultado: 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 + while True: + try: + valor = int(input("Digite o valor do saque: R$")) + + if valor <= 0: + print("Digite um valor maior que zero.") + elif valor > 3000: + print("Valor máximo permitido: R$3000.") + elif valor % 10 != 0: + print("O valor deve ser múltiplo de R$10.") + else: + print("\nCédulas entregues:") + + for cedula in cedulas: + qtd = valor // cedula + if qtd > 0: + print(f"{qtd} cédula(s) de R${cedula}") + valor %= cedula + break + + except ValueError: + print("Entrada inválida. Digite apenas números.") + +# ============================================================== +# 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 + while True: + entrada = input("Digite uma nota (ou 'fim'): ") + + if entrada.lower() == "fim": + break + try: + nota = float(entrada) + + if nota < 0 or nota > 10: + print("Nota inválida. Digite entre 0 e 10.") + continue + notas.append(nota) + + except ValueError: + print("Entrada inválida.") + pass + continue + + if len(notas) > 0: + total = len(notas) + media = sum(notas) / total + maior = max(notas) + menor = min(notas) + + print("\nResultado:") + print(f"Total de notas: {total}") + print(f"Média: {media:.2f}") + print(f"Maior nota: {maior}") + print(f"Menor nota: {menor}") + + else: + print("Nenhuma nota foi informada.") + + +# ============================================================== +# 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: ")) + + # Sair + if opcao == 0: + print("Saindo do sistema...") + break + + # Opção 1 + elif opcao == 1: + celsius = float(input("Digite a temperatura em Celsius: ")) + + fahrenheit = (celsius * 9/5) + 32 + + print(f"A temperatura de {celsius}°C corresponde a {fahrenheit:.2f}°F") + + # Opção 2 + elif opcao == 2: + numero = int(input("Digite um número: ")) + + if numero < 2: + print("Não é primo.") + + else: + primo = True + + for i in range(2, numero): + + if numero % i == 0: + primo = False + break + + if primo: + print("Número primo.") + else: + print("Não é primo.") + + # Opção 3 + elif opcao == 3: + senha = input("Digite a senha: ") + + tem_numero = False + + for caractere in senha: + if caractere.isdigit(): + tem_numero = True + + print(f"Tamanho: {len(senha)}") + + if len(senha) >= 8: + print("Comprimento válido") + else: + print("Senha curta") + + if tem_numero: + print("Possui dígito") + else: + print("Não possui dígito") + + # Opção 4 + elif opcao == 4: + + n1 = float(input("Primeiro número: ")) + operador = input("Operador (+ - * /): ") + n2 = float(input("Segundo número: ")) + + if operador == "+": + print("Resultado:", n1 + n2) + + elif operador == "-": + print("Resultado:", n1 - n2) + + elif operador == "*": + print("Resultado:", n1 * n2) + + elif operador == "/": + + if n2 == 0: + print("Não é possível dividir por zero") + continue + + print("Resultado:", n1 / n2) + + else: + print("Operador inválido") + + else: + print("Opção inválida") + + except ValueError: + print("Entrada inválida. Digite valores corretos.") + + +# ============================================================== +# 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): Letícia Alves dos Santos") + 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()