Trilha de aprendizado · Nível 9 · Tutorial 7

Repetições com while e for

Repita ações com while e for, calculando a quantidade de iterações e verificando se a repetição termina sem ultrapassar os limites do contador.

  • Nível: Iniciante
  • Duração: 20 min
  • 8 passos
Repetições com while e for

O que você vai percorrer

  1. O que se repete no programa Diferencie a repetição criada no código das chamadas automáticas de `loop()` e preveja quando uma sequência finita recomeça. 2 min
  2. while: testar, executar e atualizar Construa e rastreie um while simples, observando o teste antes do corpo, a atualização do contador e o teste final falso. 3 min
  3. for: organizar uma repetição contada Organize uma contagem planejada com for e compare sua ordem de execução com um while equivalente. 3 min
  4. Quantas vezes o corpo será executado? Calcule iterações enumerando os valores que entram no corpo e confira o valor do teste final. 3 min
  5. O laço consegue chegar ao fim? Analise se a atualização do contador permite que a condição de continuidade se torne falsa. 2 min
  6. A faixa do contador também importa Analise os limites de um contador sem sinal e escolha uma faixa que permita ao laço alcançar sua condição de término. 3 min
  7. Aplicar o laço a uma sequência de piscadas Aplique um for seguro para gerar uma sequência observável e finita de piscadas no LED integrado do Uno R3. 3 min
  8. Revisão final: prever, completar e conferir Revisão integrada de equivalência entre for e while, contagem de piscadas e término seguro do contador. 2 min

O que você vai aprender

  • Escrever uma repetição contada com for e uma repetição condicionada com while.
  • Determinar quantas vezes o corpo de um laço será executado.
  • Rastrear a atualização do contador e o teste da condição.
  • Identificar por análise laços que não progridem até o término ou que excedem a faixa do contador.
  • Relacionar uma sequência finita de comandos ao comportamento observado do LED.

Antes de começar

  • Decisões com if e else no firmware
  • Controle de LEDs com saídas digitais

Passo 1 de 8

O que se repete no programa

Diferencie a repetição criada no código das chamadas automáticas de loop() e preveja quando uma sequência finita recomeça.

Reconheça as duas repetições

Repetição escrita e repetição automática

Duas formas de algo acontecer de novo

Um laço é uma estrutura escrita no programa para repetir um bloco de instruções. Cada vez que o corpo desse laço é executado, ocorre uma iteração.

Mas um sketch Arduino também tem uma repetição própria: depois de setup() terminar, o ambiente chama loop() novamente e novamente. Essa chamada automática não é um laço que você escreveu dentro do código; ela faz parte do funcionamento do ambiente Arduino.

O fluxo geral de um sketch

Diagrama comparando setup executado uma vez com loop chamado continuamente em ciclo.

setup() ocorre uma vez após a inicialização; loop() é chamado repetidamente pelo ambiente.

Fim local, programa em andamento

Quando a sequência volta a começar

Imagine que exista uma repetição escrita dentro de uma função. Ela executa seu corpo algumas vezes e então termina. Ao terminar, o programa segue para a próxima instrução da mesma função.

Portanto, terminar um laço não encerra o sketch. Ele apenas encerra aquela repetição interna.

Se uma sequência finita estiver em setup(), ela será iniciada uma vez por inicialização ou reset. Se estiver em loop(), ela poderá ser iniciada de novo quando uma chamada de loop() terminar e o ambiente fizer a próxima chamada.

Exemplo

Compare os dois locais

Considere estes dois comportamentos, sem se preocupar ainda com a sintaxe usada para repetir:

Em setup()

  1. Executa uma sequência finita de ações.
  2. Continua para a instrução seguinte em setup().
  3. setup() termina.
  4. O ambiente passa a chamar loop().

Em loop()

  1. Executa uma sequência finita de ações.
  2. Continua para a instrução seguinte em loop().
  3. A chamada atual de loop() termina.
  4. O ambiente chama loop() outra vez: a sequência pode recomeçar.

Verifique sua previsão

Onde a sequência se repete?

