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: Calculando pedidos

Você está desenvolvendo uma funcionalidade para um aplicativo de lanchonete. O sistema precisa calcular o valor total de um pedido com base na quantidade de itens solicitados.

O cliente pode pedir:

Hambúrguer: R$ 12,00
Batata frita: R$ 7,00
Refrigerante: R$ 5,00
etc.

Sua tarefa é criar um algoritmo em linguagem natural ou fluxograma que armazene os dados necessários em variáveis e faça o cálculo do valor total com base nas quantidades informadas. Abaixo Segue a solução proposta.

8 respostas
solução!

Aplicativo de Lanchonete — Cálculo do Valor Total do Pedido

Algoritmo em linguagem natural, fluxograma e pseudocódigo


1. Especificação

Funcionalidade para um aplicativo de lanchonete que calcula o valor total de um pedido com base na quantidade de itens solicitados.

ItemDescrição
EntradaA quantidade solicitada de cada item do cardápio (números inteiros, zero ou mais)
ProcessamentoMultiplicar cada quantidade pelo preço unitário correspondente e somar os subtotais
SaídaCupom com o subtotal de cada item pedido, a quantidade total de itens e o valor total do pedido

1.1 Cardápio (itens originais + itens criados)

Cód.ItemCategoriaPreço unitárioOrigem
1HambúrguerLanchesR$ 12,00enunciado
2X-SaladaLanchesR$ 15,00criado
3Cachorro-quenteLanchesR$ 9,00criado
4Batata fritaAcompanhamentosR$ 7,00enunciado
5Porção de nuggetsAcompanhamentosR$ 10,00criado
6RefrigeranteBebidasR$ 5,00enunciado
7Suco naturalBebidasR$ 6,00criado
8Milk-shakeBebidasR$ 11,00criado

1.2 Dicionário de variáveis

Constantes de preço — valores fixos, definidos pela lanchonete, nunca alterados durante a execução:

VariávelTipoValor
PRECO_HAMBURGUERdecimal12,00
PRECO_XSALADAdecimal15,00
PRECO_CACHORROdecimal9,00
PRECO_BATATAdecimal7,00
PRECO_NUGGETSdecimal10,00
PRECO_REFRIGERANTEdecimal5,00
PRECO_SUCOdecimal6,00
PRECO_MILKSHAKEdecimal11,00

Variáveis de quantidade — preenchidas pelo cliente:

VariávelTipoConteúdo
qtdHamburguer, qtdXsalada, qtdCachorrointeiroUnidades de cada lanche
qtdBatata, qtdNuggetsinteiroUnidades de cada acompanhamento
qtdRefrigerante, qtdSuco, qtdMilkshakeinteiroUnidades de cada bebida

Variáveis calculadas:

VariávelTipoConteúdo
subHamburguersubMilkshakedecimalquantidade × preço unitário de cada item
totalItensinteiroSoma de todas as quantidades
totalPedidodecimalSoma de todos os subtotais

2. Algoritmo em linguagem natural

Fase 1 — Definição dos preços (carga das constantes)

  1. Iniciar o processo.
  2. Armazenar em variáveis fixas o preço unitário de cada item do cardápio: hambúrguer 12,00; X-salada 15,00; cachorro-quente 9,00; batata frita 7,00; nuggets 10,00; refrigerante 5,00; suco natural 6,00; milk-shake 11,00.

    Os preços ficam em variáveis próprias, e não escritos direto na conta. Se a lanchonete reajustar a tabela, altera-se um ponto do algoritmo, e não todas as multiplicações.

  3. Zerar as variáveis totalPedido e totalItens, que serão usadas como acumuladores.

Fase 2 — Exibição do cardápio

  1. Exibir na tela o cardápio completo, com o nome e o preço unitário de cada um dos oito itens, para que o cliente saiba o que pode pedir e quanto custa.

Fase 3 — Leitura das quantidades

  1. Para cada um dos oito itens do cardápio, repetir o seguinte procedimento:
    1. Solicitar a quantidade desejada daquele item, deixando claro que zero é uma resposta válida (significa "não quero este item").
    2. Ler e armazenar o valor na variável de quantidade correspondente.
    3. Validar: se a quantidade for negativa ou não for um número inteiro, exibir "Quantidade inválida. Informe um número inteiro maior ou igual a zero." e voltar ao passo 5.1 para reler aquele mesmo item.
    4. Senão, prosseguir para o próximo item.

