Algoritmo em linguagem natural:
Definir a função calcular_total(itens):
Iniciar total = 0
Para cada item em itens → total = total + item.preco
Retornar total
Definir a função aplicar_desconto(total, cadastrado):
Se cadastrado = verdadeiro → retornar total × 0.90
Caso contrário → retornar total
Solicitar a quantidade de itens do pedido
Se quantidade ≤ 0 → exibir erro "Pedido inválido" e encerrar
Para cada item (repetir quantidade vezes):
Solicitar nome do item
Solicitar preço do item
Se preço ≤ 0 → exibir erro "Preço inválido" e encerrar
Adicionar item à lista
Chamar calcular_total(itens) → obter total
Perguntar se o cliente é cadastrado (sim / não)
Chamar aplicar_desconto(total, cadastrado) → obter valor_final
Exibir resumo do pedido:
Lista de itens e preços
Se cadastrado → exibir total com desconto e economia de 10%
Caso contrário → exibir valor cheio
Dividi a solução em duas funções com responsabilidades distintas. calcular_total() só sabe somar (não sabe nada sobre desconto). aplicar_desconto() só sabe sobre desconto (não sabe nada sobre os itens). A pergunta sobre cadastro vem depois de montar o pedido de propósito. Não faz sentido perguntar isso antes, o desconto só tem significado quando já existe um total para ser reduzido. Essa ordem também reflete o fluxo natural do atendimento real no balcão. As validações usam curto-circuito: quantidade inválida encerra antes do loop, preço inválido encerra antes de continuar. O sistema nunca chega ao cálculo com dados que já sabe que estão errados. Se amanhã o desconto mudar de 10% para 15%, ou surgir um segundo tipo de desconto, a alteração fica dentro de aplicar_desconto() sem tocar no restante.