Introdução à Programação · 1.º ano (indicativo)

Quais são os erros mais comuns nos ciclos?

  • 10 min de leitura
  • 4 exemplos resolvidos
  • 5 exercícios com solução
  • Atualizado em

Resposta curta

Os erros mais comuns nos ciclos são: esquecer de atualizar a condição (ciclo infinito), errar um por excesso ou por defeito nos limites, inicializar o acumulador dentro do ciclo, indentar mal (por exemplo, um return dentro do ciclo) e alterar uma lista enquanto a percorre. Quase todos se detetam seguindo o programa à mão, volta a volta.

Porque se cometem estes erros

Um ciclo junta quatro peças: inicialização, condição, corpo e atualização. Basta uma estar fora do sítio para o resultado mudar. Além disso, o computador faz exatamente o que se escreve, não o que se queria. Por isso a melhor defesa é o teste de mesa: escrever numa tabela o valor de cada variável a cada volta.

Os erros, um a um

Erro 1 — Ciclo infinito

  • Errado: n = 1, depois while n <= 3: com apenas print(n) no bloco.
  • Sintoma: o programa mostra 1 sem parar.
  • Correção: acrescentar n += 1 dentro do bloco.
  • Porquê: a condição só muda se alguma variável nela for alterada.

Erro 2 — Um a mais ou a menos (off-by-one)

  • Errado: soma = 0, for i in range(1, 5): soma += i para somar de 1 a 5. Resultado: 1 + 2 + 3 + 4 = 10.
  • Correção: range(1, 6). Resultado: 15.
  • Porquê: o limite superior de range não é incluído.

Erro 3 — Acumulador dentro do ciclo

  • Errado: for n in [3, 5, 2]: com soma = 0 e soma += n no bloco. No fim soma vale 2.
  • Correção: colocar soma = 0 antes do for. Resultado: 10.
  • Porquê: a cada volta o acumulador voltava a zero.

Erro 4 — Indentação errada (return no sítio errado)

  • Errado: numa função, total = 0, for x in lista: com total += x e return total alinhado com total += x (dentro do ciclo). Para [3, 5, 2] devolve 3.
  • Correção: alinhar o return com o for (fora do ciclo). Devolve 10.
  • Porquê: o return termina a função na primeira volta.

Erro 5 — Alterar uma lista enquanto se percorre

  • Errado: nums = [2, 4, 6, 1], for n in nums: com if n % 2 == 0: nums.remove(n). Fica [4, 1], o 4 escapou.
  • Correção: criar uma lista nova, [n for n in nums if n % 2 != 0], que dá [1].
  • Porquê: ao remover, os elementos deslocam-se e o ciclo salta o seguinte.

Erro 6 — Confundir índice com valor

  • Errado: lista = [10, 20, 30] e for x in lista: print(lista[x]) dá erro (IndexError), pois x é 10, não uma posição.
  • Correção: print(x), ou for i in range(len(lista)): print(lista[i]).

Erro 7 — Não converter o input

  • Errado: n = input() e for i in range(n) dá TypeError, porque input devolve texto.
  • Correção: n = int(input()).

Erro 8 — Condição que nunca é verdadeira

  • Errado: x = 10 e while x < 5: o bloco nunca corre, sem erro nem aviso.
  • Correção: rever o sinal da comparação e o valor inicial.

Verificação rápida antes de entregar

  1. A variável da condição muda dentro do ciclo?
  2. Os limites estão certos nos extremos (primeiro e último valor)?
  3. Os acumuladores (soma, contador) são inicializados antes do ciclo?
  4. A indentação do return, do print final e do break está onde queria?
  5. Fez o teste de mesa com uma entrada pequena (2 ou 3 elementos)?
  6. Experimentou o caso vazio (lista sem elementos) e o caso de um só elemento?

Exemplos resolvidos

Exemplo 1 — Encontrar e corrigir o ciclo infinito

Enunciado: Este programa devia mostrar a contagem decrescente de 3 a 1, mas não pára: n = 3, while n > 0:, print(n). Corrija-o.

