Projeto guiado de pseudocódigo essencial: solução completa do enunciado ao algoritmo

Capítulo 15

Tempo estimado de leitura: 11 minutos

+ Exercício

Visão do projeto guiado

Neste projeto final, você vai praticar a transformação de um enunciado completo em um algoritmo pronto para implementação: identificar entradas e saídas, explicitar regras e casos-limite, decompor em módulos (funções/procedimentos), aplicar validações e finalizar com um conjunto de testes. O foco aqui é o processo de engenharia do pseudocódigo: sair do texto “solto” e chegar em uma solução organizada, verificável e fácil de codificar.

Enunciado do problema (requisitos claros)

Você deve criar um sistema de processamento de pedidos para uma pequena loja. O sistema mantém um cadastro simples de produtos, registra pedidos e gera um relatório final do dia.

Requisitos funcionais

  • Cadastro de produtos: cada produto tem codigo (inteiro), nome (texto), preco (real > 0) e estoque (inteiro ≥ 0).
  • Registro de pedidos: cada pedido tem idPedido (inteiro), uma lista de itens (codigoProduto, quantidade), e deve calcular subtotal, desconto, imposto e total.
  • Regras de desconto: se subtotal ≥ 200, desconto de 10%; senão, sem desconto.
  • Imposto: 8% aplicado sobre (subtotal − desconto).
  • Validação: não permitir quantidade ≤ 0; não permitir produto inexistente; não permitir quantidade maior que o estoque disponível.
  • Atualização de estoque: ao confirmar um pedido, reduzir o estoque dos produtos.
  • Relatório final: total de pedidos confirmados, faturamento total (soma dos totais), produto mais vendido (por quantidade), e lista de produtos com estoque abaixo de um limite (por exemplo, < 5).

Requisitos não funcionais (convenções do ebook)

  • Pseudocódigo com indentação consistente e blocos bem delimitados.
  • Nomes claros (verbos para funções/procedimentos, substantivos para dados).
  • Comentários curtos explicando intenção e regras importantes.
  • Controle de fluxo explícito para erros/validações (retornos antecipados quando fizer sentido).
  • Modularização: separar leitura/validação, cálculo, atualização e relatório.

Passo 1: Transformar o enunciado em entradas, saídas e dados

Entradas

  • Lista inicial de produtos (pode ser digitada no início do programa).
  • Sequência de pedidos (cada pedido com itens), até o usuário encerrar.
  • Limite de estoque baixo para o relatório (ex.: 5).

Saídas

  • Para cada pedido: confirmação/erro, e valores calculados (subtotal, desconto, imposto, total).
  • No final: relatório consolidado (métricas do dia e alertas de estoque).

Estruturas de dados necessárias

  • Produto: registro com codigo, nome, preco, estoque, vendidoAcumulado.
  • ItemPedido: registro com codigoProduto, quantidade, precoUnitario, totalItem.
  • Pedido: registro com idPedido, lista de itens, subtotal, desconto, imposto, total, confirmado.

Passo 2: Regras e casos-limite (antes do algoritmo)

Regras numéricas

  • preco deve ser > 0.
  • estoque deve ser ≥ 0.
  • quantidade do item deve ser > 0.
  • desconto = 10% do subtotal se subtotal ≥ 200; caso contrário, 0.
  • imposto = 8% de (subtotal − desconto).
  • total = (subtotal − desconto) + imposto.

Casos-limite e decisões de projeto

  • Pedido sem itens: decidir se é inválido. Neste projeto, será inválido (não confirma).
  • Produto repetido no mesmo pedido: consolidar quantidades (somar) para validar estoque corretamente.
  • Estoque insuficiente em qualquer item: o pedido inteiro não é confirmado (não altera estoque).
  • Produto inexistente: o pedido inteiro não é confirmado.
  • Arredondamento: manter valores em real; se necessário, arredondar apenas na exibição (decisão documentada em comentário).

Passo 3: Decomposição em módulos (mapa do algoritmo)

