O programa que vamos entender
Este programinha pergunta quantos dias durou uma promoção, lê quantos bolos foram vendidos em cada dia, classifica o dia como bom ou fraco e, no final, mostra o total e a média. Vamos usá-lo como exemplo o tempo todo.
const readline = require("readline/promises");
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
async function main() {
const dias = Number(await rl.question("Quantos dias de promoção? "));
if (dias <= 0) {
console.log("Dados inválidos");
rl.close();
return;
}
let total = 0;
const vendas = [];
for (let dia = 1; dia <= dias; dia++) {
const bolos = Number(await rl.question(`Dia ${dia}: `));
total += bolos;
vendas.push(bolos);
if (bolos >= 20) {
console.log("Bom dia de vendas!");
} else {
console.log("Dia fraco");
}
}
rl.close();
console.log("---------------------------------------");
console.log(`Total de bolos vendidos: ${total}`);
console.log(`Média por dia: ${(total / dias).toFixed(2)}`);
for (let i = 0; i < vendas.length; i++) {
console.log(`Dia ${i + 1}: ${vendas[i]} bolos`);
}
console.log("---------------------------------------");
}
main();
if
ou o for. É não saber por onde começar e como ligar as peças.
Quase todo programa simples segue o mesmo esqueleto. Vamos a ele.
0Diga o problema em UMA frase
Antes de qualquer código, diga em voz alta o que o programa faz:
Se você não consegue dizer em uma frase, ainda não entendeu o problema - e nenhum código vai sair direito. Este é o passo mais importante.
1Todo programa tem 3 momentos
Pense sempre nestes três blocos, nesta ordem:
No nosso programa dos bolos:
| Momento | No programa dos bolos |
|---|---|
| Entrada | quantos dias, e quantos bolos em cada dia |
| Processo | somar tudo, calcular a média, classificar cada dia |
| Saída | total, média e a lista dia a dia |
2Escreva o pseudocódigo (português estruturado)
Pseudocódigo é o seu rascunho. Aqui você não se preocupa com ponto e vírgula nem com o nome exato do comando - só com a ordem das ideias:
perguntar quantos dias
se os dias forem inválidos, avisar e parar
começar o total em zero
preparar uma lista vazia para guardar as vendas
para cada dia, do 1 até o número de dias:
perguntar quantos bolos venderam nesse dia
somar esse valor ao total
guardar esse valor na lista
se vendeu 20 ou mais: dizer "bom dia"
senão: dizer "dia fraco"
mostrar o total
mostrar a média (total dividido pelos dias)
para cada item da lista, mostrar o dia e a quantidade
3Descubra qual estrutura cada frase pede
Agora a parte que destrava a maioria: olhe cada linha do rascunho e pergunte "que ferramenta isso pede?". Use estes gatilhos:
| Quando a frase diz... | Você precisa de... |
|---|---|
| "SE ... ENTÃO ..." | if |
| "SE ... SENÃO ..." | if / else |
| "PARA CADA X, de A até B" (sei quantas voltas) | for |
| "ENQUANTO algo for verdade" (não sei quantas) | while |
| "GUARDAR um valor para usar depois" | uma variável |
| "GUARDAR VÁRIOS valores" | uma lista (array) |
| "SOMAR / CONTAR aos poucos" | um acumulador (começa em 0) |
Aplicando no nosso rascunho:
- "para cada dia, do 1 até os dias" →
for - "se vendeu 20 ou mais ... senão" →
if / else - "começar o total em zero / somar" → acumulador (
total = 0; total += x) - "guardar as vendas" → lista (
vendas = [])
for
ou if. Você deduziu a partir do que a frase pedia.
Essa é a habilidade de verdade.
4for ou while? A pergunta que decide
Faça a si mesma uma única pergunta:
| Resposta | Use | Exemplo |
|---|---|---|
| SIM | for | "repetir uma vez por dia", e eu sei quantos dias |
| NÃO | while | "repetir até o usuário digitar 0", não sei quando acaba |
No programa dos bolos, perguntamos os dias primeiro, então sabemos o
número de voltas. Por isso usamos for. Se a regra fosse
"continue pedindo bolos até digitar um número negativo", aí seria while.
5O padrão do acumulador (a peça que mais confunde)
Muita gente trava em "como eu vou somando as coisas dentro do for?". O padrão é sempre o mesmo, em três passos:
// 1. ANTES do laço: crie a caixinha com o valor inicial
let total = 0;
for (let dia = 1; dia <= dias; dia++) {
// 2. DENTRO do laço: atualize a caixinha a cada volta
total += bolos;
}
// 3. DEPOIS do laço: use o resultado final
console.log(total);
6Faça o teste de mesa: seja o computador no papel
Antes de rodar, finja que você é o computador. Pegue um exemplo pequeno (2 dias) e anote o valor de cada variável a cada passo:
dias = 2
total = 0 , vendas = [ ]
-- dia 1: usuário digita 25
total = 0 + 25 = 25
vendas = [25]
25 >= 20 ? SIM -> "Bom dia de vendas!"
-- dia 2: usuário digita 10
total = 25 + 10 = 35
vendas = [25, 10]
10 >= 20 ? NÃO -> "Dia fraco"
-- fim do laço:
total = 35
média = 35 / 2 = 17.50
Dia 1: 25 bolos / Dia 2: 10 bolos
7Construa aos poucos, não tudo de uma vez
Nunca tente escrever o programa inteiro e só então rodar. Vá em pedacinhos, testando cada um:
- Só ler os dias e imprimir na tela. Funcionou? Segue.
- Agora o
forimprimindo "Dia 1, Dia 2...". Funcionou? Segue. - Agora ler os bolos e somar no total. Funcionou? Segue.
- Agora o
if/elsede bom/fraco. Funcionou? Segue. - Por fim, o relatório (média e lista).
Cada pedaço que funciona é um ponto de apoio. Se algo quebrar, você sabe que o erro está no último pedaço que adicionou - bem mais fácil que caçar um erro em 40 linhas escritas de uma vez.
A receita para qualquer programa simples
- Diga o problema em uma frase.
- Separe em Entrada → Processo → Saída.
- Escreva o pseudocódigo em português.
- Para cada frase, pergunte "que estrutura isso pede?" (if/for/while/...).
forquando SEI as voltas;whilequando NÃO sei.- Acumulador: declare ANTES, atualize DENTRO, use DEPOIS do laço.
- Faça o teste de mesa com um exemplo pequeno.
- Monte e teste em pedaços, nunca tudo de uma vez.