Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
8
respostas

[Projeto] Desafio: Simulador de pedidos em uma cafeteria

Desafio: Simulador de pedidos em uma cafeteria

Fui contratado por uma cafeteria que deseja automatizar o atendimento no balcão. O sistema deve permitir que o atendente registre os pedidos de cada cliente, calcule o valor total e aplique um desconto de 10% para clientes cadastrados.

O processo deve funcionar da seguinte forma:

  • O atendente informa quantos itens o cliente vai pedir.
  • Para cada item, o sistema solicita o nome e o preço.
  • Ao final, o sistema pergunta se o cliente é cadastrado.
  • Se for, aplica o desconto e exibe o valor com desconto.
  • Caso contrário, exibe o valor cheio.

O desafio consiste em criar um algoritmo que represente essa lógica de forma completa.

Segue abaixo a sequência de desenvolvimento do algoritmo da solução da demanda do usuario.

8 respostas
solução!

Simulador de Pedidos — Cafeteria (Atendimento no Balcão)


1. Escopo do problema

O atendente registra, no balcão, o pedido de um cliente por execução:

  1. Informa quantos itens o cliente vai pedir.
  2. Para cada item, informa nome e preço.
  3. Ao final, informa se o cliente é cadastrado.
  4. Se for cadastrado, o sistema aplica 10% de desconto; caso contrário, cobra o valor cheio.
  5. O sistema exibe o cupom com subtotal, desconto e total.

Fora de escopo (não pedido): meios de pagamento, estoque, persistência, múltiplos clientes
na mesma execução, quantidade por item (cada item registrado equivale a 1 unidade).


2. Regras de negócio

IDRegraTratamento quando violada
RN01A quantidade de itens deve ser um número inteiro.Rejeita e solicita novamente.
RN02A quantidade de itens deve estar no intervalo 1 ≤ N ≤ 50 (limite operacional de balcão, evita erro de digitação).Rejeita, exibe mensagem e solicita novamente.
RN03O nome do item é obrigatório: não pode ser vazio nem conter apenas espaços.Rejeita e solicita novamente o nome do mesmo item.
RN04O preço do item deve ser numérico e estritamente maior que zero (preço > 0). Não há itens gratuitos nem preço negativo.Rejeita e solicita novamente o preço do mesmo item.
RN05O subtotal é a soma dos preços de todos os itens registrados: subtotal = Σ preço(i).
RN06A resposta sobre cadastro aceita apenas S ou N, sem distinção de maiúsculas/minúsculas e ignorando espaços nas bordas.Rejeita e repete a pergunta.
RN07Cliente cadastradodesconto = subtotal × 10%. Cliente não cadastradodesconto = 0.
RN08O total = subtotal − desconto.
RN09Todo valor monetário é arredondado para 2 casas decimais com arredondamento comercial (half-up: 1,005 → 1,01). O arredondamento é aplicado ao desconto, e o total é calculado a partir do desconto já arredondado — assim subtotal, desconto e total sempre fecham entre si.
RN10Nenhuma entrada inválida aborta o pedido: o sistema sempre repete a solicitação até receber um valor válido.
RN11O total exibido nunca é negativo e nunca é maior que o subtotal (garantido por RN04 + RN07).
RN12Todos os valores são exibidos no formato R$ 0,00 (duas casas decimais, sempre).

Constantes do sistema

ConstanteValorOrigem
TAXA_DESCONTO0,10 (10%)Política comercial para clientes cadastrados
MIN_ITENS1RN02
MAX_ITENS50RN02

3. Solução em linguagem natural

Início. O sistema exibe a saudação de abertura do atendimento e zera o subtotal do pedido.

Passo 1 — Quantidade de itens. O sistema pergunta ao atendente quantos itens o cliente vai
pedir. Se a resposta não for um número inteiro, ou for menor que 1, ou maior que 50, o sistema
avisa que a quantidade é inválida e pergunta de novo, quantas vezes for necessário, até
receber um valor válido.

