Depurando Laços Infinitos: o detetive de bugs no loop while | Professor Comia · 2DS
2DS · SISANO1C1B2S8A3 · Aula 3 · Prática

A técnica do console debugging com escreval — por que todo programador precisa aprender a interrogar o próprio código antes de tentar corrigi-lo.

loop while loop infinito depuração VisualG · Python Escola Pública

Existe um momento específico no aprendizado de programação que todo iniciante enfrenta: o programa roda, a tela pisca, e nada acontece. O cursor fica parado. A máquina não responde. O processo precisa ser encerrado manualmente. O aluno olha para o código e não encontra o erro — porque o código parece correto.

O que aconteceu é um loop infinito. E a razão pela qual ele é tão difícil de identificar é que o código não está errado sintaticamente — ele está errado logicamente. A estrutura é válida. A variável existe. A condição faz sentido. O que falta é uma única linha: a que atualiza a variável de controle a cada iteração.

// o problema que esta aula resolve

Alunos conseguem escrever a estrutura do while corretamente mas produzem programas que travam. O motivo quase sempre é idêntico: a variável que controla a condição não é modificada dentro do bloco. Sem uma técnica sistemática de diagnóstico, o aluno tenta corrigir o código por tentativa e erro — o que reforça uma abordagem assistemática que escala mal em projetos reais.

Por que o loop infinito é o bug mais formativo do ensino de laços?

Na escola pública, com turmas grandes e tempo de aula disputado, o loop infinito costuma gerar dois comportamentos opostos: o aluno que trava junto com o programa e espera o professor resolver, e o aluno que fecha tudo e começa do zero sem entender o que deu errado. Nenhum dos dois aprendeu a depurar.

A aula 3 da série usa exatamente esse bug como objeto de estudo. O aluno não aprende sobre loop infinito de forma abstrata — ele produz um, observa o comportamento, formula hipóteses sobre a causa e aplica uma técnica de diagnóstico para confirmar o que está acontecendo antes de corrigir. Esse é o ciclo intelectual correto: observar, diagnosticar, corrigir, verificar.

// definição objetiva — menos de 40 palavras

Um loop infinito ocorre quando a condição de parada de um laço enquanto nunca se torna falsa porque a variável de controle não é atualizada dentro do bloco, fazendo o programa repetir o mesmo bloco de código indefinidamente até ser interrompido externamente.

Quais são as causas e como distingui-las?

CausaO que acontece no códigoComportamento observadoCorreção
Ausência de atualizaçãoA variável de controle não é modificada dentro do blocoPrograma trava, mesma saída repetidaAdicionar linha de atualização (contador := contador - 1)
Atualização no sentido erradoA variável é modificada, mas se afasta da condição de paradaPrograma trava, valores crescendo indefinidamenteInverter a operação de atualização
Condição jamais falsaA expressão booleana é sempre verdadeira por construçãoPrograma trava imediatamenteRevisar a expressão da condição
Atualização fora do blocoA linha de atualização existe, mas está depois do fimenquantoPrograma trava, atualização nunca executadaMover a linha para dentro do bloco

Como funciona a técnica do console debugging com escreval?

A técnica mais simples e acessível de depuração para iniciantes é inserir temporariamente uma linha de saída dentro do bloco do laço que exibe o estado da variável de controle a cada iteração. Em ambientes profissionais, isso é feito com ferramentas de debugger integradas à IDE. Em VisualG, o equivalente direto é o escreval usado como instrumento de inspeção.

A lógica é simples: se a variável de controle não está mudando, o escreval mostrará o mesmo valor repetido na tela. Se está mudando no sentido errado, os valores exibidos revelarão a progressão incorreta. Em ambos os casos, o diagnóstico precede a correção — o que é um princípio fundamental de qualquer engenharia de software.

