Username: Password:

.Ciclos

As instruções de ciclo servem para repetir uma sequência de instruções. Por exemplo, para imprimir a tabuada dos 7 no ecrã, podemos usar o ciclo seguinte:

int i = 1;
while (i < 11) {
  printf("7 x %d = %d\n", i, i * 7);
  i = i + 1;
}
Trata-se de um ciclo «while» ou «enquanto». Três elementos elementos fundamentais estão presentes em qualquer instrução de ciclo :
  1. Uma variavel de ciclo : aqui é a variável i. Deve ser inicialisada antes do início do ciclo (é o papel da linha 1).
  2. Uma condição (na linha 2, é uma expressão booleana) que pode ser uma condição de paragem ou uma condição de continuação. No caso do ciclo while, trata-se de uma condição de continuação. A expressão booleana envolve sempre a variável de ciclo.
  3. Uma instrução de progresso i.e. que altere o valor da variável de ciclo. Neste exemplo é a linha xx.

A síntaxe da instrução while é :

<instrução-while> ::= "while" <expressão> <instrução>

O funcionamento é o seguinte :

  1. a <expressão> é avaliada,
  2. se o seu valor for diferente de 0 (valor verdadeiro) então a <instrução> é executada.
  3. a <expressão> é novamente avaliada etc...
  4. Quando o valor da <expressão> for falso então o ciclo termina.
Se a primeira vez que a <expressão> é avaliada o seu valor é falso, a <instrução> nunca é executada.

A instrução de progresso pode alterar o valor da variável de ciclo de forma arbitrária. No exemplo seguinte o valor da variável de ciclo é incrementado de 2 em 2 para imprimir os números pares menores que 10:

int i = 0;
while (i < 10) {
   printf("%d\n", i);
   i = i + 2;
}

A particularidade do ciclo while é que pode eventualmente não executar a instrução do ciclo. Existe uma outra instrução de ciclo que executa sempre, pelo menos uma vez, a instrução do ciclo : a instrução do .. while cuja síntaxe é :

<instrução-do-while> ::= "do" <instrução> "while" <expressão>
O seu funcionamento é o seguinte :
  1. a <instrução> é executada uma primeira vez,
  2. a <expressão> é avaliada. Se o seu valor for verdadeiro a instrução é novamente executada.
  3. Quando o valor da <expressão> for falso, o ciclo termina.
A <instrução> é portanto sempre executada pelo menos uma vez. Este tipo de ciclo é usado nas situações onde queremos que a instrução seja executada pelo menos uma vez. Por exemplo quando o programa interaje com o utilisador :
 do 
    fazer uma pergunta ao utilisador
    ler a resposta
 while reposta != resposta esperada

A terceira instrução de ciclo é a instrução for cuja síntaxe é :

<ciclo-for> ::= "for" "(" <instrução> ";" <expressão> ";" <instrução> ")" <instrução>
Por exemplo, o ciclo que escreve a tabuada dos 7 pode ser re-escrito usando um ciclo for :
int i;
for (i = 1; i < 10; i = i + 1) {
   printf("7 x %d = %d\n", i, i * 7);
}
O funcionamento é o seguinte :
  1. a primeira <instrução> (i = 1) serve para inicialisar a variável de ciclo,
  2. a <expressão> é avaliada. Se o seu valor for verdadeiro então a <instrução> do ciclo (no exemplo : a linha xx) é executada,
  3. A segunda <instrução> (aqui i = i + 1) é executada. Esta instrução é a instrução de progresso, deve alterar o valor da variável do ciclo.
  4. A <expressão> é novamente avaliada e se for verdadeira uma nova iteração é efectuada até chegar a uma altura onde o valor da expressão é falso e o ciclo termina.