Controle Financeiro Pessoal
Desenvolvimento criativo de algoritmo — linguagem natural, pseudocódigo modular e demonstrativo
1. Enunciado e requisitos funcionais
Desenvolver um sistema simples de controle financeiro pessoal que permita ao usuário informar diversas despesas do mês (mercado, transporte, lazer etc.) e, ao final, apresentar um demonstrativo consolidado.
Requisitos funcionais
| # | Requisito |
|---|---|
| RF01 | Somar automaticamente todos os valores informados, por tipo, sem que o usuário precise informar quantas despesas fez |
| RF02 | Contar as despesas realizadas por tipo |
| RF03 | O processo continua em laço até que o valor digitado seja zero ou o usuário digite FIM |
| RF04 | Exibir o título CONTROLE FINANCEIRO no topo do demonstrativo |
| RF05 | Listar os tipos de despesa ordenados crescentemente por nome |
| RF06 | Para cada tipo: nome, total gasto, menor valor, maior valor, valor médio, % sobre o total geral e contagem de lançamentos |
| RF07 | Linha final de resumo geral: total geral, tipo de maior gasto (nome + valor total), tipo de menor gasto (nome + valor total), contagem total geral e valor médio geral |
| RF08 | Indicar também o tipo de maior valor médio com o valor correspondente |
2. Algoritmo em linguagem natural
Objetivo: registrar despesas do mês sem saber antecipadamente quantas serão, acumulando estatísticas por tipo, e ao final exibir um demonstrativo ordenado por nome do tipo, mais uma linha de resumo geral.
Fase 1 — Preparação
Criar cinco listas paralelas, todas alinhadas pelo mesmo índice, que representam cada tipo distinto de despesa encontrado:
nomeTipo— o nome do tipo (ex.: MERCADO, TRANSPORTE, LAZER);totalTipo— soma acumulada dos valores daquele tipo;qtdTipo— quantas despesas já foram lançadas naquele tipo;menorTipo— menor valor individual já lançado naquele tipo;maiorTipo— maior valor individual já lançado naquele tipo
Zerar o contador de tipos distintos (
qtdTipos), o total geral gasto (totalGeral) e a contagem geral de lançamentos (qtdGeral).
Fase 2 — Entrada de dados (laço de repetição, sem quantidade prévia)
- Repetir indefinidamente:
- Pedir ao usuário o tipo da despesa (ou a palavra
FIMpara encerrar). - Converter o texto digitado para letras maiúsculas e remover espaços em excesso, para que "mercado", "Mercado" e "MERCADO" sejam tratados como o mesmo tipo.
- Se o texto for
FIM, encerrar o laço. - Pedir o valor da despesa.
- Se o valor for zero, encerrar o laço (o lançamento em andamento é descartado).
- Se o valor for negativo, avisar que é inválido e voltar ao início do laço, sem gravar nada.
- Procurar
nomeTiponas listas para descobrir se aquele tipo já existe:- Se não existe: abrir uma nova posição — incrementar
qtdTipos, gravar o nome, iniciar o total com o valor informado, iniciar a contagem em 1, e iniciar tanto o menor quanto o maior com o próprio valor informado (é o único valor conhecido até agora). - Se já existe: somar o valor ao
totalTipodaquela posição, somar 1 aoqtdTipo; se o valor for menor quemenorTipo, substituir o menor; se for maior quemaiorTipo, substituir o maior.
- Se não existe: abrir uma nova posição — incrementar
- Somar o valor ao
totalGerale somar 1 aoqtdGeral. - Voltar ao passo 3.1.
- Pedir ao usuário o tipo da despesa (ou a palavra
Fase 3 — Ordenação
- Se nenhum lançamento foi feito (
qtdTipos = 0), exibir a mensagem "Nenhuma despesa registrada." e terminar o programa. - Ordenar as listas em ordem crescente pelo nome do tipo (método da bolha ou equivalente). Sempre que dois nomes forem trocados de posição, trocar também os valores correspondentes de
totalTipo,qtdTipo,menorTipoemaiorTipo, para não quebrar o alinhamento entre as listas.
Fase 4 — Apuração dos extremos globais
- Percorrer as listas guardando:
- a posição do tipo com maior total acumulado (
posMaiorTotal); - a posição do tipo com menor total acumulado (
posMenorTotal); - a posição do tipo com maior valor médio (
posMaiorMedia), onde a média de um tipo étotalTipo ÷ qtdTipo.
- a posição do tipo com maior total acumulado (
- Calcular a média geral como
totalGeral ÷ qtdGeral.