Aula 10 – Loop for

Repetição com número de iterações conhecido — sintaxe, variações e usos clássicos

Por que precisamos de loops? — Um exemplo concreto

Antes de ver a sintaxe do for, vamos entender o que um loop faz de verdade olhando para um problema simples: calcular a média de 5 notas.

Problema: Dado o vetor de notas {7, 5, 6, 8, 9}, calcule a soma de todos os valores e depois divida pelo número de notas para obter a média.

Fórmula geral aplicada a cada iteração:

soma = soma + nota[i]

A cada volta do loop, pegamos o valor acumulado em soma, somamos com o próximo elemento do vetor e guardamos o resultado de volta em soma. É como ir somando valores numa calculadora, um de cada vez.

Execução passo a passo

Veja como a variável soma evolui a cada iteração do loop:

Iteração (loop) i nota[i] soma (antes) Operação soma (depois)
Início — — — soma = 0 (inicialização) 0
Loop 1 0 7 0 soma = 0 + 7 7
Loop 2 1 5 7 soma = 7 + 5 12
Loop 3 2 6 12 soma = 12 + 6 18
Loop 4 3 8 18 soma = 18 + 8 26
Loop 5 4 9 26 soma = 26 + 9 35
Após o loop — — 35 media = 35 / 5 7.0
Repare que a variável soma começa em zero — obrigatoriamente — antes do loop. Se começasse com qualquer outro valor, o resultado final estaria errado. Após as 5 iterações, saímos do loop com soma = 35 e calculamos media = 35 / 5 = 7.0 com uma única instrução fora do loop. Dividir dentro do loop seria um erro clássico de lógica.

O código correspondente

#include <stdio.h>

int main() {
    float notas[] = {7, 5, 6, 8, 9};   // vetor com as 5 notas
    int   n = 5;                         // número de elementos
    float soma  = 0;                     // inicialização obrigatória!
    float media;

    for (int i = 0; i < n; i++) {
        soma = soma + notas[i];          // acumula: soma = soma + nota[i]
    }
                                         // saiu do loop — soma = 35
    media = soma / n;                    // divide UMA VEZ, fora do loop

    printf("Soma:  %.0f\n", soma);
    printf("Média: %.1f\n", media);
    return 0;
}
Soma: 35
Média: 7.0
Resumo do padrão "acumulador": inicialize a variável antes do loop (soma = 0), acumule dentro do loop (soma = soma + x), use o resultado depois do loop. Este é um dos padrões mais recorrentes em programação e reaparecerá em algoritmos de busca, ordenação e estatística.

O que são Estruturas de Repetição?

Estruturas de repetição — também chamadas de loops — permitem executar um bloco de código múltiplas vezes sem precisar escrevê-lo repetidamente. São fundamentais para processar coleções de dados, automatizar cálculos iterativos e controlar fluxos que dependem de condições.

Os três loops do C:

Sintaxe do Loop for

O for é a estrutura de repetição mais compacta do C — ela concentra em uma única linha os três elementos necessários para controlar o loop: inicialização, condição e incremento.

for (inicialização; condição; incremento) {
    // bloco executado enquanto a condição for verdadeira
}

Ordem de execução:
  1. Inicialização — executada uma única vez, antes do loop começar
  2. Condição — avaliada antes de cada iteração; se falsa, o loop termina
  3. Bloco — executado se a condição for verdadeira
  4. Incremento — executado após cada iteração, depois volta para o passo 2
#include <stdio.h>