// método — 4 etapas do detetive de bugs
  1. Execute e observe: rode o código com bug e documente o comportamento exato. O programa trava? Repete sempre a mesma saída? Esse é o sintoma — não pule para a correção sem ter o sintoma claro.
  2. Formule hipóteses: antes de depurar, escreva no papel o que você acha que está acontecendo. Qual variável suspeita de estar estática? Em que ponto do código isso deveria mudar?
  3. Insira a linha de debug: adicione escreval("[DEBUG] variavel = ", variavel) imediatamente antes do final do bloco. Execute novamente e observe os valores impressos. A variável está mudando? No sentido correto?
  4. Corrija e verifique: com o diagnóstico confirmado, adicione ou corrija a linha de atualização. Execute novamente. Remova a linha de debug após confirmar o funcionamento correto.

Templates copiáveis — do bug à versão corrigida

LoopInfinito.alg — VisualG BUG
algoritmo "LoopInfinito"
Var
   contador: inteiro
Inicio
   contador := 5
   enquanto contador > 0 faca
      escreval("Contando: ", contador)
      // BUG: variável contador nunca é decrementada
      // a condição contador > 0 é sempre verdadeira
   fimenquanto
   escreval("Pronto!")
Fimalgoritmo
LoopInfinitoDebug.alg — com linha de inspeção DEBUG
algoritmo "LoopInfinitoDebug"
Var
   contador: inteiro
Inicio
   contador := 5
   enquanto contador > 0 faca
      escreval("Contando: ", contador)
      [DEBUG] linha temporária de inspeção — remover após corrigir
      escreval("[DEBUG] contador = ", contador, " | contador > 0 = ", contador > 0)
   fimenquanto
Fimalgoritmo
// Resultado observado: contador = 5 | contador > 0 = Verdadeiro
// contador = 5 | contador > 0 = Verdadeiro  ← valor estático = bug confirmado
ContagemRegressiva.alg — versão corrigida CORRIGIDO
algoritmo "ContagemRegressiva"
Var
   contador: inteiro
Inicio
   contador := 5
   enquanto contador > 0 faca
      escreval("Contando: ", contador)
      contador := contador - 1   ← atualização da condição — correção do bug
   fimenquanto
   escreval("Pronto!")
Fimalgoritmo
// Saída: Contando: 5 / Contando: 4 / Contando: 3 / Contando: 2 / Contando: 1 / Pronto!
contagem_regressiva.py — Python equivalente CORRIGIDO
# Python — mesmo padrão, sintaxe diferente
contador = 5

while contador > 0:
    print(f"Contando: {contador}")
    contador -= 1     # atualização — equivalente a contador := contador - 1

print("Pronto!")

# Técnica de debug equivalente (remover após corrigir):
# print(f"[DEBUG] contador = {contador} | condição = {contador > 0}")
// caso real — escola pública, ensino médio técnico

O detetive de bugs em sala: investigação colaborativa em grupos

A atividade prática da Aula 3 coloca grupos de até cinco alunos diante de um código com bug deliberado. A estrutura é investigativa: antes de qualquer correção, o grupo precisa executar o código com bug, observar o comportamento e formular por escrito uma hipótese sobre a causa.

A introdução da linha de debug não é fornecida como solução — é apresentada como uma técnica de investigação. O grupo insere o escreval de inspeção, executa novamente e discute o que os valores exibidos revelam sobre o estado interno do programa. Somente depois do diagnóstico confirmado a correção é implementada.

Esse fluxo — observar, hipotetizar, diagnosticar, corrigir, verificar — é o mesmo fluxo de qualquer engenheiro de software em depuração profissional. A diferença de escala é enorme, mas a lógica de investigação é idêntica. Ao ensinar isso com VisualG em uma aula de 45 minutos na escola pública, estamos ensinando muito mais do que um comando: estamos ensinando uma postura técnica perante o erro.

// expansão estratégica

Da depuração manual às ferramentas profissionais