Fase 4 — Cálculo

  1. Calcular o subtotal de cada item, multiplicando a quantidade informada pelo preço unitário correspondente:

    • subHamburguer = qtdHamburguer × PRECO_HAMBURGUER
    • subXsalada = qtdXsalada × PRECO_XSALADA
    • subCachorro = qtdCachorro × PRECO_CACHORRO
    • subBatata = qtdBatata × PRECO_BATATA
    • subNuggets = qtdNuggets × PRECO_NUGGETS
    • subRefrigerante = qtdRefrigerante × PRECO_REFRIGERANTE
    • subSuco = qtdSuco × PRECO_SUCO
    • subMilkshake = qtdMilkshake × PRECO_MILKSHAKE

    Itens não pedidos têm quantidade zero, logo subtotal zero — eles participam da soma sem alterar o resultado. Não é preciso testar antes se o item foi ou não pedido.

  2. Calcular o valor total do pedido, somando os oito subtotais em totalPedido.

  3. Calcular a quantidade total de itens, somando as oito quantidades em totalItens.


3 - Fluxograma em texto (versão expandida com 3 itens)

Para caber na página, o diagrama abaixo mostra o padrão com apenas os três itens do enunciado. Os outros cinco seguem exatamente a mesma estrutura, encaixados na mesma sequência:

                  ╭──────────────────╮
                  │      INÍCIO      │
                  ╰────────┬─────────╯
                           │
        ┌──────────────────▼──────────────────┐
        │  PRECO_HAMBURGUER    = 12,00        │
        │  PRECO_BATATA        =  7,00        │   processo
        │  PRECO_REFRIGERANTE  =  5,00        │   (carga das constantes)
        │  ... demais preços ...              │
        └──────────────────┬──────────────────┘
                           │
        ┌──────────────────▼──────────────────┐
        │  totalPedido = 0                    │
        │  totalItens  = 0                    │
        └──────────────────┬──────────────────┘
                           │
        ┌──────────────────▼──────────────────┐
       /   EXIBIR cardápio (nomes e preços)   │
        └──────────────────┬──────────────────┘
                           │
   ┌───────────────────────▼─────────────────────┐
   │  ┌────────────────────────────────────────┐ │
   │ /   LER qtdHamburguer                     │ │◄──┐
   │  └────────────────────┬───────────────────┘ │   │
   │             ╱─────────▼─────────╲           │   │ NÃO
   │            ╱  qtdHamburguer ≥ 0  ╲──────────┼───┘
   │           ⟨    e é inteiro ?      ⟩         │
   │            ╲───────────────────╱            │
   │                      │ SIM                  │
   │  ┌───────────────────▼────────────────────┐ │
   │ /   LER qtdBatata      (mesma validação)  │ │
   │  └───────────────────┬────────────────────┘ │
   │  ┌───────────────────▼────────────────────┐ │
   │ /   LER qtdRefrigerante (mesma validação) │ │
   │  └───────────────────┬────────────────────┘ │
   │            ... demais 5 itens ...           │
   └───────────────────────┬─────────────────────┘
                           │
        ┌──────────────────▼──────────────────────────────┐
        │ subHamburguer  =  qtdHamburguer   × 12,00       │
        │ subBatata      =  qtdBatata       ×  7,00       │
        │ subRefrigerante = qtdRefrigerante ×  5,00       │
        │ ... demais subtotais ...                        │
        └──────────────────┬──────────────────────────────┘
                           │
        ┌──────────────────▼──────────────────┐
        │  totalPedido = soma dos subtotais   │
        │  totalItens  = soma das quantidades │
        └──────────────────┬──────────────────┘
                           │
                 ╱─────────▼─────────╲
                ╱   totalItens > 0 ?  ╲
      ┌────────⟨                       ⟩────────┐
      │  NÃO    ╲                     ╱   SIM   │
      │          ╲───────────────────╱          │
      ▼                                         ▼
┌──────────────────────┐        ┌────────────────────────────────┐
│ EXIBIR               /       /   EXIBIR CUPOM DO PEDIDO        │
│ "Nenhum item         │        │   (1 linha por item com qtd>0) │
/  foi solicitado."    │        └───────────────┬────────────────┘
└──────────┬───────────┘                        │
           │                    ┌───────────────▼────────────────┐
           │                   /   EXIBIR totalItens e           │
           │                    │   VALOR TOTAL do pedido        │
           │                    └───────────────┬────────────────┘
           │                                    │
           └─────────────────┬──────────────────┘
                             │
                    ╭────────▼─────────╮
                    │       FIM        │
                    ╰──────────────────╯

4. Pseudocódigo — versão direta

Atende literalmente ao enunciado: cada preço, cada quantidade e cada subtotal em sua própria variável nomeada.

Algoritmo "LANCHONETE_CALCULO_PEDIDO"

Var
   // ---------- PRECOS UNITARIOS (constantes de negocio) ----------
   PRECO_HAMBURGUER   : decimal
   PRECO_XSALADA      : decimal
   PRECO_CACHORRO     : decimal
   PRECO_BATATA       : decimal
   PRECO_NUGGETS      : decimal
   PRECO_REFRIGERANTE : decimal
   PRECO_SUCO         : decimal
   PRECO_MILKSHAKE    : decimal

   // ---------- QUANTIDADES INFORMADAS PELO CLIENTE ----------
   qtdHamburguer   : inteiro
   qtdXsalada      : inteiro
   qtdCachorro     : inteiro
   qtdBatata       : inteiro
   qtdNuggets      : inteiro
   qtdRefrigerante : inteiro
   qtdSuco         : inteiro
   qtdMilkshake    : inteiro

   // ---------- SUBTOTAIS ----------
   subHamburguer   : decimal
   subXsalada      : decimal
   subCachorro     : decimal
   subBatata       : decimal
   subNuggets      : decimal
   subRefrigerante : decimal
   subSuco         : decimal
   subMilkshake    : decimal

   // ---------- ACUMULADORES ----------
   totalPedido : decimal
   totalItens  : inteiro

Inicio
   // ============================================================
   // FASE 1 - CARGA DOS PRECOS
   // Alterar um preco aqui reajusta todo o sistema.
   // ============================================================
   PRECO_HAMBURGUER   = 12,00
   PRECO_XSALADA      = 15,00
   PRECO_CACHORRO     =  9,00
   PRECO_BATATA       =  7,00
   PRECO_NUGGETS      = 10,00
   PRECO_REFRIGERANTE =  5,00
   PRECO_SUCO         =  6,00
   PRECO_MILKSHAKE    = 11,00

   totalPedido = 0
   totalItens  = 0

   // ============================================================
   // FASE 2 - EXIBICAO DO CARDAPIO
   // ============================================================
   Escreval("========================================")
   Escreval("            CARDAPIO                    ")
   Escreval("========================================")
   Escreval("LANCHES")
   Escreval("  Hamburguer .............. R$ ", PRECO_HAMBURGUER:0:2)
   Escreval("  X-Salada ................ R$ ", PRECO_XSALADA:0:2)
   Escreval("  Cachorro-quente ......... R$ ", PRECO_CACHORRO:0:2)
   Escreval("ACOMPANHAMENTOS")
   Escreval("  Batata frita ............ R$ ", PRECO_BATATA:0:2)
   Escreval("  Porcao de nuggets ....... R$ ", PRECO_NUGGETS:0:2)
   Escreval("BEBIDAS")
   Escreval("  Refrigerante ............ R$ ", PRECO_REFRIGERANTE:0:2)
   Escreval("  Suco natural ............ R$ ", PRECO_SUCO:0:2)
   Escreval("  Milk-shake .............. R$ ", PRECO_MILKSHAKE:0:2)
   Escreval("========================================")
   Escreval("Informe a quantidade de cada item (0 = nao quero).")
   Escreval("")

   // ============================================================
   // FASE 3 - LEITURA DAS QUANTIDADES (com validacao por item)
   // Zero e resposta valida: por isso o teste e qtd < 0.
   // ============================================================
   Repita
      Escreva("Hamburguer      (R$ ", PRECO_HAMBURGUER:0:2, ") - qtd: ")
      Leia(qtdHamburguer)
      Se (qtdHamburguer < 0) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate (qtdHamburguer >= 0)

   Repita
      Escreva("X-Salada        (R$ ", PRECO_XSALADA:0:2, ") - qtd: ")
      Leia(qtdXsalada)
      Se (qtdXsalada < 0) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate (qtdXsalada >= 0)

   Repita
      Escreva("Cachorro-quente (R$ ", PRECO_CACHORRO:0:2, ") - qtd: ")
      Leia(qtdCachorro)
      Se (qtdCachorro < 0) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate (qtdCachorro >= 0)

   Repita
      Escreva("Batata frita    (R$ ", PRECO_BATATA:0:2, ") - qtd: ")
      Leia(qtdBatata)
      Se (qtdBatata < 0) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate (qtdBatata >= 0)

   Repita
      Escreva("Nuggets         (R$ ", PRECO_NUGGETS:0:2, ") - qtd: ")
      Leia(qtdNuggets)
      Se (qtdNuggets < 0) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate (qtdNuggets >= 0)

   Repita
      Escreva("Refrigerante    (R$ ", PRECO_REFRIGERANTE:0:2, ") - qtd: ")
      Leia(qtdRefrigerante)
      Se (qtdRefrigerante < 0) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate (qtdRefrigerante >= 0)

   Repita
      Escreva("Suco natural    (R$ ", PRECO_SUCO:0:2, ") - qtd: ")
      Leia(qtdSuco)
      Se (qtdSuco < 0) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate (qtdSuco >= 0)

'''

Algoritmo "LANCHONETE_CALCULO_PEDIDO" ( CONTINUAÇÃO)


 Repita
      Escreva("Milk-shake      (R$ ", PRECO_MILKSHAKE:0:2, ") - qtd: ")
      Leia(qtdMilkshake)
      Se (qtdMilkshake < 0) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate (qtdMilkshake >= 0)
   
   // ============================================================
   // FASE 4 - CALCULO DOS SUBTOTAIS E DOS TOTAIS
   // Itens nao pedidos tem qtd 0 e subtotal 0: entram na soma
   // sem alterar o resultado, dispensando testes condicionais.
   // ============================================================
   subHamburguer   = qtdHamburguer   * PRECO_HAMBURGUER
   subXsalada      = qtdXsalada      * PRECO_XSALADA
   subCachorro     = qtdCachorro     * PRECO_CACHORRO
   subBatata       = qtdBatata       * PRECO_BATATA
   subNuggets      = qtdNuggets      * PRECO_NUGGETS
   subRefrigerante = qtdRefrigerante * PRECO_REFRIGERANTE
   subSuco         = qtdSuco         * PRECO_SUCO
   subMilkshake    = qtdMilkshake    * PRECO_MILKSHAKE

   totalPedido = subHamburguer + subXsalada + subCachorro +
                  subBatata + subNuggets +
                  subRefrigerante + subSuco + subMilkshake

   totalItens  = qtdHamburguer + qtdXsalada + qtdCachorro +
                  qtdBatata + qtdNuggets +
                  qtdRefrigerante + qtdSuco + qtdMilkshake

   // ============================================================
   // FASE 5 - EMISSAO DO CUPOM
   // Aqui o teste qtd > 0 e de APRESENTACAO, nao de calculo:
   // evita imprimir linhas zeradas.
   // ============================================================
   Escreval("")
   Escreval("========================================")
   Escreval("            CUPOM DO PEDIDO             ")
   Escreval("========================================")

   Se (totalItens  IGUAL  0) Entao
      Escreval("Nenhum item foi solicitado.")
   Senao
      Escreval("ITEM              QTD    UNIT  SUBTOTAL")
      Escreval("----------------------------------------")

      Se (qtdHamburguer > 0) Entao
         Escreval("Hamburguer":16, qtdHamburguer:6,
                  PRECO_HAMBURGUER:8:2, subHamburguer:10:2)
      FimSe
      Se (qtdXsalada > 0) Entao
         Escreval("X-Salada":16, qtdXsalada:6,
                  PRECO_XSALADA:8:2, subXsalada:10:2)
      FimSe
      Se (qtdCachorro > 0) Entao
         Escreval("Cachorro-quente":16, qtdCachorro:6,
                  PRECO_CACHORRO:8:2, subCachorro:10:2)
      FimSe
      Se (qtdBatata > 0) Entao
         Escreval("Batata frita":16, qtdBatata:6,
                  PRECO_BATATA:8:2, subBatata:10:2)
      FimSe
      Se (qtdNuggets > 0) Entao
         Escreval("Nuggets":16, qtdNuggets:6,
                  PRECO_NUGGETS:8:2, subNuggets:10:2)
      FimSe
      Se (qtdRefrigerante > 0) Entao
         Escreval("Refrigerante":16, qtdRefrigerante:6,
                  PRECO_REFRIGERANTE:8:2, subRefrigerante:10:2)
      FimSe
      Se (qtdSuco > 0) Entao
         Escreval("Suco natural":16, qtdSuco:6,
                  PRECO_SUCO:8:2, subSuco:10:2)
      FimSe
      Se (qtdMilkshake > 0) Entao
         Escreval("Milk-shake":16, qtdMilkshake:6,
                  PRECO_MILKSHAKE:8:2, subMilkshake:10:2)
      FimSe

      Escreval("----------------------------------------")
      Escreval("TOTAL DE ITENS ..................: ", totalItens)
      Escreval("VALOR TOTAL .....................: R$ ", totalPedido:0:2)
   FimSe

   Escreval("========================================")

Fimalgoritmo

Nota sobre a validação: o enunciado pede quantidades inteiras. Como as variáveis qtd* são declaradas do tipo inteiro, o próprio interpretador recusa entradas fracionárias — por isso o Repita só precisa testar o sinal (qtd >= 0). Em linguagens de tipagem fraca, seria necessário verificar a integralidade explicitamente.


5. Pseudocódigo — versão modularizada

Os oito blocos Repita idênticos da versão anterior são o sintoma clássico de código que pede modularização. Aqui eles viram uma sub-rotina chamada oito vezes.

Algoritmo "LANCHONETE_CALCULO_PEDIDO_MODULAR"

// ============================================================
// AREA DE DADOS GLOBAIS
// ============================================================
Var
   // precos unitarios
   PRECO_HAMBURGUER, PRECO_XSALADA, PRECO_CACHORRO       : decimal
   PRECO_BATATA, PRECO_NUGGETS                            : decimal
   PRECO_REFRIGERANTE, PRECO_SUCO, PRECO_MILKSHAKE        : decimal

   // quantidades informadas
   qtdHamburguer, qtdXsalada, qtdCachorro                 : inteiro
   qtdBatata, qtdNuggets                                  : inteiro
   qtdRefrigerante, qtdSuco, qtdMilkshake                 : inteiro

   // acumuladores
   totalPedido : decimal
   totalItens  : inteiro

// ============================================================
// MODULO 1 - CARGA DOS PRECOS
// Unico ponto do sistema que conhece a tabela de precos.
// ============================================================
Procedimento DefinirPrecos()
Inicio
   PRECO_HAMBURGUER   = 12,00
   PRECO_XSALADA      = 15,00
   PRECO_CACHORRO     =  9,00
   PRECO_BATATA       =  7,00
   PRECO_NUGGETS      = 10,00
   PRECO_REFRIGERANTE =  5,00
   PRECO_SUCO         =  6,00
   PRECO_MILKSHAKE    = 11,00
FimProcedimento

// ============================================================
// MODULO 2 - LINHA DO CARDAPIO
// ============================================================
Procedimento LinhaCardapio(nome : texto ; preco : decimal)
Inicio
   Escreval("  ", nome:22, " R$ ", preco:6:2)
FimProcedimento


// ============================================================
// MODULO 3 - EXIBICAO DO CARDAPIO
// ============================================================
Procedimento ExibirCardapio()
Inicio
   Escreval("========================================")
   Escreval("               CARDAPIO                 ")
   Escreval("========================================")
   Escreval("LANCHES")
   LinhaCardapio("Hamburguer",        PRECO_HAMBURGUER)
   LinhaCardapio("X-Salada",          PRECO_XSALADA)
   LinhaCardapio("Cachorro-quente",   PRECO_CACHORRO)
   Escreval("ACOMPANHAMENTOS")
   LinhaCardapio("Batata frita",      PRECO_BATATA)
   LinhaCardapio("Porcao de nuggets", PRECO_NUGGETS)
   Escreval("BEBIDAS")
   LinhaCardapio("Refrigerante",      PRECO_REFRIGERANTE)
   LinhaCardapio("Suco natural",      PRECO_SUCO)
   LinhaCardapio("Milk-shake",        PRECO_MILKSHAKE)
   Escreval("========================================")
   Escreval("Informe a quantidade de cada item (0 = nao quero).")
   Escreval("")
FimProcedimento

// ============================================================
// MODULO 4 - VALIDACAO DA QUANTIDADE
// Zero e valido: significa "nao quero este item".
// ============================================================
Funcao QuantidadeValida(q : inteiro) : logico
Inicio
   Retorne (q >= 0)
FimFuncao

// ============================================================
// MODULO 5 - LEITURA DE UMA QUANTIDADE (reutilizado 8 vezes)
// Substitui os oito blocos Repita identicos da versao direta.
// ============================================================
Funcao LerQuantidade(nome : texto ; preco : decimal) : inteiro
Var
   q : inteiro
Inicio
   Repita
      Escreva(nome:16, " (R$ ", preco:0:2, ") - qtd: ")
      Leia(q)

      Se (NAO QuantidadeValida(q)) Entao
         Escreval(">> Quantidade invalida. Informe zero ou mais.")
      FimSe
   Ate QuantidadeValida(q)

   Retorne q
FimFuncao

// ============================================================
// MODULO 6 - LEITURA DO PEDIDO COMPLETO
// ============================================================
Procedimento LerPedido()
Inicio
   qtdHamburguer   = LerQuantidade("Hamburguer",      PRECO_HAMBURGUER)
   qtdXsalada      = LerQuantidade("X-Salada",        PRECO_XSALADA)
   qtdCachorro     =- LerQuantidade("Cachorro-quente", PRECO_CACHORRO)
   qtdBatata       = LerQuantidade("Batata frita",    PRECO_BATATA)
   qtdNuggets      = LerQuantidade("Nuggets",         PRECO_NUGGETS)
   qtdRefrigerante = LerQuantidade("Refrigerante",    PRECO_REFRIGERANTE)
   qtdSuco         = LerQuantidade("Suco natural",    PRECO_SUCO)
   qtdMilkshake    = LerQuantidade("Milk-shake",      PRECO_MILKSHAKE)
FimProcedimento


// ============================================================
// MODULO 7 - CALCULO DO SUBTOTAL DE UM ITEM
// Funcao pura: mesma entrada, mesma saida, sem efeito colateral.
// ============================================================
Funcao Subtotal(q : inteiro ; preco : decimal) : decimal
Inicio
   Retorne (q * preco)
FimFuncao

Algoritmo "LANCHONETE_CALCULO_PEDIDO_MODULAR" (CONTINUAÇÃO)

// ============================================================
// MODULO 8 - APURACAO DOS TOTAIS
// ============================================================
Procedimento CalcularTotais()
Inicio
   totalPedido <- Subtotal(qtdHamburguer,   PRECO_HAMBURGUER)   +
                  Subtotal(qtdXsalada,      PRECO_XSALADA)      +
                  Subtotal(qtdCachorro,     PRECO_CACHORRO)     +
                  Subtotal(qtdBatata,       PRECO_BATATA)       +
                  Subtotal(qtdNuggets,      PRECO_NUGGETS)      +
                  Subtotal(qtdRefrigerante, PRECO_REFRIGERANTE) +
                  Subtotal(qtdSuco,         PRECO_SUCO)         +
                  Subtotal(qtdMilkshake,    PRECO_MILKSHAKE)

   totalItens  <- qtdHamburguer + qtdXsalada + qtdCachorro +
                  qtdBatata + qtdNuggets +
                  qtdRefrigerante + qtdSuco + qtdMilkshake
FimProcedimento

// ============================================================
// MODULO 9 - LINHA DO CUPOM
// Imprime somente se o item foi realmente pedido.
// ============================================================
Procedimento LinhaCupom(nome : texto ; q : inteiro ; preco : decimal)
Inicio
   Se (q > 0) Entao
      Escreval(nome:16, q:6, preco:8:2, Subtotal(q, preco):10:2)
   FimSe
FimProcedimento


// ============================================================
// MODULO 10 - EMISSAO DO CUPOM
// ============================================================
Procedimento EmitirCupom()
Inicio
   Escreval("")
   Escreval("========================================")
   Escreval("            CUPOM DO PEDIDO             ")
   Escreval("========================================")

   Se (totalItens IGUAL 0) Entao
      Escreval("Nenhum item foi solicitado.")
   Senao
      Escreval("ITEM              QTD    UNIT  SUBTOTAL")
      Escreval("----------------------------------------")

      LinhaCupom("Hamburguer",      qtdHamburguer,   PRECO_HAMBURGUER)
      LinhaCupom("X-Salada",        qtdXsalada,      PRECO_XSALADA)
      LinhaCupom("Cachorro-quente", qtdCachorro,     PRECO_CACHORRO)
      LinhaCupom("Batata frita",    qtdBatata,       PRECO_BATATA)
      LinhaCupom("Nuggets",         qtdNuggets,      PRECO_NUGGETS)
      LinhaCupom("Refrigerante",    qtdRefrigerante, PRECO_REFRIGERANTE)
      LinhaCupom("Suco natural",    qtdSuco,         PRECO_SUCO)
      LinhaCupom("Milk-shake",      qtdMilkshake,    PRECO_MILKSHAKE)

      Escreval("----------------------------------------")
      Escreval("TOTAL DE ITENS ..................: ", totalItens)
      Escreval("VALOR TOTAL .....................: R$ ", totalPedido:0:2)
   FimSe

   Escreval("========================================")
FimProcedimento


// ============================================================
// PROGRAMA PRINCIPAL
// Apenas coordena os modulos - nenhuma regra de negocio aqui.
// ============================================================
Inicio
   DefinirPrecos()
   ExibirCardapio()
   LerPedido()
   CalcularTotais()
   EmitirCupom()

Fimalgoritmo

Catálogo de módulos do PSEUDOCODIGO MODULAR

MóduloTipoParâmetrosRetornoResponsabilidade
DefinirPrecosProcedimentoCarrega a tabela de preços
LinhaCardapioProcedimentonome, precoFormata uma linha do cardápio
ExibirCardapioProcedimentoMonta o cardápio completo
QuantidadeValidaFunçãoq: inteirologicoAceita zero ou mais
LerQuantidadeFunçãonome, precointeiroLê insistindo até obter valor válido
LerPedidoProcedimentoChama LerQuantidade para os 8 itens
SubtotalFunçãoq, precodecimalquantidade × preço
CalcularTotaisProcedimentoApura totalPedido e totalItens
LinhaCupomProcedimentonome, q, precoImprime a linha se q > 0
EmitirCupomProcedimentoMonta o cupom completo

Hierarquia de chamadas

PROGRAMA PRINCIPAL
│
├── DefinirPrecos()
│
├── ExibirCardapio()
│   └── LinhaCardapio(nome, preco)        [8x]
│
├── LerPedido()
│   └── LerQuantidade(nome, preco)        [8x]
│       └── QuantidadeValida(q)
│
├── CalcularTotais()
│   └── Subtotal(q, preco)                [8x]
│
└── EmitirCupom()
    └── LinhaCupom(nome, q, preco)        [8x]
        └── Subtotal(q, preco)

7. Teste de mesa e exemplo de execução

7.1 Pedido informado

ItemQuantidade digitada
Hambúrguer2
X-Salada1
Cachorro-quente0
Batata frita1
Porção de nuggets0
Refrigerante3
Suco natural0
Milk-shake1

7.2 Teste do Algoritmo

ItemqtdprecoSubtotal(qtd, preco)totalPedido acumuladototalItens acumulado
Hambúrguer212,0024,0024,002
X-Salada115,0015,0039,003
Cachorro-quente09,000,0039,003
Batata frita17,007,0046,004
Nuggets010,000,0046,004
Refrigerante35,0015,0061,007
Suco natural06,000,0061,007
Milk-shake111,0011,0072,008

7.3 Cupom gerado

========================================
            CUPOM DO PEDIDO
========================================
ITEM              QTD    UNIT  SUBTOTAL
----------------------------------------
Hamburguer          2   12.00     24.00
X-Salada            1   15.00     15.00
Batata frita        1    7.00      7.00
Refrigerante        3    5.00     15.00
Milk-shake          1   11.00     11.00
----------------------------------------
TOTAL DE ITENS .............: 8
VALOR TOTAL ................: R$ 72.00
========================================

7.4 Conferência do Calculo do Pedido

VerificaçãoCálculoResultado
Valor total24 + 15 + 0 + 7 + 0 + 15 + 0 + 11R$ 72,00
Total de itens2 + 1 + 0 + 1 + 0 + 3 + 0 + 18
Linhas impressas no cupomitens com qtd > 05 de 8

8. Comparação das versões do PSEUDOCODIGO (Direto e Modularizado)

CritérioDiretaModular
Linhas aproximadas~180~150
Blocos Repita de leitura8 idênticos1 (LerQuantidade)
Testes Se qtd > 0 no cupom8 idênticos1 (LinhaCupom)
Incluir um 9º item exige mexer em5 lugares4 lugares
Reajustar um preço exige mexer em1 lugar1 lugar
Aderência literal ao enunciadototal (uma variável por item)alta
Legibilidade com 8 itensboaótima
Legibilidade com 50 itensinviávelruim

Recomendação: para a entrega da atividade, a versão direta é a que atende ao enunciado ao pé da letra ("armazene os dados necessários em variáveis"). A versão modular é a que se defende melhor tecnicamente com o cardápio atual, por eliminar as oito repetições de leitura e as oito de impressão.


9. Decisões de projeto

  • Preços em variáveis, não em literais. A multiplicação é sempre quantidade × VARIAVEL_DE_PRECO. Escrever qtdHamburguer × 12 funcionaria, mas espalharia o valor 12 pelo algoritmo — e um reajuste exigiria caçar todas as ocorrências. Este é o requisito "armazene os dados necessários em variáveis" do enunciado.

  • Zero é resposta válida, não erro. O cliente que não quer batata frita digita 0. O subtotal correspondente fica zerado e a soma não é afetada. Por isso a validação testa qtd >= 0, e não qtd > 0.

  • Todos os oito subtotais entram na soma, sempre. Não há teste condicional antes de somar. Somar um zero é mais barato e mais seguro do que oito desvios condicionais — e elimina o risco de esquecer um item no encadeamento.

  • O teste quantidade > 0 aparece só na impressão do cupom. Ali ele tem propósito de apresentação: filtrar linhas irrelevantes. Separar "o que entra na conta" de "o que aparece no cupom" mantém o cálculo simples e a saída limpa.

  • Validação por item, com laço próprio. O módulo LerQuantidade volta para o mesmo item enquanto a entrada for inválida. Isso impede que um erro de digitação no terceiro item obrigue o cliente a refazer o pedido inteiro.

  • Repita ... Ate em vez de Enquanto. O laço pós-testado é o adequado para leitura validada, porque a entrada precisa acontecer pelo menos uma vez antes que haja o que validar.

  • A verificação totalItens = 0 protege o cupom vazio. Se o cliente digitar zero em tudo, o sistema informa isso explicitamente em vez de emitir um cupom com R$ 0,00 e nenhuma linha — que pareceria um defeito.

  • Subtotal é função pura. Recebe quantidade e preço, devolve o produto, não altera nada. Por isso pode ser chamada tanto por CalcularTotais quanto por LinhaCupom sem risco de efeito colateral ou de dupla contagem.

  • Caminho de crescimento do cardápio. Com oito itens, uma variável por item ainda é legível. A partir de uns quinze, a estrutura natural passa a ser dois vetores paralelos — nomeItem[] e precoItem[] — percorridos por um único laço Para. A lógica de cálculo é a mesma; muda apenas a forma de armazenar o cardápio.

  • Extensões possíveis sem alterar a estrutura. Combo promocional (desconto quando lanche + acompanhamento + bebida aparecem juntos), desconto por faixa de valor, taxa de entrega e opção de consumo no local × delivery entram todos entre CalcularTotais e EmitirCupom, sem tocar na leitura nem no cálculo dos subtotais.