Introdução à Programação · 1.º ano (indicativo)
Quais são os erros mais comuns nos ciclos?
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, depoiswhile n <= 3:com apenasprint(n)no bloco. - Sintoma: o programa mostra 1 sem parar.
- Correção: acrescentar
n += 1dentro 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 += ipara somar de 1 a 5. Resultado: 1 + 2 + 3 + 4 = 10. - Correção:
range(1, 6). Resultado: 15. - Porquê: o limite superior de
rangenão é incluído.
Erro 3 — Acumulador dentro do ciclo
- Errado:
for n in [3, 5, 2]:comsoma = 0esoma += nno bloco. No fimsomavale 2. - Correção: colocar
soma = 0antes dofor. 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:comtotal += xereturn totalalinhado comtotal += x(dentro do ciclo). Para[3, 5, 2]devolve 3. - Correção: alinhar o
returncom ofor(fora do ciclo). Devolve 10. - Porquê: o
returntermina a função na primeira volta.
Erro 5 — Alterar uma lista enquanto se percorre
- Errado:
nums = [2, 4, 6, 1],for n in nums:comif 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]efor x in lista: print(lista[x])dá erro (IndexError), poisxé 10, não uma posição. - Correção:
print(x), oufor i in range(len(lista)): print(lista[i]).
Erro 7 — Não converter o input
- Errado:
n = input()efor i in range(n)dáTypeError, porqueinputdevolve texto. - Correção:
n = int(input()).
Erro 8 — Condição que nunca é verdadeira
- Errado:
x = 10ewhile 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
- A variável da condição muda dentro do ciclo?
- Os limites estão certos nos extremos (primeiro e último valor)?
- Os acumuladores (
soma,contador) são inicializados antes do ciclo? - A indentação do
return, doprintfinal e dobreakestá onde queria? - Fez o teste de mesa com uma entrada pequena (2 ou 3 elementos)?
- 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:
- A condição é
n > 0. Dentro do bloco só se mostran. - Como
nnunca muda, vale sempre 3 e a condição é sempre verdadeira. - Falta a atualização:
n -= 1no fim do bloco. - 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:
- O código tem
for nota in notas:e dentrocont = 0eif nota >= 10: cont += 1. - O contador volta a 0 em cada volta; no fim só conta a última nota (7, que não é ≥ 10).
- Correção:
cont = 0antes dofor. - 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:
range(1, 10)produz 1 a 9.- O último valor mostrado é 3 × 9 = 27; falta 3 × 10 = 30.
- 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:
- Primeira volta:
x = 4,4 > 4é falso, e oreturn mexecuta logo, devolvendo 4. - A função nunca chega ao 9.
- Correção: desindentar o
return mpara ficar alinhado com ofor. - 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
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 valorbnão entra; o número de voltas éb − a. - Acumuladores iniciam-se antes do ciclo; o
returnfinal 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,rangeewhile). - CS50 da Universidade de Harvard, como referência pedagógica de introdução à programação (confirme a versão atual).
Continue a estudar
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✓ Estudado
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✓ Estudado
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✓ Estudado
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✓ Estudado
Ver tudo de Introdução à Programação · Capítulo: Estruturas de repetição