Antes de escrever o pseudocódigo, defina módulos com responsabilidades únicas. Um mapa possível:

  • CarregarProdutos(): lê e valida cadastro inicial.
  • EncontrarProdutoPorCodigo(produtos, codigo): retorna índice/posição ou -1.
  • LerPedido(produtos): lê itens, consolida repetidos e faz validações básicas.
  • ValidarPedidoContraEstoque(produtos, pedido): valida existência e estoque suficiente.
  • CalcularTotaisPedido(pedido): calcula subtotal, desconto, imposto e total.
  • ConfirmarPedido(produtos, pedido): aplica baixa de estoque e acumula vendidos.
  • AtualizarMetricasDia(metrica, pedido): soma faturamento e conta pedidos.
  • GerarRelatorio(produtos, metrica, limiteEstoqueBaixo): imprime métricas e alertas.

Passo 4: Pseudocódigo modular completo (com validações)

A seguir está uma solução completa, estruturada para ser implementada em qualquer linguagem. Ajuste apenas detalhes de leitura/armazenamento conforme o ambiente.

REGISTRO Produto    codigo: INTEIRO    nome: TEXTO    preco: REAL    estoque: INTEIRO    vendidoAcumulado: INTEIROFIMREGISTROREGISTRO ItemPedido    codigoProduto: INTEIRO    quantidade: INTEIRO    precoUnitario: REAL    totalItem: REALFIMREGISTROREGISTRO Pedido    idPedido: INTEIRO    itens: LISTA DE ItemPedido    subtotal: REAL    desconto: REAL    imposto: REAL    total: REAL    confirmado: LOGICOFIMREGISTROREGISTRO MetricasDia    totalPedidosConfirmados: INTEIRO    faturamentoTotal: REALFIMREGISTROFUNCAO EncontrarProdutoPorCodigo(produtos: LISTA DE Produto, codigo: INTEIRO) : INTEIRO    // Retorna a posição do produto na lista ou -1 se não encontrado    PARA i DE 0 A TAMANHO(produtos) - 1 FACA        SE produtos[i].codigo = codigo ENTAO            RETORNE i        FIMSE    FIMPARA    RETORNE -1FIMFUNCAOFUNCAO LerInteiroPositivo(mensagem: TEXTO) : INTEIRO    // Leitura com validação: inteiro > 0    ENQUANTO VERDADEIRO FACA        ESCREVA(mensagem)        LEIA(valor)        SE valor > 0 ENTAO            RETORNE valor        SENAO            ESCREVA("Valor invalido. Informe um inteiro maior que zero.")        FIMSE    FIMENQUANTOFIMFUNCAOFUNCAO LerRealPositivo(mensagem: TEXTO) : REAL    // Leitura com validação: real > 0    ENQUANTO VERDADEIRO FACA        ESCREVA(mensagem)        LEIA(valor)        SE valor > 0 ENTAO            RETORNE valor        SENAO            ESCREVA("Valor invalido. Informe um numero maior que zero.")        FIMSE    FIMENQUANTOFIMFUNCAOFUNCAO CarregarProdutos() : LISTA DE Produto    produtos <- LISTA_VAZIA()    qtd <- LerInteiroPositivo("Quantos produtos deseja cadastrar? ")    PARA k DE 1 A qtd FACA        ESCREVA("Produto ", k)        codigo <- LerInteiroPositivo("Codigo (inteiro > 0): ")        // Evita codigo duplicado        SE EncontrarProdutoPorCodigo(produtos, codigo) != -1 ENTAO            ESCREVA("Codigo ja existe. Cadastre novamente este produto.")            k <- k - 1            CONTINUE        FIMSE        ESCREVA("Nome: ")        LEIA(nome)        preco <- LerRealPositivo("Preco (> 0): ")        ESCREVA("Estoque (inteiro >= 0): ")        LEIA(estoque)        SE estoque < 0 ENTAO            ESCREVA("Estoque invalido. Cadastre novamente este produto.")            k <- k - 1            CONTINUE        FIMSE        p: Produto        p.codigo <- codigo        p.nome <- nome        p.preco <- preco        p.estoque <- estoque        p.vendidoAcumulado <- 0        ADICIONE(produtos, p)    FIMPARA    RETORNE produtosFIMFUNCAOFUNCAO ConsolidarItem(itens: LISTA DE ItemPedido, codigoProduto: INTEIRO, quantidade: INTEIRO) : LISTA DE ItemPedido    // Se o produto ja estiver na lista, soma a quantidade; senao, adiciona novo item    PARA i DE 0 A TAMANHO(itens) - 1 FACA        SE itens[i].codigoProduto = codigoProduto ENTAO            itens[i].quantidade <- itens[i].quantidade + quantidade            RETORNE itens        FIMSE    FIMPARA    novo: ItemPedido    novo.codigoProduto <- codigoProduto    novo.quantidade <- quantidade    novo.precoUnitario <- 0    novo.totalItem <- 0    ADICIONE(itens, novo)    RETORNE itensFIMFUNCAOFUNCAO LerPedido(produtos: LISTA DE Produto, idPedido: INTEIRO) : Pedido    pedido: Pedido    pedido.idPedido <- idPedido    pedido.itens <- LISTA_VAZIA()    pedido.subtotal <- 0    pedido.desconto <- 0    pedido.imposto <- 0    pedido.total <- 0    pedido.confirmado <- FALSO    ESCREVA("Quantos itens neste pedido? ")    LEIA(qtdItens)    SE qtdItens <= 0 ENTAO        ESCREVA("Pedido invalido: deve conter ao menos 1 item.")        RETORNE pedido    FIMSE    PARA n DE 1 A qtdItens FACA        codigo <- LerInteiroPositivo("Codigo do produto: ")        quantidade <- LerInteiroPositivo("Quantidade (> 0): ")        // Validacao basica de existencia aqui ajuda a evitar itens sem sentido        pos <- EncontrarProdutoPorCodigo(produtos, codigo)        SE pos = -1 ENTAO            ESCREVA("Produto inexistente. Pedido sera marcado como invalido.")            // Mantem pedido como nao confirmado e retorna cedo (regra: pedido inteiro falha)            RETORNE pedido        FIMSE        pedido.itens <- ConsolidarItem(pedido.itens, codigo, quantidade)    FIMPARA    RETORNE pedidoFIMFUNCAOFUNCAO ValidarPedidoContraEstoque(produtos: LISTA DE Produto, pedido: Pedido) : LOGICO    // Verifica se todos os itens existem e se ha estoque suficiente para cada um    PARA i DE 0 A TAMANHO(pedido.itens) - 1 FACA        codigo <- pedido.itens[i].codigoProduto        qtd <- pedido.itens[i].quantidade        SE qtd <= 0 ENTAO            RETORNE FALSO        FIMSE        pos <- EncontrarProdutoPorCodigo(produtos, codigo)        SE pos = -1 ENTAO            RETORNE FALSO        FIMSE        SE qtd > produtos[pos].estoque ENTAO            RETORNE FALSO        FIMSE    FIMPARA    RETORNE VERDADEIROFIMFUNCAOPROCEDIMENTO CalcularTotaisPedido(VAR pedido: Pedido, produtos: LISTA DE Produto)    // Preenche precoUnitario/totalItem e calcula subtotal, desconto, imposto e total    subtotal <- 0    PARA i DE 0 A TAMANHO(pedido.itens) - 1 FACA        pos <- EncontrarProdutoPorCodigo(produtos, pedido.itens[i].codigoProduto)        // pos deve existir se validado antes; ainda assim, mantemos a busca para obter preco atual        preco <- produtos[pos].preco        pedido.itens[i].precoUnitario <- preco        pedido.itens[i].totalItem <- preco * pedido.itens[i].quantidade        subtotal <- subtotal + pedido.itens[i].totalItem    FIMPARA    pedido.subtotal <- subtotal    SE pedido.subtotal >= 200 ENTAO        pedido.desconto <- pedido.subtotal * 0.10    SENAO        pedido.desconto <- 0    FIMSE    baseImposto <- pedido.subtotal - pedido.desconto    pedido.imposto <- baseImposto * 0.08    pedido.total <- baseImposto + pedido.impostoFIMPROCEDIMENTOPROCEDIMENTO ConfirmarPedido(VAR produtos: LISTA DE Produto, VAR pedido: Pedido)    // Aplica baixa de estoque e acumula vendidos; deve ser chamado apenas apos validacao completa    PARA i DE 0 A TAMANHO(pedido.itens) - 1 FACA        pos <- EncontrarProdutoPorCodigo(produtos, pedido.itens[i].codigoProduto)        qtd <- pedido.itens[i].quantidade        produtos[pos].estoque <- produtos[pos].estoque - qtd        produtos[pos].vendidoAcumulado <- produtos[pos].vendidoAcumulado + qtd    FIMPARA    pedido.confirmado <- VERDADEIROFIMPROCEDIMENTOPROCEDIMENTO AtualizarMetricasDia(VAR metrica: MetricasDia, pedido: Pedido)    SE pedido.confirmado = VERDADEIRO ENTAO        metrica.totalPedidosConfirmados <- metrica.totalPedidosConfirmados + 1        metrica.faturamentoTotal <- metrica.faturamentoTotal + pedido.total    FIMSEFIMPROCEDIMENTOFUNCAO EncontrarProdutoMaisVendido(produtos: LISTA DE Produto) : INTEIRO    // Retorna a posicao do produto com maior vendidoAcumulado; em empate, o primeiro    SE TAMANHO(produtos) = 0 ENTAO        RETORNE -1    FIMSE    melhorPos <- 0    PARA i DE 1 A TAMANHO(produtos) - 1 FACA        SE produtos[i].vendidoAcumulado > produtos[melhorPos].vendidoAcumulado ENTAO            melhorPos <- i        FIMSE    FIMPARA    RETORNE melhorPosFIMFUNCAOPROCEDIMENTO GerarRelatorio(produtos: LISTA DE Produto, metrica: MetricasDia, limiteEstoqueBaixo: INTEIRO)    ESCREVA("--- RELATORIO DO DIA ---")    ESCREVA("Pedidos confirmados: ", metrica.totalPedidosConfirmados)    ESCREVA("Faturamento total: ", metrica.faturamentoTotal)    posMaisVendido <- EncontrarProdutoMaisVendido(produtos)    SE posMaisVendido != -1 ENTAO        ESCREVA("Produto mais vendido: ", produtos[posMaisVendido].nome, " (", produtos[posMaisVendido].vendidoAcumulado, ")")    FIMSE    ESCREVA("Produtos com estoque abaixo de ", limiteEstoqueBaixo, ":")    PARA i DE 0 A TAMANHO(produtos) - 1 FACA        SE produtos[i].estoque < limiteEstoqueBaixo ENTAO            ESCREVA("- ", produtos[i].codigo, " ", produtos[i].nome, " | estoque: ", produtos[i].estoque)        FIMSE    FIMPARA    ESCREVA("--- FIM DO RELATORIO ---")FIMPROCEDIMENTOPROGRAMA Principal    produtos <- CarregarProdutos()    metrica: MetricasDia    metrica.totalPedidosConfirmados <- 0    metrica.faturamentoTotal <- 0    limiteEstoqueBaixo <- 5    idPedido <- 1    ENQUANTO VERDADEIRO FACA        ESCREVA("Registrar novo pedido? (S/N): ")        LEIA(resp)        SE resp != "S" ENTAO            PARE        FIMSE        pedido <- LerPedido(produtos, idPedido)        // Se LerPedido retornou sem itens ou com produto inexistente, pedido.confirmado permanece FALSO        SE TAMANHO(pedido.itens) = 0 ENTAO            ESCREVA("Pedido nao confirmado.")            idPedido <- idPedido + 1            CONTINUE        FIMSE        SE ValidarPedidoContraEstoque(produtos, pedido) = FALSO ENTAO            ESCREVA("Pedido nao confirmado: estoque insuficiente ou dados invalidos.")            idPedido <- idPedido + 1            CONTINUE        FIMSE        CalcularTotaisPedido(pedido, produtos)        ConfirmarPedido(produtos, pedido)        AtualizarMetricasDia(metrica, pedido)        ESCREVA("Pedido confirmado. Subtotal: ", pedido.subtotal, " Desconto: ", pedido.desconto, " Imposto: ", pedido.imposto, " Total: ", pedido.total)        idPedido <- idPedido + 1    FIMENQUANTO    GerarRelatorio(produtos, metrica, limiteEstoqueBaixo)FIMPROGRAMA

