Ao terminar esta aula, você vai conseguir
- Integrar entrada, decisão, repetição e funções
- Documentar estado numa tabela de teste de mesa
- Definir critérios objetivos para casos de borda
O projeto final reúne o curso num programa de metas semanais. A entrada é uma lista de horas estudadas e uma meta; o processamento valida, soma e decide; a saída informa total, situação e quanto falta. A entrega inclui pseudocódigo e teste de mesa, porque código rodando em um caso não prova o raciocínio.
O cenário inicial usa [1, 2, 1.5, 2.5] e meta sete. A soma é sete, então a borda deve contar como cumprida. Também testaremos abaixo da meta, lista vazia e valor negativo.
Especifique antes de implementar
Escreva o algoritmo completo:
RECEBER HORAS e META
SE HORAS estiver vazia
INFORMAR erro de registros
SE alguma HORA não for número ou for negativa
INFORMAR hora inválida
TOTAL recebe 0
PARA CADA HORA em HORAS
TOTAL recebe TOTAL mais HORA
FIM PARA
SE TOTAL for maior ou igual a META
DEVOLVER meta cumprida e falta zero
SENÃO
DEVOLVER meta pendente e META menos TOTAL
FIM SEObserve a ordem: validação acontece antes da soma. A decisão usa maior ou igual porque atingir exatamente sete satisfaz a meta. O laço altera somente TOTAL e termina quando não há mais itens.
Monte a tabela antes de executar
Para o caso inicial, registre estado depois de cada volta:
| volta | hora atual | total depois |
|---|---|---|
| início | — | 0 |
| 1 | 1 | 1 |
| 2 | 2 | 3 |
| 3 | 1,5 | 4,5 |
| 4 | 2,5 | 7 |
Depois do laço, 7 >= 7 é verdadeiro. A saída esperada tem total sete, situação “meta cumprida” e falta zero. A primeira divergência entre papel e programa indicará a linha a investigar.
Traduza por responsabilidade
function avaliarMeta(horas, meta) {
if (horas.length === 0) throw new RangeError('Semana sem registros');
if (!horas.every((hora) => Number.isFinite(hora) && hora >= 0)) {
throw new TypeError('Hora inválida');
}
let total = 0;
for (const hora of horas) total += hora;
if (total >= meta) return { total, situacao: 'meta cumprida', falta: 0 };
return { total, situacao: 'meta pendente', falta: meta - total };
}
console.log(avaliarMeta([1, 2, 1.5, 2.5], 7));No Node v26.3.0, a saída é { total: 7, situacao: 'meta cumprida', falta: 0 }. O laboratório executa a mesma lógica pura num sandbox do navegador; ele não finge oferecer APIs do Node.
Prove com casos que mudam caminhos
Use pelo menos quatro entradas. [1, 2] com meta cinco deve ficar pendente e faltar dois. [2, 3] com meta cinco deve cumprir exatamente na borda. Lista vazia deve lançar RangeError. [2, -1] deve lançar TypeError antes da soma.
Não altere várias entradas de uma vez durante diagnóstico. Se o caso negativo falha, preserve meta e lista e troque apenas um valor. Mudança controlada associa efeito e causa.
Explique também por que Number.isFinite está na validação. Sem ele, uma string '2' poderia entrar no acumulador e transformar soma em concatenação. O projeto recupera variáveis, tipos, laços e condição na mesma fronteira.
Onde a analogia termina e o projeto começa
Meta semanal parece um placar, mas software de verdade precisa decidir persistência, fuso, edição e identidade. Esses assuntos ficam fora deste projeto para manter o foco na lógica pura. Reduzir escopo não torna a prática falsa; torna o critério verificável.
Sua entrega final precisa conter o pseudocódigo acima reescrito com seus nomes, a tabela de pelo menos três casos, o arquivo executado no Node e as saídas copiadas da execução. Termine explicando qual variável muda em cada volta, qual condição encerra e por que a borda igual à meta é aprovada.
Se você consegue modificar a regra para “cumprida somente acima da meta”, atualizar os casos e prever a nova saída antes de rodar, concluiu o percurso. O próximo passo é escolher uma linguagem como foco sem abandonar o método: pseudocódigo, previsão, execução, diferença e variação. Continue pela trilha de JavaScript para aplicar esse raciocínio em programas maiores.
Laboratório ao vivo
Projeto de metas semanais
Leia o pseudocódigo comentado, execute o programa e troque horas e meta. Registre soma, contador e situação em cada caso testado.
Pare e pense
Qual é a primeira informação necessária para começar um teste de mesa?
Sem entrada concreta e expectativa, a tabela apenas copia estados e não revela em que ponto o comportamento divergiu.
Faça sem copiar
Entregue o projeto com pseudocódigo, tabela para três entradas, saída executada e explicação do primeiro estado que mudaria em cada caso.
Fontes para consultar
Terminou a missão?
Marque apenas quando você conseguir explicar o conceito e concluir o desafio. O progresso fica salvo somente neste navegador.
Voltar ao curso e ver seu progresso →