Associe cada situação ao comportamento esperado.

Associe situação e efeito

Faça as associações.

Toque em um item e depois no par correspondente.

Passo 2 de 8

while: testar, executar e atualizar

Construa e rastreie um while simples, observando o teste antes do corpo, a atualização do contador e o teste final falso.

A sequência de um while

A estrutura do while

Um while repete um bloco enquanto sua condição for verdadeira. A condição fica entre parênteses, e o corpo do laço fica entre chaves.

Para controlar a repetição, organize o código em quatro partes:

  1. inicialize a variável de controle;
  2. teste a condição;
  3. execute o corpo se o teste for verdadeiro;
  4. atualize a variável para que um próximo teste possa mudar o resultado.

O teste ocorre antes do corpo. Portanto, se a condição já for falsa, o corpo não executa nenhuma vez.

Diagrama do fluxo de um while: inicialização, teste, corpo, atualização e retorno ao teste; quando o teste é falso, o fluxo sai do laço.

O corpo só é alcançado quando o teste da condição resulta em verdadeiro.

Rastreando contador, teste e atualização

Um while com contador crescente

Exemplo para estudar: o contador começa em 0 e o corpo deve executar enquanto ele for menor que 3.

cpp
int contador = 0;

while (contador < 3) {
  // Uma ação é executada aqui.
  contador++;
}

// O programa continua aqui.

Atualização e saída

contador++ aumenta o valor armazenado em contador em uma unidade. Neste uso, ele é uma instrução de atualização: acontece depois do corpo e antes do próximo teste.

Quando contador chega a 3, a comparação contador < 3 é falsa. O corpo não é executado com o valor 3; o programa segue para a primeira instrução após as chaves.

Rastreamento do exemplo

Rastreie cada teste, não apenas as vezes em que o corpo executa.

O último teste falso encerra o laço.
Valor no testecontador < 3Corpo executa?Valor após atualização
0verdadeirosim1
1verdadeirosim2
2verdadeirosim3
3falsonão—

Prática: prever a ordem

Explique a primeira passagem do laço

Considere o início da execução do exemplo anterior. Coloque as etapas na ordem em que acontecem na primeira passagem pelo laço.

Escreva pelo menos 80 caracteres (0/80).

Ordem de execução

Agora organize a mesma primeira passagem em etapas.

Ordene as etapas da primeira passagem pelo while.

  1. Testar se contador é menor que 3
  2. Executar a ação do corpo
  3. Inicializar contador com 0
  4. Incrementar contador para 1

Prática: condição e atualização

Complete o while

Complete o while para executar o corpo com os valores 0, 1 e 2 e, depois, sair do laço.

cpp
int contador = 0;

while (contador  3) {
  // Uma ação é executada aqui.
  contador;
}

// O programa continua aqui.

Passo 3 de 8

for: organizar uma repetição contada

Organize uma contagem planejada com for e compare sua ordem de execução com um while equivalente.

Lendo um for

Três partes no cabeçalho

Use for quando você já planeja uma contagem. O cabeçalho reúne três partes, separadas por ponto e vírgula:

  1. inicialização: prepara o contador uma única vez;
  2. condição: é testada antes de cada execução do corpo;
  3. atualização: acontece após cada execução do corpo.

A atualização não ocorre antes da primeira passagem pelo corpo.

Ordem do for

Diagrama mostrando inicialização uma vez, teste da condição, execução do corpo, atualização e retorno ao teste.

A condição vem antes do corpo; a atualização vem depois do corpo e antes do próximo teste.

Exemplo de for contado

Este laço usa no corpo os valores 0, 1 e 2 para contador.

cpp
for (int contador = 0; contador < 3; contador++) {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(200);
  digitalWrite(LED_BUILTIN, LOW);
  delay(200);
}

A atualização vem antes do teste final

Rastreando a última passagem

No exemplo, a ordem real é:

  • int contador = 0 executa uma vez;
  • contador < 3 é verdadeiro: executa o corpo com contador igual a 0;
  • contador++ muda o valor para 1;
  • o teste e o corpo se repetem com 1 e depois com 2;
  • após o corpo com 2, contador++ produz 3;
  • contador < 3 é falso, então o laço termina.

