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) eestoque(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 comcodigo,nome,preco,estoque,vendidoAcumulado.ItemPedido: registro comcodigoProduto,quantidade,precoUnitario,totalItem.Pedido: registro comidPedido, lista de itens,subtotal,desconto,imposto,total,confirmado.
Passo 2: Regras e casos-limite (antes do algoritmo)
Regras numéricas
precodeve ser > 0.estoquedeve ser ≥ 0.quantidadedo 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)FIMPROGRAMAPasso 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.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
| ID | Produtos (codigo:preco/estoque) | Pedido (itens) | Esperado |
|---|---|---|---|
| T01 | 1: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 |
| T02 | 1:100/10, 2:50/10 | (1,1) (2,2) | Confirma; subtotal=200; desconto=20; imposto=14.4; total=194.4 |
| T03 | 1:10/0 | (1,1) | Rejeita por estoque insuficiente; estoque permanece 0 |
| T04 | 1:10/10 | (99,1) | Rejeita por produto inexistente |
| T05 | 1:10/10 | (1,0) | Entrada invalida (quantidade); deve solicitar novamente ou rejeitar conforme leitura; no pseudocodigo, LerInteiroPositivo impede 0 |
| T06 | 1:10/3 | (1,2) (1,2) | Consolida para qtd=4; rejeita por estoque insuficiente; estoque permanece 3 |
| T07 | 1:10/10 | 0 itens | Rejeita: pedido deve conter ao menos 1 item |
| T08 | 1:1/100 | (1,200) | Rejeita por estoque insuficiente |
| T09 | 1:199.99/10 | (1,1) | Sem desconto (subtotal < 200); imposto calculado sobre subtotal |
| T10 | 1:100/10, 2:100/10 | Dois 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
CONTINUEpara 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).