Passo 2 — Registro dos itens. Com a quantidade válida em mãos, o sistema repete o
procedimento abaixo uma vez para cada item, do primeiro até o último:

  • Pergunta o nome do item. Se o nome vier vazio (ou só com espaços), avisa e pergunta de
    novo o nome desse mesmo item.
  • Pergunta o preço do item. Se o preço não for um número, ou for zero, ou for negativo,
    avisa e pergunta de novo o preço desse mesmo item.
  • Guarda o nome e o preço na lista do pedido e soma o preço ao subtotal.

Passo 3 — Cadastro do cliente. Terminado o registro, o sistema pergunta se o cliente é
cadastrado, esperando S (sim) ou N (não). Maiúsculas e minúsculas são equivalentes.
Qualquer outra resposta é rejeitada e a pergunta é repetida.

Passo 4 — Cálculo. Se o cliente for cadastrado, o sistema calcula o desconto como 10% do
subtotal, arredondado para duas casas decimais, e o total como subtotal menos desconto.
Se o cliente não for cadastrado, o desconto é zero e o total é igual ao subtotal
(valor cheio).

Passo 5 — Cupom. O sistema exibe a lista de itens com seus preços, o subtotal, o desconto
aplicado (indicando se houve ou não o benefício de cliente cadastrado) e o valor total a pagar,
todos no formato monetário com duas casas decimais.

Fim.

5. Doze casos de exemplo para Teste do Algoritmo da Solução

Convenções: valores em R$; “—” = não aplicável; entradas rejeitadas aparecem em ordem
cronológica, seguidas da entrada válida que as substituiu.

#CenárioEntradasSubtotalDescontoTotalSaída/comportamento esperado
CT01Caminho feliz — não cadastrado, 1 itemN=1; "Café expresso" 5,00; cadastro=N5,000,005,00Cupom com valor cheio, sem linha de desconto aplicado.
CT02Caminho feliz — cadastrado, 3 itensN=3; "Cappuccino" 9,50; "Pão de queijo" 6,00; "Suco de laranja" 8,00; cadastro=S23,502,3521,15Cupom com desconto de 10% destacado.
CT03Quantidade zero (RN02)N=0 → rejeitado → N=2; "Café" 5,00; "Bolo de cenoura" 7,50; cadastro=N12,500,0012,50Mensagem “quantidade inválida”, repete a pergunta e prossegue normalmente.
CT04Quantidade não inteira (RN01)N=2,5 → rejeitado → N=1; "Latte" 11,00; cadastro=S11,001,109,90Rejeita valor fracionário, repergunta, aplica desconto.
CT05Preço negativo (RN04)N=2; "Água" −3,00 → rejeitado → 4,00; "Croissant" 12,00; cadastro=S16,001,6014,40Rejeita apenas o preço; o nome já lido não é solicitado de novo.
CT06Preço zero (RN04)N=1; "Espresso" 0,00 → rejeitado → 3,50; cadastro=N3,500,003,50Zero é inválido (não existe item gratuito).
CT07Nome vazio (RN03)N=1; nome="" → rejeitado → "Chá de hortelã" 7,00; cadastro=S7,000,706,30Rejeita nome em branco e repete a leitura do nome.
CT08Resposta de cadastro inválida (RN06)N=2; "Mocha" 13,90; "Cookie" 6,10; cadastro="X" → rejeitado → S20,002,0018,00Mensagem “responda S ou N”, repete a pergunta.
CT09Resposta minúscula (RN06)N=1; "Café coado" 6,00; cadastro="s"6,000,605,40Aceita minúscula como equivalente a “S”.
CT10Recusa explícita de descontoN=2; "Torta de limão" 15,00; "Café" 5,00; cadastro="n"20,000,0020,00Valor cheio, desconto zerado.
CT11Arredondamento half-up (RN09)N=2; "Pingado" 4,55; "Sonho" 5,50; cadastro=S10,051,019,0410,05 × 0,10 = 1,005 → arredonda para 1,01; total fecha em 9,04.
CT12Limite máximo + pedido grande (RN02)N=51 → rejeitado → N=5; 45,00; 38,50; 52,80; 29,00; 22,00; cadastro=S187,3018,73168,57Rejeita quantidade acima de 50, repergunta e processa o pedido grande.

