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).
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.
#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.
A regra principal é ser consistente. Assim, seu programa será mais legível.
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.
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; }
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 !
É possível colocar um laço dentro de outro (laço aninhado).
#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.
#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
#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:
* ** *** **** ***** ****** ******* ********