Portanto, a atualização também acontece após a última execução do corpo. O valor 3 não chega ao corpo, mas é avaliado no teste final.

Rastreamento

Compare os valores e a posição da atualização no exemplo.

O contador chega a 3 somente depois da terceira execução do corpo.
Momentocontadorcontador < 3Ação
Inicialização0—Prepara o laço
1º teste0VerdadeiroCorpo; depois incrementa
2º teste1VerdadeiroCorpo; depois incrementa
3º teste2VerdadeiroCorpo; depois incrementa
Teste final3FalsoSai do laço

For e while equivalentes

O mesmo comportamento em while

Um for simples pode ser escrito como um while com a mesma ordem de operações. A inicialização fica antes do while, a condição permanece no teste e a atualização fica no fim do corpo.

Comparação equivalente

Os dois trechos usam contador com os valores 0, 1 e 2 dentro do corpo.

cpp
// Forma com for
for (int contador = 0; contador < 3; contador++) {
  // corpo
}

// Forma equivalente com while
int contador = 0;
while (contador < 3) {
  // corpo
  contador++;
}

Dica

Escolha pela clareza

for é uma escolha usual quando a contagem está planejada no cabeçalho. while costuma deixar mais evidente uma repetição cuja continuidade depende de uma condição. Isso é uma escolha de clareza: ambos podem expressar a mesma repetição simples.

Pratique a estrutura

Monte um for contado

Complete o cabeçalho para executar o corpo com contador igual a 1, 2 e 3, nessa ordem.

cpp
for (; ; ) {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
  delay(100);
}

Passo 4 de 8

Quantas vezes o corpo será executado?

Calcule iterações enumerando os valores que entram no corpo e confira o valor do teste final.

Contagem crescente: liste antes de concluir

Conte os valores que entram no corpo

A quantidade de execuções não depende apenas do número que aparece no limite. Confira sempre três elementos: valor inicial, condição e passo de atualização.

O método mais seguro é listar os valores que realmente chegam ao corpo do laço. Cada valor listado corresponde a uma iteração.

Em for (int i = 0; i < 4; i++), os valores no corpo são 0, 1, 2 e 3: portanto, são 4 execuções. O valor 4 não entra no corpo, porque falha no teste i < 4.

Do corpo ao teste final

Diagrama de um contador que executa o corpo com os valores de 0 a 3 e para ao testar o valor 4.

Os valores destacados entram no corpo; o valor seguinte aparece apenas no teste final que encerra o laço.

Limite exclusivo ou inclusivo

Compare condições muito parecidas: < exclui o limite; <= inclui o limite.

O passo é `i++` em todos os exemplos.
CabeçalhoValores no corpoExecuções
for (int i = 0; i < 4; i++)0, 1, 2, 34
for (int i = 0; i <= 4; i++)0, 1, 2, 3, 45
for (int i = 1; i < 1; i++)nenhum0

Conte também de trás para frente

Crescente, decrescente e com passo maior

Leia cada cabeçalho e acompanhe os valores de n que chegam ao corpo. A atualização ocorre depois do corpo, inclusive após a última execução.

cpp
// Corpo executa com n = 2, 4, 6, 8
for (int n = 2; n < 10; n += 2) {
  // uma iteração
}

// Corpo executa com n = 5, 3, 1
for (int n = 5; n >= 1; n -= 2) {
  // uma iteração
}

// A condição já é falsa: corpo não executa
for (int n = 7; n < 7; n++) {
  // zero iterações
}

Dica

O teste final também faz parte do rastreamento

No primeiro exemplo, depois de usar 8, o programa atualiza n para 10. Esse 10 é testado, mas não executa o corpo porque 10 < 10 é falso.

No exemplo decrescente, o último valor usado é 1. Após o corpo, n passa para -1; o teste -1 >= 1 é falso. Diferencie o último valor usado no corpo do valor que provoca o teste final falso.