Cobertura: CT01/CT02/CT10 (fluxos principais) · CT03/CT04/CT12 (RN01, RN02) ·
CT07 (RN03) · CT05/CT06 (RN04) · CT08/CT09 (RN06) · CT02/CT11 (RN07, RN09) ·
CT03–CT08/CT12 (RN10 — nenhuma entrada inválida aborta o pedido).

6. Tabela de decisão

6.1 Tabela principal (entradas limitadas)

Condições

  • C1 — Quantidade informada é inteiro e está em [1, 50]? (RN01, RN02)
  • C2 — Item corrente tem nome preenchido e preço numérico > 0? (RN03, RN04)
  • C3 — Resposta sobre cadastro ∈ {S, s, N, n}? (RN06)
  • C4 — Resposta sobre cadastro é afirmativa (S/s)? (RN07)

Ações

  • A1 — Exibir erro de quantidade e reler a quantidade
  • A2 — Exibir erro do item e reler o campo inválido do mesmo item
  • A3 — Exibir erro e repetir a pergunta de cadastro
  • A4desconto ← arred2(subtotal × 0,10)
  • A5desconto ← 0
  • A6total ← subtotal − desconto
  • A7 — Exibir cupom e encerrar
Condição \ RegraR1R2R3R4R5
C1 — quantidade válidaNSSSS
C2 — item válidoNSSS
C3 — resposta S/N válidaNSS
C4 — cliente cadastradoSN
Ações
A1 — reler quantidadeX
A2 — reler campo do itemX
A3 — repetir pergunta cadastroX
A4 — desconto = 10%X
A5 — desconto = 0X
A6 — total = subtotal − descontoXX
A7 — exibir cupom / encerrarXX

S = verdadeiro · N = falso · = indiferente (condição ainda não avaliada no fluxo) ·
X = ação executada.

Leitura das regras: R1 a R3 são regras de validação — não avançam o fluxo, apenas
repetem a leitura correspondente (RN10). R4 e R5 são as regras de conclusão, mutuamente
exclusivas e coletivamente exaustivas: todo pedido válido termina em exatamente uma delas.

6.2 Tabela auxiliar — validação de campo do item (detalhe de C2)

Situação do campoNome vazio/só espaçosPreço não numéricoPreço ≤ 0Ação
R2.1SErro “nome obrigatório” → reler nome
R2.2NSErro “preço inválido” → reler preço
R2.3NNSErro “preço deve ser maior que zero” → reler preço
R2.4NNNAceitar item, acumular no subtotal

7. Pseudocódigo modularizado

Notação: Parâmetros com var são passados por referência; os demais, por valor.

// =====================================================================
//  ALGORITMO SimuladorDePedidosCafeteria
// =====================================================================
ALGORITMO SimuladorDePedidosCafeteria

// ---------------------------------------------------------------------
//  CONSTANTES
// ---------------------------------------------------------------------
CONST
    TAXA_DESCONTO : decimal     = 0.10     // RN07 — 10% para cliente cadastrado
    MIN_ITENS     : inteiro  = 1        // RN02
    MAX_ITENS     : inteiro  = 50       // RN02

// ---------------------------------------------------------------------
//  VARIÁVEIS GLOBAIS DO PROGRAMA PRINCIPAL
// ---------------------------------------------------------------------
VAR
    nomes      : vetor[1..MAX_ITENS] de texto
    precos     : vetor[1..MAX_ITENS] de decimal
    qtdItens   : inteiro
    subtotal   : decimal
    desconto   : decimal
    total      : decimal
    cadastrado : logico


// =====================================================================
//  MÓDULOS UTILITÁRIOS
// =====================================================================

// Arredondamento comercial para 2 casas decimais — RN09
FUNCAO Arredondar2 (valor : decimal) : decimal
INICIO
    RETORNE PISO(valor * 100 + 0.5) / 100
FIM

