SkillsTecnológicas
Menu
Conteúdo da trilha

Como funciona o laço for

Transforme uma repetição com while em for, acompanhe a ordem de execução e construa progressões crescentes e decrescentes sem errar os limites.

Conteúdo 30 de 39

Mecanismos desenhados a lápis reúnem início, decisão e avanço para controlar uma sequência ordenada de cartões até a conclusão

Transforme uma repetição conhecida em for

O laço for é adequado quando a repetição possui uma progressão clara: um estado inicial, uma condição de continuidade e uma atualização realizada depois de cada passagem.

Considere um algoritmo que exibe cinco sessões de estudo usando while:

sessao <- 1

ENQUANTO sessao <= 5 FAÇA
  EXIBIR "Sessão", sessao
  sessao <- sessao + 1
FIM ENQUANTO

No for clássico, os três controles ficam reunidos no cabeçalho:

PARA sessao <- 1; sessao <= 5; sessao <- sessao + 1 FAÇA
  EXIBIR "Sessão", sessao
FIM PARA

A forma ficou mais compacta, mas o algoritmo não perdeu etapas. Inicialização, teste, corpo e atualização continuam acontecendo em uma ordem definida.

O cabeçalho reúne três controles diferentes

Use a forma geral:

PARA inicialização; condição; atualização FAÇA
  corpo
FIM PARA

Cada parte possui um momento e uma responsabilidade.

Inicialização

sessao <- 1

Executa uma única vez, antes do primeiro teste. Define o primeiro valor candidato da progressão.

Condição

sessao <= 5

É avaliada antes de cada passagem. Se começar falsa, o corpo executa zero vezes. O operador relacional determina quais valores pertencem ao intervalo.

Atualização

sessao <- sessao + 1

Executa depois do corpo e antes do próximo teste. Produz o valor candidato da iteração seguinte.

Inicialização, condição e atualização aparecem separadas ao redor de um while e são alinhadas às três posições do cabeçalho de um for
O for concentra os controles da progressão; ele não transforma as três etapas em uma única operação.

O corpo deve conter o trabalho de cada passagem. Se a atualização do controle ficar duplicada também dentro do corpo, a progressão pode pular valores.

A ordem real não é simplesmente da esquerda para a direita

Embora o cabeçalho seja escrito como inicialização; condição; atualização, a atualização não acontece imediatamente depois da condição. A execução segue esta ordem:

  1. realizar a inicialização uma vez;
  2. testar a condição;
  3. executar o corpo se a condição for verdadeira;
  4. realizar a atualização;
  5. voltar ao teste;
  6. sair quando a condição for falsa.
Linha de fluxo mostra inicialização executada uma vez, condição, corpo, atualização e retorno à condição, com saída pelo resultado falso
A inicialização não se repete; condição, corpo e atualização formam o ciclo.

Para sessao de 1 a 5, o rastreamento é:

TesteValor de sessaosessao <= 5CorpoAtualização
11verdadeiroexibir sessão 1sessao = 2
22verdadeiroexibir sessão 2sessao = 3
33verdadeiroexibir sessão 3sessao = 4
44verdadeiroexibir sessão 4sessao = 5
55verdadeiroexibir sessão 5sessao = 6
66falsonão executarnão atualizar

Existem cinco iterações, cinco atualizações e seis testes. O teste adicional reconhece que o primeiro valor fora do intervalo foi alcançado.

Defina o intervalo antes de escolher os símbolos

Uma progressão não é descrita apenas por “começa em 1 e termina em 5”. Registre:

  • primeiro valor incluído;
  • regra que decide o último valor incluído;
  • primeiro valor excluído;
  • direção do avanço;
  • tamanho do passo.

Para contar sessões de 1 a 5:

inicio = 1
condicao = sessao <= 5
passo = +1
valores = 1, 2, 3, 4, 5
primeiro excluido = 6

Para percorrer cinco posições indexadas a partir de zero:

inicio = 0
condicao = posicao < 5
passo = +1
valores = 0, 1, 2, 3, 4
primeiro excluido = 5
Duas linhas numéricas comparam valores incluídos de 1 a 5 usando menor ou igual e posições incluídas de 0 a 4 usando menor que 5
As duas progressões possuem cinco iterações, mas representam valores e limites diferentes.

Trocar < por <= sem ajustar o significado pode criar um erro de uma posição. Não existe um operador universalmente correto: existe o operador coerente com o intervalo modelado.

Escreva o for clássico em JavaScript e C#

JavaScript e C# usam uma forma de cabeçalho semelhante.

JavaScript

for (let sessao = 1; sessao <= 5; sessao += 1) {
  console.log(`Sessão ${sessao}`);
}

let sessao = 1 executa uma vez. sessao <= 5 vem antes de cada corpo. sessao += 1 acontece após cada passagem.

C#

for (int sessao = 1; sessao <= 5; sessao += 1)
{
    Console.WriteLine($"Sessão {sessao}");
}

Em ambos os exemplos, a variável declarada no inicializador fica limitada ao escopo definido pela construção da linguagem. Se o valor final precisar ser usado depois, avalie se ele representa um resultado real ou apenas um mecanismo interno de controle.