Passo 5: Conjunto de testes (tabela de casos)

Use a tabela abaixo para validar comportamento, regras e casos-limite. A ideia é que cada caso seja executável manualmente (simulando entradas) e tenha um resultado esperado objetivo.

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

Baixar o aplicativo

IDProdutos (codigo:preco/estoque)Pedido (itens)Esperado
T011:50/10, 2:30/10(1,2) (2,1)Confirma; subtotal=130; desconto=0; imposto=10.4; total=140.4; estoque 1=8, 2=9
T021:100/10, 2:50/10(1,1) (2,2)Confirma; subtotal=200; desconto=20; imposto=14.4; total=194.4
T031:10/0(1,1)Rejeita por estoque insuficiente; estoque permanece 0
T041:10/10(99,1)Rejeita por produto inexistente
T051:10/10(1,0)Entrada invalida (quantidade); deve solicitar novamente ou rejeitar conforme leitura; no pseudocodigo, LerInteiroPositivo impede 0
T061:10/3(1,2) (1,2)Consolida para qtd=4; rejeita por estoque insuficiente; estoque permanece 3
T071:10/100 itensRejeita: pedido deve conter ao menos 1 item
T081:1/100(1,200)Rejeita por estoque insuficiente
T091:199.99/10(1,1)Sem desconto (subtotal < 200); imposto calculado sobre subtotal
T101:100/10, 2:100/10Dois pedidos: P1 (1,1), P2 (2,1)Relatorio: pedidos=2; faturamento soma dos totais; mais vendido: empate (primeiro com maior acumulado, ou primeiro cadastrado)