E se o primeiro teste já falhar?

Identifique zero execuções

Quantas vezes o corpo deste laço será executado?

for (int n = 7; n < 7; n++) {
  digitalWrite(LED_BUILTIN, HIGH);
}

Pratique uma contagem decrescente

Monte uma contagem decrescente

Complete o cabeçalho para que o corpo execute exatamente três vezes, com n valendo 5, 3 e 1, nessa ordem.

cpp
for (int n = ; n  1; n ) {
  digitalWrite(LED_BUILTIN, HIGH);
}

Passo 5 de 8

O laço consegue chegar ao fim?

Analise se a atualização do contador permite que a condição de continuidade se torne falsa.

A condição precisa ter uma saída

Progresso até a saída

Para um laço terminar, a condição precisa poder ficar falsa

Em cada volta, pergunte: qual valor muda? E essa mudança leva a condição para false?

No exemplo while (contador < 3), um contador que começa em 0 precisa aumentar: 0, 1, 2 executam o corpo; depois, ao chegar a 3, o teste fica falso e o programa segue adiante.

Alterar uma variável não é suficiente. A atualização precisa ocorrer na direção compatível com a condição.

Como o contador alcança a saída

Diagrama mostrando o contador avançando de 0 para 3, com repetição antes de 3 e saída ao chegar a 3.

A condição contador < 3 deixa de ser verdadeira quando a atualização leva o contador até 3.

Atenção

Analise antes de executar

Não grave nem execute na placa um laço que você ainda não confirmou que termina. Se ele não chega ao fim, o fluxo fica preso no corpo do laço e as instruções seguintes não são alcançadas.

Duas falhas de progresso

Sem atualização, não há progresso

Exemplo defeituoso: contador nunca muda.

cpp
int contador = 0;

while (contador < 3) {
  digitalWrite(LED_BUILTIN, HIGH);
}

digitalWrite(LED_BUILTIN, LOW);

Rastreie o que acontece

Como contador permanece em 0, o teste contador < 3 continua verdadeiro. O comando que apaga o LED está depois do while, portanto não é executado enquanto o laço permanece ativo.

A correção exige atualizar o contador dentro do corpo, de modo que ele possa alcançar um valor que torne a condição falsa.

Atualização incompatível com a condição

Exemplo defeituoso: a atualização existe, mas segue no sentido errado.

cpp
int contador = 0;

while (contador < 3) {
  contador--;
}

Mudar não basta

O contador segue 0, -1, -2... Todos esses valores continuam menores que 3. Para sair de uma condição com < 3, este contador deveria avançar até 3 ou mais, não diminuir.

Prática: identificar o problema

Verifique a direção da atualização

Considere o código abaixo, apenas por análise:

int contador = 3;
while (contador > 0) {
  contador++;
}

Esse laço consegue chegar ao fim?

Escreva pelo menos 20 caracteres (0/20).

Prática: tornar a saída possível

Corrija o progresso

Complete a atualização que permite ao laço terminar.

cpp
int contador = 0;

while (contador < 3) {
  digitalWrite(LED_BUILTIN, HIGH);
  contador;
}

digitalWrite(LED_BUILTIN, LOW);

Passo 6 de 8

A faixa do contador também importa

Analise os limites de um contador sem sinal e escolha uma faixa que permita ao laço alcançar sua condição de término.

Quando o contador retorna

A fronteira faz parte da análise

uint8_t representa apenas valores de 0 a 255. Ao incrementar um contador que já vale 255, o valor armazenado volta para 0. No sentido contrário, ao decrementar 0, ele volta para 255.

Isso importa para o término: não basta olhar os valores usados no corpo. Confira também a atualização que ocorre depois da última iteração pretendida. Ela precisa produzir um valor representável que torne a condição falsa.

O retorno à faixa pode impedir a saída

Comparação entre um contador de 8 bits que volta de 255 para 0 e um contador mais largo que chega a 256 e pode encerrar o laço.

Para terminar, a atualização final precisa alcançar um valor que faça a condição falhar.