A técnica do escreval como instrumento de inspeção é o ponto de partida de um continuum de práticas de depuração que escala até ferramentas industriais.

  • No curso técnico (próximas aulas): introduzir o conceito de breakpoint em IDEs como VS Code e PyCharm — a lógica de “pausar e inspecionar” é exatamente a mesma, mas sem precisar escrever linhas de debug manualmente. O aluno que entende o escreval entende o debugger.
  • No blog (autoridade técnica): a série sobre estruturas de repetição — aula 1 (while), aula 2 (contadores/sentinela), aula 3 (depuração) — forma uma trilha completa documentável. Cada artigo referencia o anterior, construindo autoridade de conteúdo progressivo na interseção entre ensino técnico e programação.
  • No laboratório maker: scripts de automação com Raspberry Pi produzem loops em MicroPython. Um sensor que lê dados em laço e nunca para por falta de atualização é exatamente o mesmo bug da aula, em hardware real — o que torna a atividade extensível para projetos interdisciplinares.
  • Como formação docente: a metodologia investigativa da atividade — bug deliberado, hipótese antes da correção, diagnóstico instrumental, verificação — pode ser estruturada como oficina de práticas pedagógicas para outros professores de programação da rede estadual.
// síntese conceitual

Um loop infinito é causado pela ausência de atualização da variável de controle dentro do bloco do while. A técnica de diagnóstico é inserir temporariamente um escreval que exibe o valor da variável a cada iteração — se o valor não muda, o bug está confirmado. A correção é sempre a mesma: adicionar a linha de atualização dentro do bloco, antes do fimenquanto.

Perguntas frequentes sobre loops infinitos e depuração

O que é um loop infinito e como reconhecê-lo em execução?

Um loop infinito ocorre quando a condição de parada de um laço while nunca se torna falsa. Em execução, o comportamento típico é o programa travar sem encerrar, às vezes exibindo repetidamente a mesma saída na tela, às vezes simplesmente não respondendo. Em VisualG, o programa precisa ser encerrado manualmente com o botão de parar a execução.

Por que o escreval funciona como ferramenta de debug?

O escreval exibe o estado de uma variável em um momento específico da execução. Inserido dentro do bloco do laço, ele revela o valor da variável de controle a cada iteração — tornando visível algo que normalmente é invisível durante a execução. Se o valor não muda entre iterações, o bug está localizado: a variável não está sendo atualizada. Em IDEs profissionais, ferramentas de debugger fazem o mesmo sem precisar escrever código adicional, mas a lógica de inspeção é idêntica.

Como prevenir loops infinitos antes de executar o código?

Antes de executar, verifique mentalmente três coisas: a variável de controle foi inicializada antes do laço? Existe uma instrução dentro do bloco que modifica essa variável? A modificação aproxima a variável da condição de parada? Se a resposta a qualquer uma dessas perguntas for negativa, o laço tem risco de ser infinito. Essa verificação em três etapas é mais eficiente do que testar por execução.

A linha de debug precisa ser removida após a correção?

Sim. Linhas de debug são instrumentos de diagnóstico, não parte da lógica do programa. Em produção, exibir mensagens de debug na saída do usuário é um erro de qualidade. O fluxo correto é: inserir a linha de debug, diagnosticar, corrigir e então remover a linha de debug antes de considerar o programa concluído. Em alguns projetos, as linhas de debug são deixadas comentadas para uso futuro.

Existe diferença entre depurar com escreval e usar um debugger de IDE?

A diferença é de ferramenta, não de lógica. O escreval exige que o programador insira código temporário para tornar o estado visível. Um debugger de IDE permite inspecionar variáveis sem modificar o código, pausando a execução em qualquer linha (breakpoint) e avançando passo a passo. Quem entende a lógica do escreval como ferramenta de inspeção entende o debugger — a abstração é a mesma, o nível de automação é diferente.

Sequência completa de aulas no blog

While, contadores, sentinela, depuração — toda a série documentada com artigos, slides e códigos do laboratório de educação digital.

professorcomia.com.br

A virada: tratar o erro como dado, não como fracasso

O loop infinito que trava o programa não é uma falha do aluno — é uma informação. Ele informa que a variável de controle não está sendo atualizada. A diferença entre o aluno que fecha o programa e começa do zero e o aluno que insere um escreval de inspeção para entender o que está acontecendo é uma diferença de mentalidade: o segundo trata o erro como dado a ser analisado, não como obstáculo a ser evitado.