Revisão estruturada: checklist de qualidade (pronto para implementar)

Checklist de requisitos

  • Todos os campos do cadastro de produto existem e são validados (codigo, nome, preco, estoque).
  • Pedido invalido nao altera estoque.
  • Desconto aplicado exatamente quando subtotal ≥ 200.
  • Imposto aplicado sobre (subtotal − desconto).
  • Relatorio inclui: total de pedidos confirmados, faturamento total, produto mais vendido, e lista de estoque baixo.

Checklist de casos-limite

  • Pedido com 0 itens tratado explicitamente.
  • Produto inexistente interrompe o pedido (falha total).
  • Quantidade repetida do mesmo produto no pedido consolidada antes da validacao de estoque.
  • Estoque insuficiente em qualquer item rejeita o pedido inteiro.
  • Empate no “mais vendido” tem regra definida (primeiro encontrado).

Checklist de modularização e legibilidade

  • Cada funcao/procedimento tem uma responsabilidade clara e nome descritivo.
  • Validacoes estao concentradas em pontos previsiveis (leitura e validacao contra estoque).
  • Calculo financeiro esta isolado em CalcularTotaisPedido.
  • Atualizacao de estado (estoque e vendidos) esta isolada em ConfirmarPedido.
  • Relatorio nao depende de detalhes de entrada; usa apenas dados consolidados.

Checklist de consistência do pseudocódigo

  • Indentacao consistente em todos os blocos.
  • Comentarios curtos e focados em intencao/regras.
  • Fluxos de erro usam retornos antecipados ou CONTINUE para evitar aninhamento excessivo.
  • Nenhuma variavel “magica” sem significado: constantes (0.10, 0.08, 200, 5) estao visiveis e podem ser facilmente parametrizadas.
  • Entradas invalidas sao tratadas (leituras positivas e verificacoes adicionais).

Agora responda o exercício sobre o conteúdo:

Ao registrar um pedido, qual abordagem garante que um item repetido do mesmo produto seja validado corretamente contra o estoque disponível?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Somar quantidades repetidas antes da validação evita aprovar itens que, no total, excedem o estoque. Se houver insuficiência em qualquer item, o pedido deve ser rejeitado por completo e o estoque não pode ser alterado.

Capa do Ebook gratuito Pseudocódigo Essencial: Um Padrão Simples para Descrever Soluções
100%

Pseudocódigo Essencial: Um Padrão Simples para Descrever Soluções

Novo curso

15 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.