O que é um laço (loop) e por que ele precisa de três partes
Um laço descreve repetição controlada: um bloco de passos é executado várias vezes até que uma condição de parada seja atingida. Para manter o pseudocódigo previsível e evitar erros, descreva laços sempre com três elementos explícitos:
- Inicialização: define o estado inicial (ex.: contador, acumulador, posição).
- Condição de parada: define quando o laço termina (ex.: enquanto ainda há itens, até encontrar algo, até validar).
- Atualização: garante progresso a cada iteração (ex.: incrementar contador, avançar índice, ler nova tentativa).
Quando um desses elementos fica implícito, aumenta o risco de laço infinito ou de resultados incorretos.
ENQUANTO (pré-teste): verifica antes de executar
No laço ENQUANTO, a condição é testada antes de entrar no bloco. Se a condição já for falsa no início, o bloco pode não executar nenhuma vez.
Sintaxe consistente (pré-teste)
INICIALIZE estadoENQUANTO (condição_de_continuação) FAÇA passos ATUALIZE estadoFIM ENQUANTONote que a condição costuma ser de continuação (ex.: “enquanto ainda não terminou”). Se preferir condição de parada, deixe isso claro com negação bem legível.
Passo a passo prático: contador simples (1 a N)
Objetivo: escrever os números de 1 até N.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
- Inicialização:
i ← 1 - Condição de continuação:
i ≤ N - Atualização:
i ← i + 1
i ← 1ENQUANTO (i ≤ N) FAÇA ESCREVA i i ← i + 1FIM ENQUANTOAcumulação: somar valores até um limite
Acumuladores precisam de inicialização explícita e atualização em toda iteração.
soma ← 0i ← 1ENQUANTO (i ≤ N) FAÇA soma ← soma + i i ← i + 1FIM ENQUANTOESCREVA somaBusca: procurar um valor em uma lista
Em buscas, é comum usar uma variável booleana para indicar se encontrou e um índice para avançar. Isso torna a condição de parada clara.
pos ← 1encontrou ← FALSOENQUANTO (pos ≤ tamanho E NÃO encontrou) FAÇA SE (lista[pos] = alvo) ENTÃO encontrou ← VERDADEIRO SENÃO pos ← pos + 1 FIM SEFIM ENQUANTOSE (encontrou) ENTÃO ESCREVA "Encontrado na posição ", posSENÃO ESCREVA "Não encontrado"FIM SERepare que a atualização do índice ocorre apenas quando não encontra; isso evita avançar além do necessário e mantém o estado coerente.
REPITA ATÉ (pós-teste): executa pelo menos uma vez
No laço REPITA ATÉ, o bloco executa primeiro e a condição é testada ao final. Ele é ideal quando você precisa executar uma ação ao menos uma vez, como pedir uma entrada e validar.
Sintaxe consistente (pós-teste)
REPITA passos ATUALIZE estado (se necessário)ATÉ (condição_de_parada)Aqui a condição costuma ser de parada (ex.: “até estar válido”). Isso reduz negações e deixa a intenção mais direta.
Passo a passo prático: validação de entrada (faixa)
Objetivo: ler uma nota entre 0 e 10. A leitura deve acontecer ao menos uma vez.
- Executar: ler a nota.
- Parar quando:
0 ≤ nota ≤ 10.
REPITA LEIA notaATÉ (nota ≥ 0 E nota ≤ 10)ESCREVA "Nota válida: ", notaValidação com regra composta: senha com tentativas limitadas
Quando há limite de tentativas, explicite o contador e a condição de parada combinando “sucesso” ou “esgotou tentativas”.
tentativas ← 0autenticado ← FALSOREPITA LEIA senha tentativas ← tentativas + 1 SE (senha = senha_correta) ENTÃO autenticado ← VERDADEIRO FIM SEATÉ (autenticado OU tentativas = 3)SE (autenticado) ENTÃO ESCREVA "Acesso liberado"SENÃO ESCREVA "Acesso negado"FIM SEPARA (contagem): repetição com contador controlado
Use PARA quando você sabe quantas vezes precisa repetir ou quando percorre um intervalo de valores. Ele concentra inicialização, condição e atualização em uma única linha, reduzindo erros de controle.
Sintaxe consistente (contagem)
PARA i DE inicio ATÉ fim PASSO passo FAÇA passosFIM PARARegras práticas:
- Se
PASSOfor omitido, assuma1(mas só omita se isso estiver claro no padrão do seu material). - Se
inicio > fime o passo for positivo, o laço não executa; para contagem regressiva, use passo negativo. - Evite alterar manualmente o contador
identro do bloco; isso torna o controle ambíguo.
Passo a passo prático: acumular soma com PARA
soma ← 0PARA i DE 1 ATÉ N PASSO 1 FAÇA soma ← soma + iFIM PARAESCREVA somaContagem regressiva
PARA i DE 10 ATÉ 1 PASSO -1 FAÇA ESCREVA iFIM PARAPercorrer uma lista por índice
PARA pos DE 1 ATÉ tamanho PASSO 1 FAÇA ESCREVA lista[pos]FIM PARAComo evitar laços infinitos (checklist rápido)
| Risco | Sinal no pseudocódigo | Correção |
|---|---|---|
| Condição nunca muda | Condição depende de variável que não é atualizada | Adicionar/ajustar atualização do estado a cada iteração |
| Atualização no lugar errado | Incremento só ocorre em um ramo e pode ser pulado | Garantir progresso em todos os caminhos ou reestruturar condição |
| Condição invertida | Uso excessivo de negações (NÃO) confusas | Reescrever como condição de continuação (ENQUANTO) ou de parada (ATÉ) mais direta |
| Limites incorretos | Índice ultrapassa tamanho ou nunca alcança o fim | Revisar início/fim/passo e comparadores (<, ≤, >, ≥) |
| Entrada não atualizada | Validação repete sem ler novo valor | Garantir leitura dentro do laço (geralmente com REPITA ATÉ) |
Controles de repetição explícitos: estado, flags e progresso
Para que o leitor entenda por que o laço termina, prefira controles explícitos:
- Contador: quantas iterações já ocorreram (ex.: tentativas).
- Acumulador: soma/total parcial (ex.: soma, total, produto).
- Flag booleana: indica evento (ex.: encontrou, autenticado, valido).
- Índice/ponteiro: posição atual em uma estrutura (ex.: pos).
Exemplo de laço com dois controles (contador + flag):
pos ← 1encontrou ← FALSOENQUANTO (pos ≤ tamanho E NÃO encontrou) FAÇA SE (lista[pos] = alvo) ENTÃO encontrou ← VERDADEIRO FIM SE pos ← pos + 1FIM ENQUANTONeste formato, o progresso é garantido porque pos sempre avança.
Invariantes simples: como descrever o que permanece verdadeiro
Um invariante é uma frase curta que descreve algo que é verdadeiro no início de cada repetição. Ele ajuda a revisar a lógica e identificar atualizações faltando.
Exemplo 1: soma de 1 a i-1 (ENQUANTO)
Invariante: “Antes de cada iteração, soma é a soma dos números de 1 até i-1”.
soma ← 0i ← 1ENQUANTO (i ≤ N) FAÇA // Invariante: soma = 1 + 2 + ... + (i-1) soma ← soma + i i ← i + 1FIM ENQUANTOExemplo 2: busca parcial (PARA)
Invariante: “Antes de verificar lista[pos], nenhum elemento nas posições anteriores era o alvo”.
encontrou ← FALSOPARA pos DE 1 ATÉ tamanho PASSO 1 FAÇA // Invariante: se encontrou = FALSO, então alvo não apareceu em 1..(pos-1) SE (lista[pos] = alvo) ENTÃO encontrou ← VERDADEIRO FIM SEFIM PARAExercícios (contadores, acumulação, busca e validação)
1) Contador com ENQUANTO: múltiplos de 3
Escreva um pseudocódigo que mostre todos os múltiplos de 3 entre 3 e N (inclusive). Exija que N seja múltiplo de 3; caso não seja, reduza até o múltiplo anterior (ex.: 20 vira 18) antes de iniciar o laço.
2) Acumulação com PARA: média de valores
Leia Q números e calcule a média. Use PARA para controlar a quantidade de leituras e um acumulador para a soma. Inclua uma variável para contar quantos valores foram lidos (mesmo que seja igual a Q) e escreva um invariante simples.
3) Busca com ENQUANTO: primeira ocorrência
Dada uma lista e um valor alvo, encontre a posição da primeira ocorrência. Se não existir, retorne 0. Use pos e uma flag encontrou. Garanta que o índice sempre avance e escreva a condição de parada de forma legível.
4) Validação com REPITA ATÉ: intervalo e paridade
Leia um número inteiro X até que ele seja par e esteja no intervalo [10, 100]. Use REPITA ATÉ com condição de parada direta (sem dupla negação). Depois escreva X.
5) Evitando loop infinito: depuração de pseudocódigo
O pseudocódigo abaixo pretende somar números até que a soma ultrapasse 100, mas pode entrar em laço infinito. Identifique o problema e reescreva com inicialização, condição e atualização corretas.
soma ← 0ENQUANTO (soma ≤ 100) FAÇA LEIA valor // falta algo aquiFIM ENQUANTO