O Laço
Infinito
Quando o computador precisa repetir uma ação enquanto algo for verdade — e o que dá errado quando esquecemos de parar.
Quando o computador precisa repetir uma ação enquanto algo for verdade — e o que dá errado quando esquecemos de parar.
Entender o que é uma estrutura de repetição (laço/loop)
Diferenciar laços fixos (for) de condicionais (while)
Escrever um while em Visualg e em Python
Identificar e corrigir loops infinitos com depuração
Imagine o Spotify no modo aleatório:
Isso é um laço condicional: continua enquanto uma condição for verdade. Em programação, chamamos de while.
É um recurso que executa um bloco de código várias vezes, enquanto uma condição booleana for verdadeira. Quando a condição vira falsa, o laço termina.
print(1)
print(2)
print(3)
# ... e assim até 100? 😱
n = 1
while n <= 100:
print(n)
n = n + 1
E se eu pedir para somar 1+2+3+…+1000 sem usar laço — quanto tempo leva pra escrever?
Usado quando o número de repetições já é conhecido (um contador ou uma coleção).
for i in range(5):
print("Volta", i)
Usado quando não sabemos o número de repetições — depende de uma condição.
resposta = ""
while resposta != "sair":
resposta = input("> ")
Hoje vamos focar no while.
A mesma lógica em Visualg (pseudocódigo) e em Python:
algoritmo "ContaAteTres"
var
n: inteiro
inicio
n <- 1
enquanto n <= 3 faca
escreval("Volta ", n)
n <- n + 1
fimenquanto
fimalgoritmo
n = 1
while n <= 3:
print("Volta", n)
n = n + 1
n <= 3) e algo dentro do laço que muda essa condição (n = n + 1). Sem isso, o laço nunca para.
O loop principal do jogo roda enquanto vida > 0. A cada frame: lê controle, atualiza tela, verifica colisão.
Um servidor web fica escutando conexões indefinidamente — enquanto não for desligado.
Lê linha após linha de um arquivo até encontrar o fim, ou pede entradas do usuário até ele digitar "sair".
Em comum: ninguém sabe de antemão quantas voltas o laço vai dar.
Acontece quando a condição nunca fica falsa. O programa trava e roda para sempre.
algoritmo "Bug"
var
n: inteiro
inicio
n <- 1
enquanto n <= 3 faca
escreval("Olá!")
// esqueci de mudar o n 😱
fimenquanto
fimalgoritmo
n = 1
while n <= 3:
print("Olá!")
# esqueci de mudar o n 😱
while, garanta que algo dentro dele muda a variável da condição.
Situação: simule a contagem regressiva de um foguete. Mostre 5, 4, 3, 2, 1 e depois "Lançar!".
algoritmo "Foguete"
var
contador: inteiro
inicio
contador <- 5
enquanto contador > 0 faca
escreval(contador)
contador <- contador - 1
fimenquanto
escreval("Lançar!")
fimalgoritmo
contador = 5
while contador > 0:
print(contador)
contador = contador - 1
print("Lançar!")
A forma mais simples de depurar um while é fazer ele contar pra você o que está acontecendo em cada volta. Adicione uma linha de impressão dentro do laço:
enquanto contador > 0 faca
escreval("Contando ", contador)
escreval("DEBUG: contador=", contador)
fimenquanto
while contador > 0:
print("Contando", contador)
print(f"DEBUG: contador={contador}")
Situação: você vai criar um mini-Akinator! O programa "pensa" num número secreto (você escolhe — ex: 7). O usuário digita palpites e, enquanto errar, o programa pede outro. Quando acertar, celebra com "Acertou! 🎉".
Passo a passo — abra o Visualg / VS Code e digitem:
numero_secreto com o valor que você escolherpalpite com um valor inicial diferente do segredo (para o while começar)while com a condição palpite ≠ numero_secretoleia / inputalgoritmo "Adivinha"
var
numero_secreto, palpite: inteiro
inicio
numero_secreto <- 7
palpite <- 0
enquanto ... faca
escreva("Seu palpite: ")
leia(palpite)
fimenquanto
escreval(...)
fimalgoritmo
numero_secreto = 7
palpite = 0
while ... :
palpite = int(input("Seu palpite: "))
print(...)
O while roda enquanto o palpite estiver errado. Assim que palpite ficar igual ao segredo, a condição vira falsa e o laço termina:
algoritmo "Adivinha"
var
numero_secreto, palpite: inteiro
inicio
numero_secreto <- 7
palpite <- 0
enquanto palpite <> numero_secreto faca
escreva("Seu palpite: ")
leia(palpite)
fimenquanto
escreval("Acertou! 🎉")
fimalgoritmo
numero_secreto = 7
palpite = 0
while palpite != numero_secreto:
palpite = int(input("Seu palpite: "))
print("Acertou! 🎉")
palpite) precisa existir antes do while, com valor que faça o laço entrar — e precisa mudar dentro dele (via input/leia) para um dia parar.
Um while pode esperar uma resposta correta do usuário. Aqui o laço só termina quando a senha bate:
algoritmo "WiFi"
var
senha: caractere
inicio
senha <- ""
enquanto senha <> "consa2026" faca
escreval("Digite a senha:")
leia(senha)
fimenquanto
escreval("✅ Acesso liberado!")
fimalgoritmo
senha = ""
while senha != "consa2026":
senha = input("Digite a senha: ")
print("✅ Acesso liberado!")
O que muda na condição se eu quiser limitar a 3 tentativas? (Pista: precisa de mais uma variável.)
Os 3 padrões clássicos do while: contador, acumulador e sentinela.
Em quais situações do dia a dia você já viu um "loop infinito" acontecendo (no celular, em jogo, no app)?