Subsecções


9 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). Nesta seção veremos a estrutura while, sendo que as demais estruturas de repetição em C++ , for e do ... while serão vistas nas Seções 13.2 e 19.


9.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 (veja Seção 1.1).

\includegraphics[scale=1.0]{while}

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

             #include <iostream>
             using namespace std;

             int contador;

             contador = 0;
             while( contador < 5 )
             {
                 cout << "contador = " << contador << endl;
                 contador = contador + 1;
             }

             cout << "ACABOU !!!!" << endl;

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 cout.

Se examinarmos cuidadosamente este exemplo, veremos que a variável contador é inicializada com 0 (zero). 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. 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 a repetição não continua. A execução do programa continua na sentença que segue o laço (no caso, imprimir a frase ACABOU !!!).

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

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 <iostream>
using namespace std;

int main( ){

  int total, num;
  
  total = 0;
  while( total < 20 ) {
    cout << "Total = " << total << endl;
    cout << "Entre com um numero: ";
    cin >> num;
    
    total = total + num;
  }
  
  cout << "Final total = " << total << endl;
}

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.

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

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

9.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 de repetição ( for, while e do ... while). Use o estilo com o qual você se sentir mais confortável.

9.2.2 Necessidade ou não das chaves

Foi mencionado anteriormente que o corpo da repetição pode ser uma sentença composta (conjunto de sentenças delimitadas por chaves ( { e }) ou ums sentença simples. Por exemplo:

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

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

   while( i < 5 ) {
      i = 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 = i + 1;
      j = j + 1;

é na verdade o mesmo que:

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

enquanto a intenção era na realidade:

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

9.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 !

9.2.4 Laços aninhados

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

Exemplo 2:

#include <iostream>
#include <iomanip>  // Necessário para se usar a função setw() em cout

using namespace std;

int main( ){
  
  int linha, coluna;
  
  linha = 1; 
  while (linha < 5)
  {
    coluna = 1; 
    while (coluna < 5)
    {
      cout << setw(3) << linha * coluna;
      coluna = coluna + 1;
    }
    linha = linha + 1;
  }
  cout << endl;
}

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 cout que produz a mudança de final de linha é 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 <iostream>
#include <iomanip>  // Necessário para se usar a função setw() em cout

using namespace std;

int main( ){
  
  int linha, coluna;
  
  linha = 1; 
  while (linha < 5)
  {
    coluna = 1; 
    while (coluna < 5)
    {
      cout << setw(3) << linha * coluna;
      cout << endl;
      coluna = contador + 1;
    }

    linha = linha + 1;
  }
}

Saída:

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

Exemplo 4:

Este exemplo imprime um triângulo de asteriscos, de forma que a quantidade de asteriscos em uma linha é igual à ordem da linha (na linha 1, 1 asterisco, na linha 2, 2 asteriscos, etc.)

#include <iostream>

using namespace std;

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

Saída:

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


Créditos: Documento produzido pelo Prof. Armando L.N. Delgado (DINF/ET/UFPR), baseado em revisão sobre material de Prof. Carmem Hara e Prof. Wagner Zola (DINF/ET/UFPR).

Esta obra está licenciada com uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional.  Licença Creative Commons

Armando Luiz Nicolini Delgado
2020-10-20