SkillsTecnológicas
Menu
Conteúdo da trilha

O que são estruturas de repetição

Entenda como estado, condição, corpo, atualização e saída controlam iterações por condição, contagem ou coleção.

Conteúdo 27 de 39

Cartão desenhado a lápis percorre um circuito, acumula marcas a cada volta e sai por uma decisão ao concluir a repetição

Uma estrutura de repetição executa um bloco várias vezes

Uma estrutura de repetição, também chamada de laço ou loop, controla a execução repetida de um bloco de instruções. Cada passagem pelo bloco é uma iteração.

Imagine cinco valores de venda que precisam ser somados. Sem repetição, o algoritmo poderia duplicar a mesma operação:

total <- total + vendas[0]
total <- total + vendas[1]
total <- total + vendas[2]
total <- total + vendas[3]
total <- total + vendas[4]

Um laço expressa o padrão uma única vez:

posicao <- 0
total <- 0

ENQUANTO posicao < 5 FAÇA
  total <- total + vendas[posicao]
  posicao <- posicao + 1
FIM ENQUANTO

O bloco continua o mesmo, mas o estado muda a cada passagem. posicao indica qual venda está sendo processada e total conserva a soma construída até aquele momento.

Fluxo de um laço mostra inicialização, teste da condição, execução do corpo, atualização do estado, retorno ao teste e saída quando a condição fica falsa
Um laço não significa apenas voltar: ele testa uma regra, executa trabalho e modifica o estado antes da próxima decisão.

Repetir não é executar tudo ao mesmo tempo. As iterações ocorrem em uma ordem definida, e cada uma pode observar os resultados deixados pelas anteriores.

Os cinco elementos que mantêm um laço sob controle

Um laço bem definido normalmente possui:

  1. estado inicial: valores existentes antes da primeira iteração;
  2. condição de continuidade: pergunta que decide se haverá outra passagem;
  3. corpo: instruções repetidas;
  4. atualização: mudança que aproxima o fluxo do término ou do próximo item;
  5. saída: estado em que a condição não permite continuar.

No exemplo das vendas:

ElementoRepresentação
Estado inicialposicao = 0, total = 0
Condiçãoposicao < 5
Corpoadicionar vendas[posicao] ao total
Atualizaçãoposicao = posicao + 1
Saídaposicao = 5

A condição usa um operador relacional para produzir verdadeiro ou falso. A repetição combina essa decisão com um retorno: se for verdadeira, executa o corpo e volta a testar; se for falsa, segue após o laço.

Nem todo laço apresenta os cinco elementos no mesmo lugar. Uma construção que percorre uma coleção pode administrar posição e término automaticamente. Ainda assim, esses papéis existem no comportamento da estrutura.

Estado liga uma iteração à seguinte

O estado reúne as informações que podem mudar ao longo da execução. Ele pode incluir:

  • um contador de posições ou tentativas;
  • um total acumulado;
  • o item atual de uma coleção;
  • um indicador como encontrado;
  • dados lidos da entrada;
  • uma quantidade restante.

Considere vendas = [12, 8, 15]:

MomentoposicaoCondição posicao < 3Valor usadototal depois do corpo
antes da 1ª iteração0verdadeiro1212
antes da 2ª iteração1verdadeiro820
antes da 3ª iteração2verdadeiro1535
teste final3falso35
Três iterações percorrem os valores 12, 8 e 15; a posição avança de zero a três e o total evolui de zero para 12, 20 e 35 antes da saída
Cada iteração recebe o estado anterior, processa um item e entrega um novo estado à próxima.

Uma afirmação útil para acompanhar o laço é: antes de cada teste, total contém a soma dos elementos anteriores a posicao. Esse tipo de propriedade ajuda a explicar por que o algoritmo funciona, não apenas que ele chegou ao resultado esperado.

As variáveis usadas para controle precisam ter papéis claros. Misturar na mesma variável posição, quantidade processada e valor do item favorece erros difíceis de rastrear.

Três formas de saber quanto repetir

A estrutura deve refletir o que determina o término.

Repetição controlada por condição

Use quando não se conhece antecipadamente o número de iterações, mas existe uma condição observável:

