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.
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:
#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.
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 for, while e do ... while. Use o estilo com o qual você se sentir mais confortável.
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; }
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 <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.
#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
#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:
* ** *** **** ***** ****** ******* ********