Resolução:

  1. A condição é n > 0. Dentro do bloco só se mostra n.
  2. Como n nunca muda, vale sempre 3 e a condição é sempre verdadeira.
  3. Falta a atualização: n -= 1 no fim do bloco.
  4. Teste de mesa: n=3 mostra 3 e passa a 2; mostra 2 e passa a 1; mostra 1 e passa a 0; 0 > 0 é falso.

Resposta: com n -= 1 mostra 3, 2, 1 e termina. Verificação: três voltas, três valores.

Exemplo 2 — Acumulador fora do sítio

Enunciado: Um programa deve contar quantas notas da lista [8, 14, 11, 7] são positivas (≥ 10), mas mostra sempre 0 ou 1. Encontre o erro.

Resolução:

  1. O código tem for nota in notas: e dentro cont = 0 e if nota >= 10: cont += 1.
  2. O contador volta a 0 em cada volta; no fim só conta a última nota (7, que não é ≥ 10).
  3. Correção: cont = 0 antes do for.
  4. Teste de mesa: 8 não conta; 14 → 1; 11 → 2; 7 não conta.

Resposta: o resultado correto é 2. Verificação: só 14 e 11 são ≥ 10.

Exemplo 3 — Off-by-one numa tabuada

Enunciado: Para mostrar a tabuada do 3 de 1 a 10, um aluno escreveu for i in range(1, 10): print(3 * i). O que falta?

Resolução:

  1. range(1, 10) produz 1 a 9.
  2. O último valor mostrado é 3 × 9 = 27; falta 3 × 10 = 30.
  3. Correção: range(1, 11).

Resposta: com range(1, 11) obtêm-se 10 linhas, de 3 a 30. Verificação: o último valor é 3 × 10 = 30.

Exemplo 4 — Nível de exame: return indentado

Enunciado: A função maior(lista) deve devolver o maior elemento. O código é: m = lista[0], for x in lista:, if x > m: m = x, return m (este último dentro do for). Para [4, 9, 2], o que devolve e como se corrige?

Resolução:

  1. Primeira volta: x = 4, 4 > 4 é falso, e o return m executa logo, devolvendo 4.
  2. A função nunca chega ao 9.
  3. Correção: desindentar o return m para ficar alinhado com o for.
  4. Teste de mesa corrigido: m=4; x=4 mantém; x=9 → m=9; x=2 mantém; sai do ciclo e devolve 9.

Resposta: a versão errada devolve 4; a corrigida devolve 9. Verificação: 9 é de facto o maior de 4, 9, 2.

Exercícios propostos

Tente resolver primeiro no caderno; depois confira.

1Exercício 1

Encontre o erro: soma = 0, for i in range(1, 101): soma = i e depois print(soma). O objetivo é somar os inteiros de 1 a 100.

Ver dica

Compare = com +=.

Ver solução

soma = i substitui o valor em cada volta, por isso no fim soma vale 100. A linha correta é soma += i. O resultado certo é 100 × 101 ÷ 2 = 5050.

2Exercício 2

Quantas vezes o corpo corre em for i in range(2, 9)? E em for i in range(5)? E em for i in range(3, 3)?

Ver solução

range(2, 9) dá 2, 3, 4, 5, 6, 7, 8, ou seja 7 vezes. range(5) dá 0, 1, 2, 3, 4, 5 vezes. range(3, 3) não dá nenhum valor, 0 vezes. Regra: número de voltas = fim − início.

3Exercício 3

Siga à mão: x = 20, n = 0, while x > 3: com x -= 6 e n += 1. Qual o valor final de x e de n?

Ver solução

Volta 1: x = 14, n = 1. Volta 2: x = 8, n = 2. Volta 3: x = 2, n = 3. Agora 2 > 3 é falso e pára. Final: x = 2 e n = 3.

4Exercício 4

O programa for n in [4, 6, 8]: com soma += n no bloco, seguido de print(soma), dá erro. Diga qual é o erro, corrija-o e indique a média dos três valores.