int main() {
    int i;

    // Imprime números de 1 a 5
    for (i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n");

    return 0;
}

1 2 3 4 5

Passo a passo da execução:

Iteração Inicialização Condição (i <= 5) Bloco Incremento
—i = 11 <= 5 → verdadeiroimprime 1i → 2
2ª—2 <= 5 → verdadeiroimprime 2i → 3
3ª—3 <= 5 → verdadeiroimprime 3i → 4
4ª—4 <= 5 → verdadeiroimprime 4i → 5
5ª—5 <= 5 → verdadeiroimprime 5i → 6
——6 <= 5 → falso—loop termina

Variações do Loop for

Contagem regressiva (decremento)

#include <stdio.h>

int main() {
    int i;
    for (i = 10; i >= 1; i--) {   // decrementa em vez de incrementar
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

10 9 8 7 6 5 4 3 2 1

Incremento diferente de 1

#include <stdio.h>

int main() {
    int i;

    // Apenas números pares de 0 a 20
    for (i = 0; i <= 20; i += 2) {
        printf("%d ", i);
    }
    printf("\n");

    // Potências de 2
    for (i = 1; i <= 1024; i *= 2) {
        printf("%d ", i);
    }
    printf("\n");

    return 0;
}

0 2 4 6 8 10 12 14 16 18 20

1 2 4 8 16 32 64 128 256 512 1024

Declaração da variável dentro do for (C99)

A partir do padrão C99, é possível declarar a variável de controle diretamente na inicialização do for, limitando seu escopo ao próprio loop:

#include <stdio.h>

int main() {
    for (int i = 1; i <= 5; i++) {   // 'i' só existe dentro deste for
        printf("%d ", i);
    }
    printf("\n");
    // printf("%d", i);  ← erro! 'i' não existe aqui fora
    return 0;
}
DICA: Declarar a variável de controle dentro do for (for (int i = ...)) é a prática moderna preferida — ela deixa claro que i é exclusiva daquele loop e evita uso acidental fora dele. O Code::Blocks com MinGW suporta isso com C99 ativado.

Loop for com múltiplas variáveis

A inicialização e o incremento aceitam múltiplas expressões separadas por vírgula:

#include <stdio.h>

int main() {
    int i, j;
    for (i = 0, j = 10; i < j; i++, j--) {
        printf("i=%d  j=%d\n", i, j);
    }
    return 0;
}

i=0 j=10

i=1 j=9

i=2 j=8

i=3 j=7

i=4 j=6

Loops for Aninhados

Um for pode estar dentro de outro for. Para cada iteração do loop externo, o loop interno é executado completamente. Isso é essencial para trabalhar com matrizes, tabelas e combinações.

#include <stdio.h>

int main() {
    int i, j;

    // Tabuada de multiplicação (3x5)
    for (i = 1; i <= 3; i++) {
        for (j = 1; j <= 5; j++) {
            printf("%3d", i * j);   // %3d: 3 caracteres de largura
        }
        printf("\n");   // quebra de linha após cada linha da tabuada
    }

    return 0;
}

  1  2  3  4  5

  2  4  6  8 10

  3  6  9 12 15

Atenção ao custo de loops aninhados: O número total de iterações é o produto das contagens de cada loop. Dois loops aninhados de n iterações cada realizam n² operações no total. Loops triplos aninhados chegam a n³. Em cálculos científicos — como integrais numéricas sobre grades tridimensionais — esse crescimento é uma consideração importante de desempenho.

Padrão com asteriscos

#include <stdio.h>

int main() {
    int i, j;
    int linhas = 5;

    for (i = 1; i <= linhas; i++) {
        for (j = 1; j <= i; j++) {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

*

* *

* * *

* * * *

* * * * *

Usos Clássicos do for

Acumulação e soma

#include <stdio.h>

int main() {
    int soma = 0;
    int n = 10;

    for (int i = 1; i <= n; i++) {
        soma += i;   // acumula: soma = 1+2+3+...+n
    }

    printf("Soma de 1 a %d: %d\n", n, soma);   // 55

    // Fatorial
    long fat = 1;
    int k = 10;
    for (int i = 2; i <= k; i++) {
        fat *= i;
    }
    printf("%d! = %ld\n", k, fat);   // 10! = 3628800

    return 0;
}

Soma de 1 a 10: 55

10! = 3628800

Encontrar máximo e mínimo

#include <stdio.h>

int main() {
    int valores[] = {42, 7, 93, 15, 68, 31};
    int n = 6;
    int maximo = valores[0];
    int minimo = valores[0];

    for (int i = 1; i < n; i++) {
        if (valores[i] > maximo) maximo = valores[i];
        if (valores[i] < minimo) minimo = valores[i];
    }

    printf("Máximo: %d\n", maximo);   // 93
    printf("Mínimo: %d\n", minimo);   // 7
    return 0;
}

Máximo: 93

Mínimo: 7

Exemplo científico: somatório e convergência

#include <stdio.h>
#include <math.h>

int main() {
    // Aproximação de e usando a série: e = 1 + 1/1! + 1/2! + 1/3! + ...
    double e_aprox = 0.0;
    double fatorial = 1.0;
    int termos = 15;

    for (int n = 0; n < termos; n++) {
        if (n > 0) fatorial *= n;   // calcula n! incrementalmente
        e_aprox += 1.0 / fatorial;
        printf("n=%2d: e ≈ %.10f\n", n, e_aprox);
    }

    printf("\ne real:  2.7182818284\n");
    return 0;
}

n= 0: e ≈ 1.0000000000

n= 1: e ≈ 2.0000000000

n= 2: e ≈ 2.5000000000

n= 3: e ≈ 2.6666666667

n= 4: e ≈ 2.7083333333

n= 5: e ≈ 2.7166666667

...

n=14: e ≈ 2.7182818285

 

e real: 2.7182818284

Exemplo do Material de Referência

O trecho abaixo, extraído diretamente da seção 7 do livro de referência do curso, demonstra os três tipos de loop em sequência. Nesta aula estudamos o for; os demais serão aprofundados na Aula 11:

#include <stdio.h>

int main() {
    int i;

    // FOR loop: imprime números de 1 a 5
    printf("FOR loop:\n");
    for (i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    printf("\n");

    // WHILE loop: imprime números de 6 a 10
    printf("WHILE loop:\n");
    i = 6;
    while (i <= 10) {
        printf("%d ", i);
        i++;
    }
    printf("\n");

    // DO-WHILE loop: imprime números de 11 a 15
    printf("DO-WHILE loop:\n");
    i = 11;
    do {
        printf("%d ", i);
        i++;
    } while (i <= 15);
    printf("\n");

    return 0;
}

FOR loop:

1 2 3 4 5

WHILE loop:

6 7 8 9 10

DO-WHILE loop:

11 12 13 14 15

Loop Infinito com for

Todos os três campos do for são opcionais. Omiti-los todos cria um loop infinito — útil em sistemas embarcados e servidores, mas que exige sempre uma saída controlada com break:

#include <stdio.h>

int main() {
    int contador = 0;

    for (;;) {   // loop infinito — sem inicialização, condição ou incremento
        printf("Iteração %d\n", contador);
        contador++;

        if (contador >= 5) {
            break;   // sai do loop quando contador chega a 5
        }
    }

    printf("Loop encerrado.\n");
    return 0;
}

Iteração 0

Iteração 1

Iteração 2

Iteração 3

Iteração 4

Loop encerrado.

Cuidado com loops infinitos acidentais: Um erro comum é usar = em vez de <= na condição, ou esquecer o incremento. Se o programa travar durante o desenvolvimento, suspeite de um loop infinito — encerre com Ctrl+C no terminal ou pelo botão de parada do Code::Blocks.

Loop for em C versus Java

Aspecto C Java
Sintaxe básica for (int i=0; i<n; i++) for (int i=0; i<n; i++) (idêntica)
Declaração da variável no for Desde C99: for (int i = 0; ...) Sempre disponível: for (int i = 0; ...)
Escopo da variável declarada no for Limitado ao bloco do for (C99) Limitado ao bloco do for
For-each (enhanced for) Não existe em C padrão — usa-se índice for (int x : array) — disponível para arrays e coleções
Condição da iteração Qualquer inteiro — 0 é falso, não-zero é verdadeiro Deve ser boolean explícito
Loop infinito for (;;) for (;;) ou while (true)
Verificação de limites do array Nenhuma — acesso fora dos limites é comportamento indefinido Automática — lança ArrayIndexOutOfBoundsException
Múltiplas variáveis na inicialização for (i=0, j=10; ...) — suportado for (int i=0, j=10; ...) — suportado (mesmo tipo)

Equivalente de for-each em C

Como C não possui o loop for-each, a iteração sobre arrays é sempre feita com índice explícito:

C — com índice explícito Java — for-each
int nums[] = {10, 20, 30, 40};
int n = 4;

for (int i = 0; i < n; i++) {
    printf("%d\n", nums[i]);
}
int[] nums = {10, 20, 30, 40};

for (int x : nums) {
    System.out.println(x);
}

Exercícios — Aula 10

Teste seus conhecimentos sobre o loop for em C:

1. Qual é a ordem correta de execução dos elementos de um loop for?

2. Quantas vezes o bloco do loop abaixo é executado?

for (int i = 1; i <= 10; i += 3) {
    printf("%d\n", i);
}

3. Qual será a saída do código abaixo?

int soma = 0;
for (int i = 1; i <= 4; i++) {
    soma += i;
}
printf("%d\n", soma);

4. O que o loop for (;;) faz?

5. Em quantas iterações totais o trecho abaixo realiza operações dentro do bloco mais interno?

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        printf(".");
    }
}

6. Qual é a diferença entre declarar int i antes do for versus dentro dele (for (int i = ...)) em C99?

7. Por que o C não possui um loop for-each nativo como o Java?

8. Qual será a saída do código abaixo?

for (int i = 5; i >= 1; i--) {
    printf("%d ", i * i);
}