Essa é a competência que vai além do while, além do VisualG, além de qualquer linguagem específica. É a postura do engenheiro diante do sistema que não se comporta como esperado: observar, diagnosticar, corrigir, verificar. Ensinar isso na aula 3 de uma série sobre estruturas de repetição em uma escola pública é, ao mesmo tempo, ensinar lógica de programação e ensinar método científico aplicado.

// professorcomia.com.br · laboratorio de educacao digital · aula_pratica=SIM · pause_e_responda=SIM · codigo: SISANO1C1B2S8A3

Slides da Aula — 2DS · Aula Prática

// Estruturas de Repetição: loop while · Aula 3: Depurando Laços Infinitos · SISANO1C1B2S8A3

slide_01 abertura
Frequência — Código: SISANO1C1B2S8A3

>_Estruturas de Repetição — Loop while

Unidade 2 · Componente 1 · Aula 3 de 3 · Prática

Aula 3: Depurando Laços Infinitos  |  Turma: 2DS

Você já rodou um programa que simplesmente não parava? O que você fez para entender o que estava acontecendo — e como descobriu onde estava o erro?
slide_02 objetivos

[ ]O que você vai aprender nesta aula

  • Conceitual: identificar um loop infinito e compreender sua causa principal — ausência de atualização da variável de controle.
  • Procedimental: corrigir loops malformados usando a técnica de debug com escreval como instrumento de inspeção.
  • Atitudinal: manter persistência diante de erros, propondo soluções com organização lógica e responsabilidade técnica.

// recursos: computador · VisualG · roteiro de atividade prática · caderno

slide_03 problema_gerador

!O detetive de bugs

Um sistema de contagem regressiva foi entregue para revisão. O programa deveria contar de 5 até 0 e exibir “Pronto!”. Ao executar, a tela exibe “Contando: 5” repetidamente sem parar.

sintoma

O programa não encerra. A mesma linha aparece na tela indefinidamente. O processo precisa ser interrompido manualmente.

missão

Identificar a causa, confirmar o diagnóstico com uma técnica de inspeção e aplicar a correção mínima necessária.

O código não tem erro de sintaxe — o VisualG aceita sem reclamações. Por que ele trava? Como você descobriria a causa sem adivinhar?
slide_04 conceito · loop_infinito

O que é um loop infinito?

Um laço enquanto repete enquanto sua condição for verdadeira. Se a variável que controla essa condição nunca é modificada dentro do bloco, a condição permanece verdadeira para sempre.

LoopInfinito.alg BUG
contador := 5
enquanto contador > 0 faca
   escreval("Contando: ", contador)
   // faltou: contador := contador - 1
fimenquanto

Causa: contador vale 5 e nunca muda — a condição contador > 0 é sempre verdadeira.

slide_05 conceito · debug

?A lupa do código: escreval como debug

Quando não sabemos o que está acontecendo dentro do laço, pedimos ao computador que nos mostre. Inserimos uma linha temporária que exibe o valor da variável a cada iteração — se o valor não muda, o bug está confirmado.

Inspeção dentro do laço DEBUG
enquanto contador > 0 faca
   escreval("Contando: ", contador)
   escreval("[DEBUG] contador = ", contador)
fimenquanto
// Se [DEBUG] sempre mostra 5: bug confirmado — valor estático

Linha de debug é temporária — remover após confirmar a correção.

slide_06 registro_caderno

Registre no caderno

  • Loop infinito: laço cuja condição nunca se torna falsa — programa não encerra.
  • Causa principal: variável de controle não atualizada dentro do bloco.
  • Diagnóstico: inserir escreval("[DEBUG]...", variavel) para inspecionar o valor a cada iteração.
  • Correção: adicionar a linha de atualização dentro do bloco, antes do fimenquanto.
  • Verificação: executar e confirmar saída correta — depois remover a linha de debug.
slide_07 pause_e_responda

?Registro — Pause e Responda

Qual é a causa mais comum para um laço enquanto se tornar um “loop infinito”?
  • AUsar o comando escreval dentro do laço.
  • BO algoritmo ter um nome muito longo.
  • CDeclarar muitas variáveis.
  • DA condição de parada nunca se torna falsa.