// Formatação monetária "R$ 0,00" — RN12
FUNCAO FormatarMoeda (valor : decimal) : texto
INICIO
    RETORNE "R$ " + FORMATAR(valor, 2, ",")   // sempre 2 casas decimais
FIM


// =====================================================================
//  MÓDULOS DE ENTRADA (leem e validam — RN10: nunca abortam)
// =====================================================================

// Lê a quantidade de itens — RN01, RN02
FUNCAO LerQuantidadeItens () : inteiro
VAR
    entrada : caractere
    n       : inteiro
    valido  : logico
INICIO
    valido = FALSO
    REPITA
        ESCREVA "Quantos itens o cliente vai pedir? "
        LEIA entrada

        SE NAO EhInteiro(entrada) ENTAO
            ESCREVA "[ERRO] Informe um numero inteiro."
        SENAO
            n = ParaInteiro(entrada)
            SE (n < MIN_ITENS) OU (n > MAX_ITENS) ENTAO
                ESCREVA "[ERRO] A quantidade deve estar entre ",
                        MIN_ITENS, " e ", MAX_ITENS, "."
            SENAO
                valido = VERDADEIRO
            FIM_SE
        FIM_SE
    ATE valido

    RETORNE n
FIM

// Lê o nome de um item — RN03
FUNCAO LerNomeItem (indice : inteiro) : texto
VAR
    nome : texto
INICIO
    REPITA
        ESCREVA "Item ", indice, " - nome: "
        LEIA nome
        nome = SemEspacosNasBordas(nome)

        SE COMPRIMENTO(nome) == 0 ENTAO
            ESCREVA "[ERRO] O nome do item e obrigatorio."
        FIM_SE
    ATE COMPRIMENTO(nome) > 0

    RETORNE nome
FIM

// Lê o preço de um item — RN04
FUNCAO LerPrecoItem (indice : inteiro; nome : texto) : decimal
VAR
    entrada : texto
    preco   : decimal
    valido  : logico
INICIO
    valido = FALSO
    REPITA
        ESCREVA "Item ", indice, " (", nome, ") - preco: R$ "
        LEIA entrada

        SE NAO EhNumero(entrada) ENTAO
            ESCREVA "[ERRO] Informe um valor numerico."
        SENAO
            preco = ParaReal(entrada)
            SE preco <= 0 ENTAO
                ESCREVA "[ERRO] O preco deve ser maior que zero."
            SENAO
                valido = VERDADEIRO
            FIM_SE
        FIM_SE
    ATE valido

    RETORNE preco
FIM

// Lê a resposta sobre cadastro — RN06
FUNCAO LerClienteCadastrado () : logico
VAR
    resposta : texto
INICIO
    REPITA
        ESCREVA "O cliente e cadastrado? (S/N): "
        LEIA resposta
        resposta = MAIUSCULA(SemEspacosNasBordas(resposta))

        SE (resposta != "S") E (resposta != "N") ENTAO
            ESCREVA "[ERRO] Responda apenas S (sim) ou N (nao)."
        FIM_SE
    ATE (resposta == "S") OU (resposta == "N")

    RETORNE (resposta = "S")
FIM
// =====================================================================
//  MÓDULO DE REGISTRO DO PEDIDO
// =====================================================================

// Registra os N itens e devolve o subtotal — RN05
FUNCAO RegistrarPedido (qtd    : inteiro;
                    VAR nomes  : vetor[1..MAX_ITENS] de caractere;
                    VAR precos : vetor[1..MAX_ITENS] de real) : real
VAR
    i    : inteiro
    soma : real
INICIO
    soma <- 0

    PARA i DE 1 ATE qtd FACA
        nomes[i]  <- LerNomeItem(i)
        precos[i] <- LerPrecoItem(i, nomes[i])
        soma      <- soma + precos[i]
    FIM_PARA

    RETORNE Arredondar2(soma)
FIM


// =====================================================================
//  MÓDULOS DE CÁLCULO (regras de negócio puras — sem E/S)
// =====================================================================