Limites que parecem corretos

Compare a condição com todos os valores que o tipo consegue armazenar.

Nos dois casos defeituosos, a condição é verdadeira para toda a faixa de uint8_t.
Início e atualizaçãoCondiçãoTransição na fronteiraResultado
0; contador++contador <= 255255 → 0Nunca fica falsa
255; contador--contador >= 00 → 255Nunca fica falsa

Analisar antes de executar

Atenção

Um progresso que retorna ao começo

Considere este laço, mas não o grave nem o execute na placa. O contador avança na direção esperada, porém não consegue sair da faixa de uint8_t.

Com números matemáticos, seria natural prever que depois de 255 viria 256 e que contador <= 255 ficaria falso. No tipo usado de verdade, a atualização armazena 0. Como 0 também satisfaz a condição, o corpo recomeça.

Enquanto o laço permanece ativo, as instruções seguintes da função não são alcançadas.

Laço que não encontra o teste falso

Exemplo para analisar; não execute este código na placa.

cpp
uint8_t contador = 0;

while (contador <= 255) {
  // corpo do laço
  contador++;
}

// Este ponto nunca é alcançado.

Atenção

Cuidado com tipos com sinal

Não aplique a mesma conclusão a tipos com sinal. Exceder a faixa de um inteiro com sinal não é uma estratégia válida de controle: o comportamento não é definido pela linguagem. Em vez de depender de um retorno, escolha tipo, limite e atualização para que todos os valores necessários sejam representáveis.

Escolher uma faixa compatível

Correção: deixar espaço para a saída

Se o corpo deve usar todos os valores de 0 a 255, inclusive 255, o contador também precisa guardar o próximo valor: 256. Um tipo mais largo permite a atualização final e o teste falso, sem perder nenhuma iteração planejada.

A sequência é: corpo com 254, atualização para 255; corpo com 255, atualização para 256; teste 256 <= 255, que é falso. Portanto, o corpo executa 256 vezes.

Contagem que alcança o fim

Este for preserva os valores de 0 a 255 no corpo e termina após a atualização para 256.

cpp
for (uint16_t contador = 0; contador <= 255; contador++) {
  // corpo executado com contador de 0 a 255
}

// Aqui, contador já não existe: era local ao for.

Prática de conferência

Complete uma contagem que termina

Complete o cabeçalho para executar o corpo com todos os valores de 0 a 255 e terminar em seguida.

cpp
for ( contador = 0; contador  255; contador++) {
  // executa para 0, 1, ..., 255
}

Passo 7 de 8

Aplicar o laço a uma sequência de piscadas

Aplique um for seguro para gerar uma sequência observável e finita de piscadas no LED integrado do Uno R3.

Previsão da sequência

Preveja antes de gravar

Cada iteração do for será uma piscada completa: acender o LED, esperar, apagar e esperar novamente. Antes do laço, uma pausa de 1 segundo separa a sequência dos flashes que podem ocorrer durante a gravação ou a reinicialização.

No exemplo, o contador assume os valores 0, 1 e 2 no corpo do laço. Portanto, haverá 3 piscadas. Ao final de cada iteração, o LED já foi comandado para LOW; assim, ele termina apagado.

Uma iteração corresponde a uma piscada

Diagrama temporal com uma pausa inicial, três pulsos de LED aceso separados por períodos apagados e estado apagado ao final.

Os três pulsos representam as três execuções do corpo do laço; entre eles, o LED volta ao estado apagado.

Grave e observe com segurança

Execute uma sequência finita

No seu computador, abra a IDE Arduino, crie um sketch e copie o código abaixo. Use somente o Arduino Uno R3 ligado por USB: não conecte fontes, fios ou cargas externas.

Compile e grave. Após a gravação, espere a pausa inicial e conte as piscadas do LED integrado. Durante cada delay, e durante toda a sequência, o fluxo fica bloqueado: nenhuma instrução seguinte pode avançar até a espera terminar.

Três piscadas com o LED integrado

Sketch completo para gravar localmente no Uno R3.

