Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

DESAFIO: HORA DA PRÁTICA

Projeto — Cafeteria Escolar Gamificada

Desenvolvi um aprimoramento do projeto anterior da cafeteria escolar, agregando os novos conteúdos estudados ao longo do módulo de Python. O sistema passou a integrar cadastro de estudantes, autorização familiar, registro de compras, pontuação saudável, recompensas, histórico de consumo e comunicação automatizada com as famílias.

Nesse aprimoramento, utilizei conteúdos como:

  • variáveis;
  • input();
  • conversão de tipos (int() e float());
  • condicionais (if, elif e else);
  • operadores lógicos;
  • operadores relacionais;
  • operadores de atribuição (+=);
  • laços de repetição (while e for);
  • dicionários;
  • listas;
  • cálculo de valores;
  • acumuladores;
  • organização de dados.

O objetivo foi construir um sistema mais próximo de uma situação real, utilizando os conceitos estudados para modelar regras de funcionamento de uma cafeteria escolar gamificada.

Programa em Python

clientes = {}

cardapio_saudavel = {
"agua": 4,
"fruta": 6,
"suco natural": 9,
"iogurte": 10,
"tapioca": 12,
"sanduiche natural": 15
}

cafeteria_aberta = "sim"

while cafeteria_aberta == "sim":

nome = input("Nome do estudante: ").lower()

if nome not in clientes:

    print("Estudante não cadastrado.")

    turma = input("Turma: ")
    responsavel = input("Nome do responsável: ")
    whatsapp_familia = input("WhatsApp da família: ")

    autorizacao = input(
        "Família autoriza compras? (sim/não): "
    ).lower()

    clientes[nome] = {
        "turma": turma,
        "responsavel": responsavel,
        "whatsapp_familia": whatsapp_familia,
        "autorizacao": autorizacao,
        "visitas": 0,
        "pontos": 0,
        "historico": []
    }

if clientes[nome]["autorizacao"] != "sim":

    print("Compra não autorizada pela família.")

else:

    clientes[nome]["visitas"] += 1

    total = 0
    pontos_compra = 0
    pedido = {}

    quantidade = int(
        input("Quantos itens foram comprados? ")
    )

    for i in range(quantidade):

        item = input(
            f"Nome do item {i + 1}: "
        ).lower()

        valor = float(
            input("Valor do item: ")
        )

        pedido[item] = valor

        total += valor

        if item in cardapio_saudavel:

            pontos_compra += valor

    clientes[nome]["pontos"] += pontos_compra

    bonus = "Nenhum"
    valor_gratis = 0

    if clientes[nome]["pontos"] >= 1000:

        escolha = input(
            "Escolha um item saudável gratuito: "
        ).lower()

        if escolha in cardapio_saudavel:

            valor_gratis = cardapio_saudavel[escolha]

            clientes[nome]["pontos"] -= 1000

            bonus = "Item saudável gratuito"

    valor_final = total - valor_gratis

    compra = {
        "pedido": pedido,
        "total": total,
        "bonus": bonus,
        "valor_final": valor_final,
        "pontos_ganhos": pontos_compra
    }

    clientes[nome]["historico"].append(compra)

    print("\\n--- RESUMO DA COMPRA ---")

    print(f"Estudante: {nome}")

    print(
        f"Turma: {clientes[nome]['turma']}"
    )

    print(f"Total: R$ {total:.2f}")

    print(f"Bônus: {bonus}")

    print(
        f"Valor final: R$ {valor_final:.2f}"
    )

    print(
        f"Pontos atuais: "
        f"{clientes[nome]['pontos']}"
    )

    print("\\n--- MENSAGEM PARA A FAMÍLIA ---")

    print(
        f"Olá, família de {nome}."
    )

    print(
        f"Foi registrada uma compra "
        f"na cafeteria escolar no valor "
        f"de R$ {valor_final:.2f}."
    )

    print(
        f"Pontuação atual: "
        f"{clientes[nome]['pontos']} pontos."
    )

cafeteria_aberta = input(
    "\\nDeseja atender outro estudante? "
    "(sim/não): "
).lower()
2 respostas
solução!

Olá, Patricia. Como vai?

Uau! Que projeto sensacional e super completo! Você conseguiu integrar praticamente todos os conceitos fundamentais de Python em um único caso de uso real e muito bem estruturado. A ideia de gamificar uma cafeteria escolar controlando saldo de pontos, bônus, histórico em formato de lista de dicionários e até a simulação do envio de mensagens para a família ficou excelente.

O seu código está muito bem escrito, legível e demonstra que você compreendeu perfeitamente o funcionamento de estruturas complexas, como o aninhamento de laços e dicionários dentro de dicionários (clientes[nome]["historico"].append(compra)).

Para enriquecer ainda mais o seu projeto e deixá-lo mais robusto para uma situação de produção real, eu gostaria de compartilhar três sugestões e boas práticas bem legais:

  • Proteção contra erros de digitação (Validação de Entrada): No laço for onde o estudante digita a quantidade de itens, se o usuário digitar uma letra por engano (como "dois" em vez de 2), o programa quebrará com um erro de ValueError. Utilizar um bloco try-except é uma boa prática para evitar que o sistema feche inesperadamente.
  • Automação do Valor do Item: No seu código, você criou o dicionário cardapio_saudavel com os preços fixos, mas dentro do loop você pede para o usuário digitar o valor do item manualmente via input(). Uma evolução legal seria o sistema buscar o valor direto no cardápio de forma automática se o item existisse lá.
  • Tratamento de indentação do código: Notei que o seu código funciona perfeitamente, mas no momento de colar no fórum, algumas linhas dos blocos if e else iniciais ficaram desalinhadas na margem esquerda. No Python, a indentação correta é o que define o escopo do código.

Veja um exemplo prático de como o trecho do loop de itens poderia ser automatizado e protegido contra erros de digitação, consultando os valores direto do seu cardápio:

# Exemplo de melhoria na leitura dos itens
try:
    quantidade = int(input("Quantos itens foram comprados? "))
except ValueError:
    print("Por favor, digite um número válido!")
    quantidade = 0

for i in range(quantidade):
    item = input(f"Nome do item {i + 1}: ").lower()
    
    # Se o item está no cardápio, pega o valor automático. Se não, pede o input.
    if item in cardapio_saudavel:
        valor = cardapio_saudavel[item]
        print(f"Item saudável detectado! Valor automático: R$ {valor:.2f}")
        pontos_compra += valor
    else:
        valor = float(input("Valor do item (não listado no cardápio): "))
        
    pedido[item] = valor
    total += valor

Parabéns pela dedicação extrema e por construir uma solução tão criativa e bem amarrada logicamente. Você já tem total capacidade de avançar para os próximos módulos de manipulação de dados e funções!

Espero que possa ter lhe ajudado!

Nossa, quanta aprendizagem tenho pela frente! Estou gostando muito do desafio! Obrigada pelas contribuições, professor!