|
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; |
|
|
|
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); |
|
|
|
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:
-
Cada ciclo (for) deve utilizar a sua própria variável de
controlo.
-
O ciclo interior deve começar e acabar completamente dentro do ciclo
exterior.
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