cpp
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  delay(1000);  // pausa para separar a observação da gravação

  for (int piscada = 0; piscada < 3; piscada++) {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(300);
    digitalWrite(LED_BUILTIN, LOW);
    delay(300);
  }
}

void loop() {
  // Não há novas ações após a sequência de setup.
}
Saída esperada
Após cerca de 1 segundo, o LED integrado produz exatamente três piscadas e permanece apagado.
A sequência só ocorre novamente após reset ou nova inicialização.

O resultado é visual no LED integrado, não aparece como texto na IDE. A sequência só acontece novamente após reset ou nova inicialização.

Atenção

Atenção à observação

Não conte possíveis flashes durante a gravação nem imediatamente após ela. A sequência que interessa começa depois da pausa inicial de 1 segundo. Como o for está em setup(), ela acontece uma vez a cada inicialização ou reset — não se reinicia pelas chamadas repetidas de loop().

Confira a contagem

Complete o laço contado

Complete o cabeçalho para que o corpo seja executado com piscada valendo 0, 1 e 2. Isso deve produzir três piscadas completas.

Cabeçalho do for

Preencha as três partes que definem a contagem.

cpp
for (int piscada = ; piscada  ; piscada++) {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(300);
  digitalWrite(LED_BUILTIN, LOW);
  delay(300);
}

Confirme o efeito e o reset

Relate sua conferência

Com o Uno ainda conectado somente por USB, pressione o botão de reset da placa uma vez. A pausa inicial e as três piscadas devem ocorrer novamente. Relate a previsão e o que você observou; esta resposta serve para sua própria conferência da prática.

Escreva pelo menos 80 caracteres (0/80).

Passo 8 de 8

Revisão final: prever, completar e conferir

Revisão integrada de equivalência entre for e while, contagem de piscadas e término seguro do contador.

Prever antes de alterar

Checklist antes de executar

Nesta revisão, transforme uma sequência contada de piscadas em um while equivalente. Antes de executar qualquer laço, confira: início, condição, atualização, faixa do contador e efeito de cada iteração.

Da contagem ao LED

Cada valor de vez que chega ao corpo produz uma piscada completa: acende, espera, apaga e espera. Os valores usados são 0, 1 e 2; depois, vez passa a 3 e o teste falha.

Rastreamento da sequência

Diagrama mostrando o contador passar por 0, 1 e 2, cada valor causando um ciclo de LED aceso e apagado, e o valor 3 levando ao término.

Três valores entram no corpo; o valor 3 é usado apenas no teste final.

Completar mantendo a equivalência

Referência: três piscadas com for

O for inicializa vez uma vez, testa antes de cada piscada e a incrementa depois do corpo. O while equivalente precisa preservar exatamente essa ordem.

cpp
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

  for (uint8_t vez = 0; vez < 3; vez++) {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(300);
    digitalWrite(LED_BUILTIN, LOW);
    delay(300);
  }
}

void loop() {
}

Aplicação: complete o while

Complete o while equivalente ao for mostrado. Ele deve produzir três piscadas e terminar com o LED apagado.

cpp
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

   vez = ;
  while (vez  3) {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(300);
    digitalWrite(LED_BUILTIN, LOW);
    delay(300);
    vez;
  }
}

void loop() {
}

Conferir e encerrar

Conferência final

Qual análise está correta para o while completado?

Resumo

Síntese de verificação

  • Antes de executar, identifique valor inicial, condição, atualização e a faixa do tipo do contador.
  • Conte os valores que realmente chegam ao corpo; eles determinam a quantidade de ações.
  • O valor após a última atualização também importa: ele deve ser representável e tornar a condição falsa.
  • Em cada iteração deste exemplo, o LED acende e apaga; por isso, três iterações resultam em três piscadas e LED final apagado.
  • Um for e um while são equivalentes quando preservam a mesma inicialização, teste, corpo e atualização.

Tutorial concluído

Parabéns! Você concluiu: Repetições com while e for

Muito bem! Use o checklist de início, condição, atualização, faixa e efeito sempre que criar ou revisar um laço.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso