Subsecções


14 Estruturas de Repetição

A linguagem C possui comandos para repetir uma sequência de instruções. Estas estruturas de repetição, também conhecidas como laços (do inglês loops). A principal construção que veremos é o while2


14.1 O comando de repetição while

O comando de repetição while tem duas partes: a expressão de teste e o corpo da repetição. O formato do while é:

while (expressão teste)

corpo da repetição

A expressão teste é inicialmente avaliada para verificar se o laço deve terminar. Caso a expressão seja verdadeira (isto é, diferente de 0 (zero)), o corpo da repetição é executado. Depois desta execução, o processo é repetido a partir da expressão teste. O corpo do laço, por sua vez, pode ser uma sentença simples ou composta.

\includegraphics[scale=1.0]{while}

O exemplo abaixo mostra o uso do comando de repetição while:

             int contador = 0;

             while( contador < 5 )
             {
               printf( "contador = %d\n", contador);
               contador += 1;
             }

             printf("ACABOU !!!!\n");

Saída:

             contador = 0
             contador = 1
             contador = 2
             contador = 3
             contador = 4
             ACABOU !!!!

Neste exemplo, a expressão de teste é contador < 5, e o corpo do laço é a sentença printf().

Se examinarmos cuidadosamente este exemplo, veremos que a variável contador é inicializada com 0 (zero) quando é definida. Depois disso, a expressão de teste é verificada e, como 0 < 5 é verdadeiro, o corpo da repetição é executado. Assim, o programa imprime contador = 0, e incrementa contador de um (através do pós-decremento indicado no argumento de printf()). Em seguida, a expressão de teste é verificada novamente e todo o processo se repete até que contador seja 4 e contador = 4 seja impresso.

Depois disso, contador é incrementado para 5 e o teste é executado. Mas desta vez, 5 < 5 é falso, então o laço não continua. A execução do programa continua na sentença que segue o laço (no caso, imprimir a frase ACABOU !!!).

Após a execução do while, a variável contador tem valor 5.

No exemplo acima, há uma sentença simples no corpo da repetição. Quando este for definido por uma sentença composta (bloco), não se deve esquecer de usar as chaves ({ e }) para delimitar o bloco da sentença composta.

O exemplo seguinte mostra um uso mais apropriado do comando while: Em situações onde o número de repetições não é conhecido antes do inicío do comando while:

Exemplo 1:

Este programa pede números ao usuário até que a soma de todos os números digitados for pelo menos 20.

#include <stdio.h>

main( ){

  int total = 0, num;
  
  while( total < 20 ) {
    printf( "Total = %d\n", total );
    
    printf( "Entre com um numero: " );
    scanf( "%d", &num );
    
    total += num;
  }
  
  printf( "Final total = %d\n", total );
}

Exemplo de saída:

   Total = 0
   Entre com um numero: 3
   Total = 3
   Entre com um numero: 8
   Total = 11
   Entre com um numero: 15
   Final total = 26

Inicialmente, é dado o valor 0 à variável total, e o teste é verdadeiro (0 < 20). Em cada iteração, o total é impresso e o usuário digita um número que é somado a total. Quanto total for maior ou igual a 20, o teste do while torna-se falso, e a repetição termina.

14.2 Estilo de formatação para estruturas de repetição

A regra principal é ser consistente. Assim, seu programa será mais legível.

14.2.1 Colocação das chaves

Há três estilos comuns de colocar as chaves:

   while (expressao)
      {
      sentenca;
      }

   while (expressao)
   {
      sentenca;
   }

   while (expressao) {
      sentenca;
   }

APENAS UM DESTES ESTILOS deve ser consistentemente usado para as sentenças for, while e do ... while. Use o estilo com o qual você se sentir mais confortável.

14.2.2 Necessidade ou não das chaves

Foi mencionado anteriormente que as chaves ({ e }) podem ser omitidas quando o corpo da repetição contiver apenar uma sentença. Por exemplo:

   while( i < 5 )
      i += 1;

Embora as chaves possam ser omitidas, há uma única razão para colocá-las sempre:

   while( i < 5 ) {
      i += 1;
   }

Quando você adicionar algo ao programa, você poderá adicionar uma sentença para um laço com apenas uma sentença. Se você fizer isso, é vital que você também adicione chaves. Se você não fizer isso, a segunda sentença do laço não será considerada como parte do laço. Por exemplo:

   while( i < 5 )
      i += 1;
      j += 1;

é na verdade o mesmo que:

   while( i < 5 )
      i += 1;
   j += 1;

enquanto a intenção era na realidade:

   while( i < 5 ) {
      i += 1;
      j += 1;
   }

14.2.3 Uso de espaço em branco

A outra questão de formato é se deve ser colocado um espaço em branco depois do while e antes do abre parênteses ((). Por exemplo:

 while (i<5)

ou

     while (i<5)

ou

     while( i < 5 )

Isto também é uma escolha pessoal. Porém seja consistente em sua escolha !

14.2.4 Laços aninhados

É possível colocar um laço dentro de outro (laço aninhado).

Exemplo 2:

#include <stdio.h>

int main( ){
  
  int linha, coluna;
  
  linha = 1; 
  while (linha < 5)
  {
    coluna = 1; 
    while (coluna < 5)
    {
      printf( "%3d", linha * coluna );
      coluna += 1;
    }
    linha += 1;
  }
  printf( "\n" );
}

Saída:

      1  2  3  4
      2  4  6  8
      3  6  9 12
      4  8 12 16

No exemplo acima, para cada iteração do laço externo, o laço interno imprime uma linha com números e depois pula de linha.

Exemplo 3:

Este exemplo é parecido com o anterior, exceto que o printf() é colocado dentro do laço interno. Como era de se esperar uma nova linha é impressa após cada valor ao invés de ser depois de 4 valores.

#include <stdio.h>

int main( ){
  
  int linha, coluna;
  
  linha = 1; 
  while (linha < 5)
  {
    coluna = 1; 
    while (coluna < 5)
    {
      printf( "%3d", linha * coluna );
      printf( "\n" );
      coluna += 1;
    }

    linha += 1;
  }
}

Saída:

            1
            2
            3
            4
            2
            4
            6
            8
            3
            6
            9
           12
            4
            8
           12
           16

Exemplo 4:

#include <stdio.h>

int main( ){
  
  int linha, coluna;
  
  printf("\n");
  linha = 1;
  while (linha < 8)
  {
    printf( "\t" );
    coluna = 1;
    while (coluna < linha)
    {
      printf( "*" );
      coluna += 1;
    }
    printf( "\n" );
    linha += 1;
  }
}

Saída:

                *
                **
                ***
                ****
                *****
                ******
                *******
                ********



Notas de rodapé

...while2
Existem outras estruturas de repetição: for (seção 15.1) e do ... while (seção 15.3).
Armando Luiz Nicolini Delgado
2013-10-21