ENQUANTO resposta NÃO estiver válida FAÇA
  solicitar nova resposta
FIM ENQUANTO

O número de tentativas depende dos dados recebidos. O estado precisa mudar de modo que a condição possa finalmente se tornar falsa.

Repetição controlada por contagem

Use quando existe uma quantidade ou faixa conhecida:

PARA posicao DE 0 ATÉ 4 FAÇA
  processar vendas[posicao]
FIM PARA

Inicialização, limite e avanço formam uma progressão previsível. Muitas linguagens expressam esse controle com for, mas os limites inclusivos ou exclusivos variam.

Repetição controlada por coleção

Use quando a intenção é executar uma vez para cada elemento:

PARA CADA venda EM vendas FAÇA
  total <- total + venda
FIM PARA

Essa forma comunica o domínio diretamente e evita administrar um índice quando a posição não é necessária.

Três painéis comparam um laço controlado por condição desconhecida, outro por contagem de posições e outro por cada item de uma coleção
Condição, contagem e coleção respondem a perguntas diferentes sobre quando existe uma próxima iteração.

Essas categorias podem se sobrepor na implementação. Um percurso de coleção também possui uma condição de término; a diferença é que a linguagem ou o iterador a administra. Escolha a forma que torne a intenção mais visível.

Testar antes ou depois muda a quantidade mínima

Alguns laços verificam a condição antes do corpo. Se ela começar falsa, executam zero vezes:

ENQUANTO possuiProximoItem FAÇA
  processar item
FIM ENQUANTO

Outros verificam depois do corpo e, por isso, executam ao menos uma vez:

FAÇA
  solicitar opção
ENQUANTO opção for inválida

Essa diferença não é apenas sintática. Se a coleção estiver vazia, um teste anterior evita tentar processar um item inexistente. Se a primeira tentativa precisa ocorrer para que a condição possa ser conhecida, o teste posterior pode representar melhor o fluxo.

As próximas aulas aprofundarão while, do while e for. Por enquanto, guarde a pergunta: é válido executar zero vezes ou a primeira passagem é obrigatória?

Progresso precisa aproximar o laço do término

Observe este erro:

posicao <- 0

ENQUANTO posicao < 5 FAÇA
  exibir vendas[posicao]
FIM ENQUANTO

posicao nunca muda. Se começou em 0, a condição permanece verdadeira e o mesmo elemento é exibido indefinidamente.

Um laço potencialmente infinito nem sempre é acidental: servidores e filas podem esperar trabalho continuamente. Mesmo nesses casos existe uma estratégia de interrupção, cancelamento ou encerramento externo. Em um algoritmo finito, você deve conseguir explicar:

  • qual variável ou fonte muda;
  • em qual direção ela muda;
  • qual estado torna a condição falsa;
  • por que esse estado é alcançável.

Atualizar não significa obrigatoriamente somar um. Uma fila pode perder um item processado, uma busca pode avançar para o próximo nó e uma entrada pode mudar quando novos dados chegam. O requisito é progresso coerente com a condição.

Limites definem quais valores entram

Erros de uma posição são chamados frequentemente de erros de limite ou off-by-one. Compare:

posicao < quantidade

com:

posicao <= quantidade

Se uma coleção possui quantidade = 5 e suas posições vão de 0 a 4, a primeira condição aceita exatamente cinco posições. A segunda tenta alcançar também a posição 5, que está fora da coleção.

Não memorize apenas “use menor que”. Modele o intervalo:

  • ponto inicial;
  • primeiro valor incluído;
  • último valor incluído;
  • primeiro valor excluído;
  • direção e tamanho do passo.

Uma contagem de 1 até 5 pode usar limites diferentes de um percurso pelas posições 0 até 4. O número de iterações pode ser igual, mas os valores do estado não são.

break e continue alteram o caminho normal

Muitas linguagens oferecem duas transferências:

  • break encerra o laço imediatamente;
  • continue pula o restante da iteração atual e segue para a próxima.

Uma busca pode parar ao encontrar o primeiro resultado:

PARA CADA produto EM produtos FAÇA
  SE produto.id = idProcurado ENTÃO
    encontrado <- produto
    INTERROMPER LAÇO
  FIM SE
