Aula 10: Ciclos II: while ... e do ... while

Traduzido por Ana Paula Costa

while ...

Os ciclos que iremos aprender nesta aula, while e do-while, são utilizados para repetir instruções um número indeterminado de vezes. Normalmente, estes ciclos são utilizados nas situações em que não se sabe exactamente quando o ciclo irá terminar, por exemplo porque a variável de controlo muda dentro do ciclo (o que é desaconselhável no ciclo for). Também quando se pretende fazer um ciclo utilizando uma variável do tipo float para controlo temos que utilizar os ciclos while e/ou do-while.
Como iremos ver, a diferença entre o ciclo while e o ciclo do-while está no momento em que a condição é testada.

O formato geral do ciclo while é

 while (condição
   instrução;
 
while flow
A instrução é repedita enquanto a condição é verdadeira. A condição é qualquer condição que resulte num valor booleano (Verdeiro ou Falso), como foi discutido na aula 8. Pode ser uma comparação, ou qualquer outra coisa (ainda existe informação no ficheiro?, o utilizador premiu uma tecla?, etc.).
De notar que no ciclo while não é atribuído nenhum valor de início a nenhuma variável, ao contrário do que acontece no ciclo for. Assim sendo, temos que ser nós a fazê-lo.
Exemplo:
 
código do programa

main()
// while example
{
  float x;

  x = 0.0;
  while (x<=1.0)
    {
      printf("%0.1f\n", x);
      x = x + 0.1;
    }
}


  output

  0.0 
  0.1
  0.2
  0.3
  0.4
  0.5
  0.6
  0.7
  0.8
  0.9
  1.0



do ... while

O ciclo do-while é muito semelhante ao ciclo while. A única diferença é que agora a condição é verificada depois das instruções terem sido repetidas. O formato geral é
 
 do
  instrução;
 while (condição); 
 
do-while flow
Uma diferença muito importante entre o while e o do-while é que no while a condição é verificada no início do ciclo, enquanto no do-while é verificada no fim. Assim, as instruções no do-while são executadas pelo menos uma vez.
Vejam-se os programas seguintes (também incluem um exemplo do ciclo for). Apenas o código do ciclo do-while produz output.
código do programa

x = 100;
do
  {
    printf("Ajax\n");
    x = x + 1;
  }
while (x<=10);
código do programa

x = 100;
while (x<=10)
  {
    printf("Ajax\n");
    x = x + 1;
  }
código do programa

for (i=100; i<=10; i++)
  printf("Ajax\n");
output

Ajax
output

output


for, while e do-while comparados

Efectivamente, os ciclos for e while são exactamente o mesmo. Both have a condition that is checked in the beginning of the loop and a step instruction. Ambos têm a condição que é verificada no início do ciclo e têm uma instrução de passo. A única diferença é que o ciclo for também inclui uma instrução de começo. Se precedemos o ciclo while com uma instrução de começo, os dois ciclos serão iguais.
 
for

for (inícioI; testeC; passoI) 
  instrução;
while

inícioI;
while (testeC)
  {
    instrução;
    passoI;
  }

for (i=1; i<=10; i++)
  printf("%d", i);
 
 
 



i=1;
while (i<=10)
  {
    printf("%d", i);
    i++;
  }

Apenas por uma questão de legibilidade do programa se utiliza o ciclo for para se repetir instruções um número contável de vezes. Em todas as outras situações utiliza-se o while e do-while. No ciclo do-while as instruções são executadas pelo menos uma vez. Deve-se ter estas considerações sempre em conta quando se vai decidir qual o tipo de ciclo a utilizar.


Encadeamento II

Agora que já conhecemos todos os tipos de ciclos, vamos ver as regras de bom comportamento relacionadas com o encadeamento: Exemplos de mau código:


for (i=1; i<=10; i++)
  {
    for (i=1; i<=20; i++) 
      printf("%d", i);
  }

for  (i=1; i<=10; i++)
  {
    x = i;
    do
      x = x+0.1;
  }
while (x<20);
Dois ciclos com a mesma variável de controlo i. Dois ciclos mal aninhados.
Uma boa indentação do programa 
evita sempre este tipo de erros.


Teste Rápido:
Para testar os conhecimentos sobre o que aprendeu nesta aula, prima aqui para fazer um teste on-line. De notar que este Não é o formato que será utilizado no teste final!

Peter Stallinga. Universidade do Algarve, 4  November 2002