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