// Desconto de 10% apenas para cliente cadastrado — RN07, RN09
FUNCAO CalcularDesconto (subtotal : real; cadastrado : logico) : real
INICIO
    SE cadastrado ENTAO
        RETORNE Arredondar2(subtotal * TAXA_DESCONTO)
    SENAO
        RETORNE 0
    FIM_SE
FIM

// Total a pagar — RN08, RN11
FUNCAO CalcularTotal (subtotal : real; desconto : real) : real
INICIO
    RETORNE Arredondar2(subtotal - desconto)
FIM


// =====================================================================
//  MÓDULOS DE SAÍDA
// =====================================================================

PROCEDIMENTO ExibirCabecalho ()
INICIO
    ESCREVA "======================================="
    ESCREVA "   CAFETERIA - ATENDIMENTO NO BALCAO   "
    ESCREVA "======================================="
FIM

PROCEDIMENTO ExibirCupom (qtd        : inteiro;
                          nomes      : vetor[1..MAX_ITENS] de caractere;
                          precos     : vetor[1..MAX_ITENS] de decimal;
                          subtotal   : decimal;
                          desconto   : decimal;
                          total      : decimal;
                          cadastrado : logico)
VAR
    i : inteiro
INICIO
    ESCREVA "---------------------------------------"
    ESCREVA "                CUPOM                  "
    ESCREVA "---------------------------------------"

    PARA i DE 1 ATE qtd FACA
        ESCREVA i, ") ", nomes[i], " .......... ", FormatarMoeda(precos[i])
    FIM_PARA

    ESCREVA "---------------------------------------"
    ESCREVA "Subtotal ................ ", FormatarMoeda(subtotal)

    SE cadastrado ENTAO
        ESCREVA "Cliente cadastrado: desconto de 10%"
        ESCREVA "Desconto ................ -", FormatarMoeda(desconto)
    SENAO
        ESCREVA "Cliente nao cadastrado: sem desconto"
    FIM_SE

    ESCREVA "---------------------------------------"
    ESCREVA "TOTAL A PAGAR ........... ", FormatarMoeda(total)
    ESCREVA "======================================="
FIM


// =====================================================================
//  PROGRAMA PRINCIPAL
// =====================================================================
INICIO
    ExibirCabecalho()

    qtdItens   = LerQuantidadeItens()                          // Passo 1
    subtotal   = RegistrarPedido(qtdItens, nomes, precos)      // Passo 2
    cadastrado = LerClienteCadastrado()                        // Passo 3

    desconto   = CalcularDesconto(subtotal, cadastrado)        // Passo 4
    total      = CalcularTotal(subtotal, desconto)

    ExibirCupom(qtdItens, nomes, precos,                        // Passo 5
                subtotal, desconto, total, cadastrado)
FIM

7.1 Mapa de módulos

MóduloTipoResponsabilidadeRegras cobertas
Arredondar2FunçãoArredondamento comercial em 2 casasRN09
FormatarMoedaFunçãoFormatação R$ 0,00RN12
LerQuantidadeItensFunçãoLer e validar NRN01, RN02, RN10
LerNomeItemFunçãoLer e validar nomeRN03, RN10
LerPrecoItemFunçãoLer e validar preçoRN04, RN10
LerClienteCadastradoFunçãoLer e validar S/NRN06, RN10
RegistrarPedidoFunçãoLaço dos itens + subtotalRN05
CalcularDescontoFunçãoAplicar (ou não) os 10%RN07, RN09
CalcularTotalFunçãoSubtotal − descontoRN08, RN11
ExibirCabecalhoProcedimentoAbertura do atendimento
ExibirCupomProcedimentoSaída formatadaRN12
PrincipalOrquestração dos 5 passos

Critério de modularização adotado: separação entre entrada validada, regra de negócio
pura
e saída. As funções CalcularDesconto e CalcularTotal não fazem leitura nem
escrita — dependem apenas dos parâmetros —, o que as torna diretamente testáveis pelos casos
CT01–CT12 sem simular o teclado.

NOTAS