FIM PARA

Uma filtragem pode ignorar itens inválidos:

PARA CADA leitura EM leituras FAÇA
  SE leitura for inválida ENTÃO
    CONTINUAR NA PRÓXIMA
  FIM SE
  adicionar leitura ao total
FIM PARA

Esses comandos podem simplificar o fluxo, mas também escondem caminhos quando aparecem em excesso. Com continue, confirme que a atualização necessária ao término não foi pulada. Em laços aninhados, uma interrupção sem rótulo normalmente afeta apenas o laço mais interno; esse tema será tratado adiante.

Repetir trabalho não garante repetir com segurança

Se o corpo envia uma cobrança, grava um arquivo ou chama um serviço, executar novamente pode duplicar o efeito. Antes de usar um laço para repetir uma operação externa, pergunte:

  • cada iteração trabalha com uma unidade distinta?
  • uma falha parcial pode fazer a mesma unidade ser processada outra vez?
  • o estado é atualizado antes ou depois do efeito?
  • existe uma forma de reconhecer o que já foi concluído?

Nesta trilha, começaremos com cálculos previsíveis em memória. A observação continua importante: um laço controla quantas vezes o corpo é alcançado, não garante sozinho que o corpo seja seguro ou reversível.

Teste zero, uma e muitas iterações

Para qualquer repetição, comece por três tamanhos:

CenárioO que revela
zero iteraçõescondição inicialmente falsa e coleção vazia
uma iteraçãoinicialização, corpo e saída imediata
várias iteraçõesatualização, conservação do estado e término

Acrescente limites e situações específicas:

  • último elemento da coleção;
  • valor encontrado no começo, no meio e no fim;
  • nenhum valor encontrado;
  • entrada que permanece inválida por várias tentativas;
  • condição que nunca muda;
  • interrupção e continuação.

Faça um teste de mesa com uma linha por teste da condição e outra por iteração, ou declare claramente qual convenção está usando. Registre o teste final falso: ele explica por que o laço encerrou.

Erros comuns

Esquecer a atualização

O estado permanece igual e a condição nunca se aproxima da saída.

Atualizar na direção errada

Com posicao < 5, diminuir uma posição iniciada em zero afasta o estado do limite.

Errar o limite inclusivo ou exclusivo

O laço processa um elemento a menos ou tenta acessar uma posição inexistente.

Alterar a coleção durante o percurso sem conhecer a regra

Remover ou inserir elementos pode pular itens, repeti-los ou invalidar o mecanismo de iteração. Confira o contrato da linguagem e, quando necessário, percorra uma cópia ou produza outra coleção.

Usar contagem quando a intenção é percorrer itens

Um índice desnecessário aumenta as decisões sobre início, limite e acesso. Prefira a abstração “para cada” quando a posição não for usada.

Testar apenas o caso com vários elementos

Coleções vazias e unitárias revelam inicialização e limites que o caso comum pode esconder.

Confundir continue com break

Um pula somente a iteração atual; o outro encerra toda a repetição mais próxima.

Pratique com leituras de temperatura

Considere leituras = [21, 24, 19, 26]. Construa um algoritmo que percorra a coleção e produza:

  • quantidade de leituras;
  • soma das temperaturas;
  • maior temperatura;
  • média ao final.

Antes do laço, defina o estado inicial. Durante cada iteração, atualize contador, soma e maior valor. Depois do laço, calcule a média somente se a quantidade for maior que zero.

Teste também [], [21] e uma coleção com temperaturas negativas. Registre o estado após cada passagem e escreva, em uma frase, o que permanece verdadeiro antes de toda nova iteração.

O que você deve guardar

Uma estrutura de repetição executa um bloco em várias iterações controladas por condição, contagem ou coleção. O laço conecta decisões e estado: testa se deve continuar, realiza trabalho, atualiza informações e volta ao ponto de controle.

Defina início, corpo, progresso e saída; escolha limites conscientemente; teste zero, uma e muitas passagens; e trate interrupções como caminhos explícitos. Agora aprenda como funciona o laço while e construa uma repetição controlada por condição passo a passo.

Referências