Estruturas de repetição

Estruturas de Repetição

Você irá aprender

  • O que são estruturas de repetição.

  • Porque utilizar elas.

  • Como utilizar os diferentes tipos de estruturas de repetição.

  • Como utilizar as instruções de controle de fluxo.

Pré-requisitos

Tratando problemas repetitivos

Nesta aula trabalharemos com estruturas de repetição ou loops, que, assim como o nome sugere, permite que seja possível realizar um grupo de instruções de maneira repetida.

Por exemplo, vamos supor que queremos imprimir a frase "Hello world!" dez vezes. Se não fossemos usar estruturas de repetição, o nosso código seria assim:

#include<stdio.h>

int main(void) {
    printf("Hello world!\n");
    printf("Hello world!\n");
    printf("Hello world!\n");
    printf("Hello world!\n");
    printf("Hello world!\n");
    printf("Hello world!\n");
    printf("Hello world!\n");
    printf("Hello world!\n");
    printf("Hello world!\n");
    printf("Hello world!\n");
    
    return 0;
}

E claro que só olhando esse código você percebe que isso é excesivo de mais, e que provavelmente deve ter uma solução melhor do que isso. Pois bem, com estruturas repetitivas, podemos transformar esse bloco de instruções repetitivas, em isso:

#include<stdio.h>

int main(void) {
    for(int i = 0;i < 10; i++) {
        printf("Hello World!\n");
    }
    return 0;
}

Execute ambos os códigos, e perceba que chegamos no mesmo resultado, porém de forma mais simples e elegante.

Existem várias maneiras de fazer uma estrutura de repetição, cada uma com seus próprios casos de uso específicos. Aqui estão algumas das maneiras mais comuns de fazer um loop em C:

For

A estrutura "for" é uma maneira popular criar um loop de repetição, geralmente usada para iterar por um número específico de vezes. A sintaxe básica de um loop "for" em C é a seguinte:


for (inicialização; condição; atualização) {
    // código para ser executado
}

Como pode ser ver, essa é uma sintaxe um pouco diferente daquela que estamos acostumados, com três partes diferentes separadas por ponto e vírgula, mas veremos um exemplo mais concreto, talvez isso irá ajudar a deixar as coisas mais claras.

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

Aqui temos um exemplo de um loop "for" usado para imprimir os valores de 0 até 9, acredito que só com esse exemplo tenha ficado mais claro, mas acho importante explicar cada elemento dentro do for.

Inicialização

Nesta parte você irá fazer a declaração ou atribuição de variáveis, aqui é importante notar que geralmente inicializamos variáveis que serão usadas para iterar pelo for.

for (int i = 0; i < 10; i++) {
         ^
   inicialização

Obs.: Aqui podemos tanto fazer declaração como atribuição:

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

Obs2.: Podemos iniciar mais de uma variável na inicialização (desde que todas tenham o mesmo tipo), separando cada variável com uma vírgula:


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

Condição de parada

Assim como as estruturas condicionais, loops também utiliza uma condição, chamada "Condição de Parada". Em outras palavras só entraremos no loop de repetição e iremos continuar no mesmo, se tal condição for verdadeira. Lembrando obviamente que a nossa condição pode ser também uma expressão (ou seja várias condições aninhadas uma com as outras).

for (int i = 0; i < 10; i++) {
                  ^
             condição de
               parada

Nesta área, nós geralmente criamos uma condição com a variável que iniciamos na parte de inicialização, no nosso caso o "i" sendo igual a zero, e nós iremos continuar a fazer o loop enquanto "i" for menor que dez (sendo essa a nossa condição).

Obs.: De todas as seções do for, esta é a única que é obrigatória, as outras duas seções podem ser deixadas em branco e o "for" ainda funcionaria.

int i = 0;
for( ; i < 10; ) {
  print("%d\n",i);
  i++;
}

Expressão de atualização

Por fim, temos a seção de atualização, pois é nela onde atualizamos as variáveis responsáveis em controlar o fluxo da estrutura. De forma geral, nessa seção incrementamos/decrementamos a variável iniciada na primeira seção.

Chamamos essa seção de expressão, pois na realidade, podemos fazer uma sequência infinita de atribuições, lembrando obviamente de que precisamos implementar a lógica para que eventualmente faça o código sair do loop, caso contrário, o código irá ficar em um loop infinito.

for (int i = 0; i < 10; i++) {
                         ^
                    incremento

Obs.: a seção de incremento não é acionada quando entramos no laço "for", quando entramos na seção de loop, as instruções de inicialização de condição são acionadas, mas a de incremento é apenas acionadas depois da primeira iteração.

Obs2.: Podemos fazer atribuições ou incrementos em mais de uma variável dentro dessa seção, desde que os mesmos sejam separados por vírgula, observe o exemplo abaixo:

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

While

O loop while executa repetidamente um bloco de código enquanto uma condição especificada for verdadeira. A sintaxe básica de um loop while é a seguinte.

while (condição) {
    // código a ser executado
}

Aqui, a estrutura funciona de forma bem parecida com o loop for, com a diferença que este apenas possui espaço para colocar a condição, excluindo o espaço para atribuição e incremento/decremento.

Eis um exemplo:

int i = 0;
while (i < 10) {
    printf("%d\n", i);
    i++;
}

Do while

O loop "do-while" é semelhante ao loop "while", mas a condição é verificada após a execução do bloco de código. Isso significa que o bloco de código sempre será executado pelo menos uma vez. A sintaxe básica de um loop "do-while" é a seguinte:

do {
    // código a ser executado
} while (condição);

Eis um exemplo:

int i = 0;
do {
    printf("%d\n", i);
    i++;
} while (i < 10);

Controladores de fluxo

Além dessas construções básicas de loop, a linguagem C, assim como outras linguagens, também fornece várias outras construções usadas para loop, como as instruções break e continue. Essas construções podem ser usadas para alterar o fluxo de controle em um loop, permitindo estruturas de loop mais complexas e poderosas, porém também podem deixar o código mais confuso/dificíl de ser analisado.

Finalizaremos a aula olhando brevemente como elas funcionam.

Break

O break funciona para interromper por completo o fluxo do laço de repetição, forçando o mesmo a sair.

for (int i = 0; i < 10; i++) {
    if (i == 5)
      break;
      
    printf("%d\n", i);
}

Neste caso, estamos forçando o laço de repetição sair quando "i" for igual a 5, logo terminando o "for" antecipadamente.

Continue

Diferente do break, que interrompe o funcionamento do loop, a instrução "continue" permite que o laço de repetição seja pulado, como no exemplo abaixo, onde a iteração do 5 é pulada por conta do continue.

for (int i = 0; i < 10; i++) {
    if (i == 5)
      continue;
      
    printf("%d\n", i);
}

Depois teste o código, e perceba que agora, o número 5 não é imprimido.

Last updated