Três decisões de projeto que precisei tomar por não estarem no enunciado, e que vale você conferir:

  • Preço zero é rejeitado (RN04, preço > 0). Se a cafeteria tiver brindes ou cortesias, isso vira preço ≥ 0.
  • Arredondamento half-up aplicado ao desconto, com o total derivado dele — assim subtotal, desconto e total sempre fecham. É o caso CT11 (10,05 → desconto 1,01 → total 9,04).
  • Limite de 50 itens (RN02), como proteção contra erro de digitação. É um limite operacional que inventei; se não fizer sentido no seu contexto, basta remover a constante MAX_ITENS e a segunda metade da validação.

Simulador de Pedidos — Cafeteria

Saídas de tela dos 12 casos de teste (CT01 a CT12)

Execuções simuladas do algoritmo descrito em simulador-cafeteria.md. Cada bloco reproduz a
sessão completa no terminal: prompts, entradas do atendente, mensagens de erro e o cupom final.

Convenções de leitura

  • O texto após cada prompt (? , : , R$ ) é o que o atendente digitou.
  • ‹enter› representa uma entrada vazia (o atendente apenas pressionou Enter).
  • As mensagens do sistema saem sem acentuação, conforme os literais do pseudocódigo;
    os nomes dos itens preservam a acentuação porque são dados digitados pelo atendente.
  • O separador .......... do cupom é fixo (10 pontos), exatamente como o procedimento
    ExibirCupom o escreve.

CT01 — Caminho feliz: não cadastrado, 1 item

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 1
Item 1 - nome: Café expresso
Item 1 (Café expresso) - preco: R$ 5,00
O cliente e cadastrado? (S/N): N
---------------------------------------
                CUPOM
---------------------------------------
1) Café expresso .......... R$ 5,00
---------------------------------------
Subtotal ................ R$ 5,00
Cliente nao cadastrado: sem desconto
---------------------------------------
TOTAL A PAGAR ........... R$ 5,00
=======================================

CT02 — Caminho feliz: cadastrado, 3 itens

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 3
Item 1 - nome: Cappuccino
Item 1 (Cappuccino) - preco: R$ 9,50
Item 2 - nome: Pão de queijo
Item 2 (Pão de queijo) - preco: R$ 6,00
Item 3 - nome: Suco de laranja
Item 3 (Suco de laranja) - preco: R$ 8,00
O cliente e cadastrado? (S/N): S
---------------------------------------
                CUPOM
---------------------------------------
1) Cappuccino .......... R$ 9,50
2) Pão de queijo .......... R$ 6,00
3) Suco de laranja .......... R$ 8,00
---------------------------------------
Subtotal ................ R$ 23,50
Cliente cadastrado: desconto de 10%
Desconto ................ -R$ 2,35
---------------------------------------
TOTAL A PAGAR ........... R$ 21,15
=======================================

CT03 — Quantidade zero rejeitada (RN02)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 0
[ERRO] A quantidade deve estar entre 1 e 50.
Quantos itens o cliente vai pedir? 2
Item 1 - nome: Café
Item 1 (Café) - preco: R$ 5,00
Item 2 - nome: Bolo de cenoura
Item 2 (Bolo de cenoura) - preco: R$ 7,50
O cliente e cadastrado? (S/N): N
---------------------------------------
                CUPOM
---------------------------------------
1) Café .......... R$ 5,00
2) Bolo de cenoura .......... R$ 7,50
---------------------------------------
Subtotal ................ R$ 12,50
Cliente nao cadastrado: sem desconto
---------------------------------------
TOTAL A PAGAR ........... R$ 12,50
=======================================

CT04 — Quantidade não inteira rejeitada (RN01)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 2,5
[ERRO] Informe um numero inteiro.
Quantos itens o cliente vai pedir? 1
Item 1 - nome: Latte
Item 1 (Latte) - preco: R$ 11,00
O cliente e cadastrado? (S/N): S
---------------------------------------
                CUPOM
---------------------------------------
1) Latte .......... R$ 11,00
---------------------------------------
Subtotal ................ R$ 11,00
Cliente cadastrado: desconto de 10%
Desconto ................ -R$ 1,10
---------------------------------------
TOTAL A PAGAR ........... R$ 9,90
=======================================

CT05 — Preço negativo rejeitado; nome não é relido (RN04)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 2
Item 1 - nome: Água
Item 1 (Água) - preco: R$ -3,00
[ERRO] O preco deve ser maior que zero.
Item 1 (Água) - preco: R$ 4,00
Item 2 - nome: Croissant
Item 2 (Croissant) - preco: R$ 12,00
O cliente e cadastrado? (S/N): S
---------------------------------------
                CUPOM
---------------------------------------
1) Água .......... R$ 4,00
2) Croissant .......... R$ 12,00
---------------------------------------
Subtotal ................ R$ 16,00
Cliente cadastrado: desconto de 10%
Desconto ................ -R$ 1,60
---------------------------------------
TOTAL A PAGAR ........... R$ 14,40
=======================================

CT06 — Preço zero rejeitado (RN04)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 1
Item 1 - nome: Espresso
Item 1 (Espresso) - preco: R$ 0,00
[ERRO] O preco deve ser maior que zero.
Item 1 (Espresso) - preco: R$ 3,50
O cliente e cadastrado? (S/N): N
---------------------------------------
                CUPOM
---------------------------------------
1) Espresso .......... R$ 3,50
---------------------------------------
Subtotal ................ R$ 3,50
Cliente nao cadastrado: sem desconto
---------------------------------------
TOTAL A PAGAR ........... R$ 3,50
=======================================

CT07 — Nome vazio rejeitado (RN03)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 1
Item 1 - nome: ‹enter›
[ERRO] O nome do item e obrigatorio.
Item 1 - nome: Chá de hortelã
Item 1 (Chá de hortelã) - preco: R$ 7,00
O cliente e cadastrado? (S/N): S
---------------------------------------
                CUPOM
---------------------------------------
1) Chá de hortelã .......... R$ 7,00
---------------------------------------
Subtotal ................ R$ 7,00
Cliente cadastrado: desconto de 10%
Desconto ................ -R$ 0,70
---------------------------------------
TOTAL A PAGAR ........... R$ 6,30
=======================================

CT08 — Resposta de cadastro inválida (RN06)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 2
Item 1 - nome: Mocha
Item 1 (Mocha) - preco: R$ 13,90
Item 2 - nome: Cookie
Item 2 (Cookie) - preco: R$ 6,10
O cliente e cadastrado? (S/N): X
[ERRO] Responda apenas S (sim) ou N (nao).
O cliente e cadastrado? (S/N): S
---------------------------------------
                CUPOM
---------------------------------------
1) Mocha .......... R$ 13,90
2) Cookie .......... R$ 6,10
---------------------------------------
Subtotal ................ R$ 20,00
Cliente cadastrado: desconto de 10%
Desconto ................ -R$ 2,00
---------------------------------------
TOTAL A PAGAR ........... R$ 18,00
=======================================

CT09 — Resposta minúscula aceita (RN06)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 1
Item 1 - nome: Café coado
Item 1 (Café coado) - preco: R$ 6,00
O cliente e cadastrado? (S/N): s
---------------------------------------
                CUPOM
---------------------------------------
1) Café coado .......... R$ 6,00
---------------------------------------
Subtotal ................ R$ 6,00
Cliente cadastrado: desconto de 10%
Desconto ................ -R$ 0,60
---------------------------------------
TOTAL A PAGAR ........... R$ 5,40
=======================================

CT10 — Recusa explícita: valor cheio (RN07)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 2
Item 1 - nome: Torta de limão
Item 1 (Torta de limão) - preco: R$ 15,00
Item 2 - nome: Café
Item 2 (Café) - preco: R$ 5,00
O cliente e cadastrado? (S/N): n
---------------------------------------
                CUPOM
---------------------------------------
1) Torta de limão .......... R$ 15,00
2) Café .......... R$ 5,00
---------------------------------------
Subtotal ................ R$ 20,00
Cliente nao cadastrado: sem desconto
---------------------------------------
TOTAL A PAGAR ........... R$ 20,00
=======================================