// responda primeiro no caderno · depois registre no AVA

slide_08 gabarito

Registro — Resposta correta

Qual é a causa mais comum para um laço enquanto se tornar um “loop infinito”?
  • AUsar o comando escreval dentro do laço. → escreval é exibição, não controla o laço
  • BO algoritmo ter um nome muito longo. → nome não afeta a execução
  • CDeclarar muitas variáveis. → número de variáveis não afeta o laço
  • DA condição de parada nunca se torna falsa.

Um loop infinito ocorre quando a variável de controle não é atualizada dentro do bloco, mantendo a condição de parada sempre verdadeira.

slide_09 contexto_atividade

{ }O detetive de bugs: encontrando e corrigindo um loop infinito

Formato: grupos de até 5 pessoas  |  Duração: 45 minutos

materiais

Computador com VisualG · Editor de texto ou IDE · Caderno e caneta · Roteiro de atividade prática.

objetivo

Identificar e corrigir um loop infinito usando a técnica de debug com escreval como instrumento de inspeção de variáveis.

slide_10 planejamento

Antes de abrir o VisualG — esboço no papel

  • Variável de controle: contador: inteiro — inicializada com 5, deve chegar a 0.
  • Condição do laço: enquanto contador > 0 — verdadeira enquanto contador for positivo.
  • O que falta no código com bug: a instrução que decrementa o contador a cada iteração.
  • Estratégia de diagnóstico: inserir linha de debug para confirmar que o valor não muda antes de corrigir.
Anote no papel: qual linha está faltando? O que ela precisa fazer para que a condição eventualmente se torne falsa?
slide_11 algoritmo

>_Fluxo da investigação — 3 etapas

etapa 1 · bug

Execute o código original. Observe o travamento. Formule hipótese no papel: o que está errado?

etapa 2 · debug

Insira a linha escreval("[DEBUG]...", contador). Execute. Confirme que o valor não muda.

etapa 3 · fix

Adicione contador := contador - 1 dentro do bloco. Remova o debug. Execute e verifique.

slide_12 implementacao

Roteiro de execução no VisualG

  • Passo 1: Abram o roteiro de atividade prática. Leiam com atenção antes de abrir o VisualG.
  • Passo 2: Antes de codificar, realizem esboços no papel para definir a lógica e a localização do bug.
  • Passo 3: Implementem as três versões em sequência: bug → debug → corrigida.
  • Passo 4: Registrem os resultados observados em cada versão no caderno.

// executar com F9 · interromper loop infinito com o botão de parar

slide_13 testes

!Verificação — três cenários obrigatórios

caso normal

contador = 5
Esperado: exibe 5, 4, 3, 2, 1 e encerra com “Pronto!”

valor-limite

contador = 1
Esperado: exibe apenas 1 e encerra — uma única iteração.

condição já falsa

contador = 0
Esperado: laço não executa nenhuma vez — vai direto ao “Pronto!”

slide_14 entrega_ava

Registro e entrega

o que entregar

Código com bug · Código com debug · Código corrigido · Resultado de cada execução · Explicação em comentários (// comentário).

critérios

Bug identificado corretamente · Diagnóstico com debug documentado · Correção aplicada · Todos os casos de teste verificados · Código organizado.

// entrega via AVA: siga as instruções do roteiro de atividade prática para o registro no AVA.
slide_final síntese

Então ficamos assim…

∅ loop infinito

Identificado na prática — programa repete indefinidamente por não atingir a condição de parada.

? debug

Técnica com escreval: inspecionar o valor da variável a cada iteração para confirmar o diagnóstico antes de corrigir.

✓ correção

Causa principal: ausência do comando que modifica a variável de controle — adicioná-lo resolve o loop.

// aulas anteriores

Aula 1: sintaxe e fluxo do while. Aula 2: contadores, acumuladores e sentinela — todos os padrões de controle de iteração.

// próximo conteúdo

Operadores lógicos e relacionais — fundamento para condições compostas em estruturas de repetição e decisão.