Ver dica

Pergunte-se: que valor tinha soma antes da primeira volta?

Ver solução

Falta inicializar o acumulador: sem soma = 0 antes do ciclo, o Python acusa NameError, pois soma += n precisa de um valor anterior. Com soma = 0 antes do for, a soma é 4 + 6 + 8 = 18 e a média é soma / len(lista) = 18 ÷ 3 = 6.0.

5Exercício 5

Escreva e corrija: remover todos os números negativos de nums = [-1, -2, 3, -4, 5] sem alterar a lista durante o ciclo. Indique o resultado.

Ver solução

Criar lista nova: positivos = [n for n in nums if n >= 0] (ou um for com append). Resultado: [3, 5]. Remover dentro do for daria um resultado errado, pois -2 seria saltado após remover -1.

Perguntas frequentes

Qual é o erro mais comum nos exames?

O erro de limites (off-by-one) e a falta de atualização no while aparecem com muita frequência. Nas provas, o estudante tende a esquecer que range exclui o fim. Confirme sempre o primeiro e o último valor produzidos.

Como me autocorrijo?

Faça um teste de mesa com uma entrada pequena e escreva numa tabela o valor de cada variável a cada volta. Se não bater com o esperado, o erro está na linha em que o valor deixa de coincidir. Pode também acrescentar print() temporários dentro do ciclo.

Que exercícios ajudam a evitar estes erros?

Contagens simples (somas, médias, máximos), tabuadas, inversão de um texto e pesquisa de um valor numa lista. Repita-os variando os limites e use listas vazias e de um elemento para ver se o código aguenta.

O que faço quando o programa não pára?

Interrompa-o com Ctrl+C no terminal, depois confira se a variável da condição muda no bloco. Se mudar, verifique se muda no sentido certo (a decrementar quando devia incrementar, por exemplo).

Resumo

  • Um ciclo tem inicialização, condição, corpo e atualização: confira as quatro.
  • Ciclo infinito: a condição nunca fica falsa; falta atualizar a variável.
  • Em range(a, b) o valor b não entra; o número de voltas é b − a.
  • Acumuladores iniciam-se antes do ciclo; o return final fica fora dele.
  • Não remova elementos de uma lista enquanto a percorre; construa uma lista nova.
  • O teste de mesa com dados pequenos apanha a maioria dos erros.

Onde aprofundar

  • Manual e programa da disciplina de Programação da sua instituição (confirme a edição em vigor).
  • Documentação oficial do Python, tutorial da linguagem (secção sobre for, range e while).
  • CS50 da Universidade de Harvard, como referência pedagógica de introdução à programação (confirme a versão atual).

Continue a estudar

1.º ano (indicativo)8 min

Como escrever um programa para somar números até zero?

Em Python, use um acumulador total = 0, leia o primeiro número e repita com while n != 0: somando n ao total e lendo o número seguinte dentro do ciclo. O zero funciona…

4 exemplos5 exercícios com solução

1.º ano (indicativo)8 min

Como escrever um programa para a tabuada?

Leia o número com n = int(input()) e percorra os multiplicadores de 1 a 10 com for i in range(1, 11):. Dentro do ciclo, mostre cada linha com print(n, "x", i, "=", n *…

4 exemplos5 exercícios com solução

1.º ano (indicativo)7 min

Como escrever um programa para o fatorial?

O fatorial de n (n!) é o produto 1 × 2 × … × n, com 0! = 1. Em Python, comece com fat = 1, percorra for i in range(2, n + 1): e multiplique com fat *= i. No fim…

4 exemplos5 exercícios com solução

1.º ano (indicativo)8 min

Como escrever um programa para a sequência de Fibonacci?

A sequência de Fibonacci começa em 0 e 1, e cada termo seguinte é a soma dos dois anteriores: 0, 1, 1, 2, 3, 5, 8, … Em Python, guarde os dois últimos termos em a e b…

4 exemplos5 exercícios com solução

Ver tudo de Introdução à Programação · Capítulo: Estruturas de repetição