A sintaxe permite variações mais complexas, inclusive partes omitidas em algumas linguagens. Para aprender e manter o código claro, comece com uma variável de controle, uma condição direta e uma atualização previsível.

Em Python, for percorre um iterável

O for de Python não expõe inicialização, condição e atualização no cabeçalho como JavaScript e C#. Ele atribui, a cada passagem, o próximo item de uma sequência ou de outro objeto iterável.

Para produzir as sessões de 1 a 5, use range:

for sessao in range(1, 6):
    print(f"Sessão {sessao}")

range(1, 6) começa em 1 e para antes de 6, produzindo 1, 2, 3, 4, 5. O limite final é exclusivo.

Para percorrer itens diretamente:

temas = ["Lógica", "Dados", "Testes"]

for tema in temas:
    print(tema)

Aqui, a intenção não é administrar uma posição numérica, mas visitar cada tema. JavaScript e C# também oferecem construções próprias para percorrer coleções. A palavra for aparece em todas essas formas, porém o contrato do cabeçalho não é idêntico.

Evite explicar range como se ele “fosse” a condição de um for clássico. Ele fornece uma progressão iterável; o mecanismo do Python obtém seus valores um a um.

Mude direção e passo de maneira coerente

Uma contagem regressiva precisa combinar estado inicial, condição e atualização:

for (let valor = 10; valor >= 2; valor -= 2) {
  console.log(valor);
}

Resultado:

10
8
6
4
2

O controle começa em 10, continua enquanto for maior ou igual a 2 e diminui de dois em dois. O próximo valor, 0, torna a condição falsa.

Em Python, a progressão equivalente é:

for valor in range(10, 1, -2):
    print(valor)

O limite 1 não entra; o passo -2 produz 10, 8, 6, 4, 2.

Se o controle começa em 10, a condição exige valor >= 2 e a atualização soma 2, ele se afasta do limite. Em um domínio numérico sem estouro, o laço não alcançaria a saída. Direção da condição e sinal do passo precisam concordar.

Escolha for quando a progressão é parte da intenção

O for clássico costuma comunicar bem:

  • repetir uma quantidade conhecida de vezes;
  • percorrer uma faixa de posições;
  • avançar ou recuar com passo regular;
  • manter os controles da progressão próximos;
  • deixar a variável de controle restrita ao laço.

Prefira outra forma quando:

  • a duração depende de uma condição sem progressão previsível;
  • a primeira passagem precisa ocorrer antes do teste;
  • a intenção é visitar itens sem usar suas posições;
  • a atualização depende de muitas ramificações dentro do corpo.

Um while pode reproduzir qualquer progressão simples do exemplo, mas exige manter inicialização e atualização em locais separados. A escolha é de comunicação e manutenção, não de capacidade absoluta.

Entenda o efeito de continue

No for clássico, um continue encerra a passagem atual, executa a parte de atualização e volta à condição. Isso é diferente de um while cuja atualização manual esteja abaixo do ponto desviado.

for (let valor = 1; valor <= 5; valor += 1) {
  if (valor === 3) {
    continue;
  }

  console.log(valor);
}

O resultado é 1, 2, 4, 5. Mesmo quando valor vale 3, a atualização ainda o leva a 4. A progressão não fica presa.

Isso não torna todo uso de continue simples. Se o corpo mantém outros estados além da variável do cabeçalho, confirme que o desvio não pula uma atualização necessária.

Teste a progressão por propriedades

Não valide somente a lista feliz. Verifique:

CasoExemploResultado esperado
condição inicialmente falsainicio = 6, condicao <= 5zero iterações
uma passageminicio = 5, condicao <= 5, passo +1somente 5
várias passagensinicio = 1, condicao <= 5, passo +11 a 5
passo maiorinicio = 1, condicao <= 5, passo +21, 3, 5
direção incompatívelinicio = 1, condicao <= 5, passo -1não termina corretamente

Além das saídas concretas, confira estas propriedades:

  • todo valor exibido satisfaz a condição;
  • o primeiro valor é o inicializado;
  • dois valores consecutivos diferem pelo passo;
  • a atualização final produz um valor que falha no teste;
  • a quantidade de iterações corresponde ao intervalo desejado.

Faça um teste de mesa quando houver dúvida sobre limites. Registre condição, corpo e atualização em colunas separadas.

Pratique com uma agenda de revisões

Crie três progressões:

  1. dias de revisão de 1 a 7;
  2. posições de uma semana armazenadas de 0 a 6;
  3. contagem regressiva de 12 a 0, diminuindo de 3 em 3.

Para cada uma, declare primeiro valor incluído, último incluído, primeiro excluído, direção e passo. Depois escreva em pseudocódigo, JavaScript ou C# e registre o teste final falso.

Reescreva uma delas em Python com range. Explique por que o argumento de parada não aparece na saída.

O que você deve guardar

O for clássico reúne inicialização, condição e atualização, mas executa cada parte em um momento diferente. Ele é especialmente claro quando uma progressão previsível controla a repetição.

Modele o intervalo antes de escolher < ou <=, alinhe direção e passo, registre o teste final falso e reconheça que o for de Python percorre um iterável em vez de expor o mesmo cabeçalho. Agora aprofunde contadores e acumuladores para distinguir os papéis desempenhados pelos valores que mudam durante uma repetição.

Referências