CT11 — Arredondamento half-up do desconto (RN09)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 2
Item 1 - nome: Pingado
Item 1 (Pingado) - preco: R$ 4,55
Item 2 - nome: Sonho
Item 2 (Sonho) - preco: R$ 5,50
O cliente e cadastrado? (S/N): S
---------------------------------------
                CUPOM
---------------------------------------
1) Pingado .......... R$ 4,55
2) Sonho .......... R$ 5,50
---------------------------------------
Subtotal ................ R$ 10,05
Cliente cadastrado: desconto de 10%
Desconto ................ -R$ 1,01
---------------------------------------
TOTAL A PAGAR ........... R$ 9,04
=======================================

Nota de cálculo: 10,05 × 0,10 = 1,005Arredondar2 (half-up) → 1,01.
O total usa o desconto já arredondado: 10,05 − 1,01 = 9,04. Assim as três linhas do
cupom fecham entre si, sem centavo órfão.


CT12 — Quantidade acima do limite rejeitada + pedido grande (RN02)

=======================================
   CAFETERIA - ATENDIMENTO NO BALCAO
=======================================
Quantos itens o cliente vai pedir? 51
[ERRO] A quantidade deve estar entre 1 e 50.
Quantos itens o cliente vai pedir? 5
Item 1 - nome: Bandeja de salgados
Item 1 (Bandeja de salgados) - preco: R$ 45,00
Item 2 - nome: Bolo inteiro
Item 2 (Bolo inteiro) - preco: R$ 38,50
Item 3 - nome: Cesta de café especial
Item 3 (Cesta de café especial) - preco: R$ 52,80
Item 4 - nome: Kit lanche
Item 4 (Kit lanche) - preco: R$ 29,00
Item 5 - nome: Garrafa térmica de café
Item 5 (Garrafa térmica de café) - preco: R$ 22,00
O cliente e cadastrado? (S/N): S
---------------------------------------
                CUPOM
---------------------------------------
1) Bandeja de salgados .......... R$ 45,00
2) Bolo inteiro .......... R$ 38,50
3) Cesta de café especial .......... R$ 52,80
4) Kit lanche .......... R$ 29,00
5) Garrafa térmica de café .......... R$ 22,00
---------------------------------------
Subtotal ................ R$ 187,30
Cliente cadastrado: desconto de 10%
Desconto ................ -R$ 18,73
---------------------------------------
TOTAL A PAGAR ........... R$ 168,57
=======================================

Quadro-resumo dos 12 cupons

CasoItensErros disparadosCadastradoSubtotalDescontoTotal
CT011NãoR$ 5,00R$ 0,00R$ 5,00
CT023SimR$ 23,50R$ 2,35R$ 21,15
CT0321 (quantidade fora da faixa)NãoR$ 12,50R$ 0,00R$ 12,50
CT0411 (quantidade não inteira)SimR$ 11,00R$ 1,10R$ 9,90
CT0521 (preço negativo)SimR$ 16,00R$ 1,60R$ 14,40
CT0611 (preço zero)NãoR$ 3,50R$ 0,00R$ 3,50
CT0711 (nome vazio)SimR$ 7,00R$ 0,70R$ 6,30
CT0821 (resposta S/N inválida)SimR$ 20,00R$ 2,00R$ 18,00
CT091SimR$ 6,00R$ 0,60R$ 5,40
CT102NãoR$ 20,00R$ 0,00R$ 20,00
CT112SimR$ 10,05R$ 1,01R$ 9,04
CT1251 (quantidade acima do máximo)SimR$ 187,30R$ 18,73R$ 168,57

Conferência das invariantes — em todos os 12 cupons:
total = subtotal − desconto (RN08) · 0 ≤ total ≤ subtotal (RN11) ·
desconto = 0 ⟺ cliente não cadastrado (RN07) · todos os valores com 2 casas decimais (RN12) ·
nenhum erro de entrada abortou a execução (RN10).