1. Por que repetição existe
Imagine escrever um algoritmo para exibir os números de 1 a 1000. Sem repetição, você
precisaria de mil linhas de ESCREVA. Com repetição, três ou
quatro linhas resolvem, não importa se são 1000 ou 1 milhão de números. Estruturas de
repetição — também chamadas de laços ou loops — executam
um bloco de passos repetidamente enquanto uma condição permitir.
2. ENQUANTO — teste no início
O laço ENQUANTO testa a condição antes de cada
repetição. Se a condição já começar falsa, o bloco nunca executa nem uma vez.
INÍCIO
contador ← 1
ENQUANTO contador <= 5 FAÇA
ESCREVA contador
contador ← contador + 1
FIM ENQUANTO
FIM
// saída: 1 2 3 4 5
Três partes são essenciais em todo ENQUANTO: uma variável
inicializada antes do laço (contador ← 1), a
condição testada a cada volta (contador <= 5), e uma
atualização da variável dentro do laço
(contador ← contador + 1). Esqueça a atualização e o laço nunca
termina.
Fig. 1 — ENQUANTO: a condição é testada antes de cada repetição; o fluxo volta ao losango até a condição falhar.
3. REPITA ... ATÉ — teste no fim
O laço REPITA...ATÉ executa o bloco primeiro e
só depois testa a condição, no final de cada volta. Isso garante que o bloco execute
pelo menos uma vez, mesmo que a condição já comece "satisfeita".
INÍCIO
REPITA
ESCREVA "Digite um número maior que 0:"
LEIA numero
ATÉ numero > 0
ESCREVA "Você digitou: " + numero
FIM
Esse exemplo é o caso clássico de uso: validação de entrada. Você
precisa pedir o dado ao menos uma vez antes de ter algo para validar — por isso
ENQUANTO (que testaria antes de ler qualquer coisa) não serviria
tão bem aqui.
| ENQUANTO | REPITA ... ATÉ | |
|---|---|---|
| Quando testa | Antes de cada repetição | Depois de cada repetição |
| Executa ao menos 1 vez? | Não, se a condição já for falsa | Sim, sempre |
| Bom para | Processar coleções, condições que podem já começar falsas | Validação de entrada, menus que repetem "até sair" |
4. PARA — repetição controlada por contador
Quando você já sabe de antemão quantas vezes o laço deve repetir (por
exemplo, "de 1 até 10"), a estrutura PARA é mais direta que
ENQUANTO — ela já embute a inicialização, a condição e o
incremento em uma única linha.
INÍCIO
PARA i DE 1 ATÉ 5 FAÇA
ESCREVA i
FIM PARA
FIM
// saída: 1 2 3 4 5 — equivalente ao exemplo de ENQUANTO da seção 2
O PARA do pseudocódigo é o for
clássico do JavaScript: for (let i = 1; i <= 5; i++) { ... }.
A estrutura é idêntica — inicialização, condição de parada e incremento, só que separados
em palavras-chave diferentes em vez de um cabeçalho compacto com ponto e vírgula.
5. Qual laço usar
A escolha entre os três não é aleatória — cada um comunica uma intenção diferente para quem lê o código depois:
- Use
PARAquando o número de repetições é conhecido antes de começar. - Use
ENQUANTOquando o número de repetições depende de uma condição que pode não ser satisfeita nem uma vez. - Use
REPITA...ATÉquando o bloco precisa rodar pelo menos uma vez antes de qualquer verificação fazer sentido.
6. O perigo do loop infinito
Um laço que nunca satisfaz sua condição de parada roda para sempre — isso é um loop infinito, e na prática trava o programa (ou consome toda a memória e processamento disponíveis, até o sistema derrubá-lo à força).
INÍCIO
contador ← 1
ENQUANTO contador <= 5 FAÇA
ESCREVA contador
// faltou: contador ← contador + 1
FIM ENQUANTO
// contador nunca muda — este laço nunca termina!
FIM
Antes de dar como pronto qualquer laço que você escrever, pergunte: "existe algum caminho pelo qual a condição de parada nunca se torna falsa?". Isso vale para os três tipos de laço, em qualquer linguagem — loop infinito é um dos bugs mais comuns em código real, e quase sempre nasce de esquecer de atualizar a variável de controle, ou de atualizá-la na direção errada.
Loop infinito nem sempre é um erro — servidores web, por exemplo, rodam em um laço propositalmente infinito, esperando novas requisições indefinidamente. O problema é quando o loop infinito é acidental, em um algoritmo que deveria terminar e não termina.