|  | 
Aula 9: Ciclos I: for |  | 
Traduzido por Ana Paula Costa
Os ciclos servem para repetir parte do código um certo número
de vezes. Em C existem três tipos de ciclos,
Não existe diferença entre os dois primeiros tipos de ciclos,
apenas uma questão de legibilidade do programa. O ciclo do ... while
difere dos outros dois pelo facto de a condição de saída
do ciclo ser verificada no final, enquanto nos outros dois (for e while)
é verificada no início do ciclo.
A aula de hoje é sobre o ciclo for.
|  | 
Ciclo forO ciclo mais comum em C é o ciclo for. Este ciclo, em princípio,
é utilizado para executar coisas um número pré-definido
de vezes de uma forma contável. Isto contrasta com os ciclos
que são executados enquanto uma determinada condição
é verdeira, que iremos aprender na próxima aula. |  | 
 A estrutura geral do ciclo for é
 
| for (inícioI;
testeC;
passoI) instrução;
 | 
com inícioI e passoI
a serem instruções gerais e testeC
a ser uma condição Booleana. As instruções
instrução
e passoI serão repetidas até
que a condição de teste resulte em "falso".
 
|  A instrução
é repetida um número de vezes, determinado pelas instruções
de controlo
inícioI e passoI
e a condição de teste testeC.
As instruções de controlo inícioI
e passoI podem ser qualquer instrução
ou combinação de instruções (separadas por
vírgulas). A instrução inícioI
é executada apenas no início do ciclo e é executada
uma única vez. Imediatamente depois disso, a condição
testeC 
é avaliada. Se o seu resultado é "falso" (0), o ciclo termina
de imediato. Assim, é possível com o ciclo for que a instrução
não seja executada nem sequer uma vez (ao contrário do ciclo
do
.. while como veremos na próxima aula). Se o resultado
da condição é "verdadeiro" (!=0), as instruções
instrução
e passoI são executadas.
 | 
Uma vez que o ciclo for está desenhado para fazer coisas de uma
forma contável, é aconselhável utilizar variáveis
de controlo do tipo inteiro, como é demonstrado no próximo
exemplo. É preciso não esquecer de declarar a variável
(ver aula 5).
 
| 
| código do programa 
 main()
 // for-loop example
 {
 int i;
   for (i=1; i<5; i++) 
printf("Ola\n");
 }
 | output 
 Ola
 Ola
 Ola
 Ola
 |  Este programa faz o seguinte 
1) atribui 1 a i
 2) verifica se i é menor do que 5
 3) se não é: SAI DO CICLO (EXIT LOOP) imediatemente.
Caso contrário
 4) executa printf("Ola\n");
 5) adiciona 1 a i
 6) vai para o passo 2)
 |  | 
Instruções Múltiplas
Tal como na estrutura if ... else ... , também podemos
agrupar várias instruções com {..}
nos ciclos:
 
| código do programa for (i = 1; i<5; i++)
 {
 printf("Ola\n");
 printf("It is a nice day\n");
 }
 
 
 | output 
 Ola
 It is a nice day
 Ola
 It is a nice day
 Ola
 It is a nice day
 Ola
 It is a nice day
 
 
 | 
Comparar com
 
| código do programa for (i = 1; i<5; i++)
 printf("Ola\n");
 printf("It is a nice day\n");
 
 
 | output 
 Ola
 Ola
 Ola
 Ola
 It is a nice day
 
 
 | 
Utilização da variável do ciclo
Dentro do ciclo, a variável que controla o ciclo pode ser utilizada,
mas não é nada aconselhável
fazê-lo.
 
| Bom código: 
 
 
| código do programa for (i=1; i<5; i++)
printf("%d Ola\n", i);
 | output   1 Ola 
2 Ola
 3 Ola
 4 Ola
 |  
 | Mau código: 
 
 
| código do programa for (i=1; i<5; i++)
{
 printf("%d Ola\n", i);
 i = i + 1;
 }
 | output   1 Ola
3 Ola
 
 |  
 | 
O programa da direita é um exemplo de mau código. Este estilo
de programação, apesar de às vezes poupar espaço
e talvez tempo de execução, torna o programa mal estruturado
e muito difícil de compreender por outros! Se se pretender algo
como o que está representado no programa da direita, o melhor é
utilizar outros tipos de ciclos, como while ou do-while,
ou , melhor ainda, utilizar algo parecido com o programa de baixo.
 
| código do programa 
 
 for (i=1; i<5; i++)
 printf("%d Ola", 2*i-1);
 | output 
 1 Ola
 3 Ola
 | 
|  | 
Ciclos encadeadosOs ciclos for (bem como os outros ciclos ) podem ser encadeados,
o que significa que podem ser colocados uns dentro dos outros. Podemos
criar ciclos duplos, ou ciclos triplos (como o da figura de baixo à
esquerda) ou de qualquer outro nível. Eis alguns exemplos:
 | 
 
|   |   | 
| 
| código
do programa --------------------------------------
 main()
 // three nested loops
 {
 int i, j, k;
  for (i=1; i<=2; i++)
for (j=1; j<=2;
j++)
 for
(k=1; k<=2; k++)
 printf("i=%d j=%d k=%d\n", i, j, k);
 }
 
 | output -------------
 i=1 j=1 k=1
 i=1 j=1 k=2
 i=1 j=2 k=1
 i=1 j=2 k=2
 i=2 j=1 k=1
 i=2 j=1 k=2
 i=2 j=2 k=1
 i=2 j=2 k=2
 |  | 
| código do programa
------------------------------------------ main()
 // three nested loops
 {
 int i, j, k;
  for (i=1; i<=2; i++)
for (j=1; j<=2;
j++)
 {
 for (k=1; k<=2; k++)
 printf("i=%d j=%d k=%d\n", i, j, k);
 for (k=1; k<=2; k++)
 printf("i=%d j=%d k=%d\n", i, j, k);
 }
 }
   | output -------------
 i=1 j=1 k=1
 i=1 j=1 k=2
 i=1 j=1 k=1
 i=1 j=1 k=2
 i=1 j=2 k=1
 i=1 j=2 k=2
 i=1 j=2 k=1
 i=1 j=2 k=2
 i=2 j=1 k=1
 i=2 j=1 k=2
 i=2 j=1 k=1
 i=2 j=1 k=2
 i=2 j=2 k=1
 i=2 j=2 k=2
 i=2 j=2 k=1
 i=2 j=2 k=2
 |  | 
Um exemplo. Fibonacci.
| Os números de Fibonacci são números que seguem
as seguintes regras: F1 =1
 F2 = 1
 Fn = Fn-1 + Fn-2
 |  | 
O programa a seguir implementa os números de Fibonacci. É
pedido ao utilizador para dar o número de números de Fibonacci
a calcular (n), e depois, num ciclo for, o próximo número
de Fibonacci é calculado, até se calcularem os n números
de Fibonacci.
main()
/* program to calculate the first n Fibonacci
numbers
   using the algorithm
   F(1) = 1, F(2) = 1 and F(i)
= F(i-1) + F(i-2) */
{
  int i, n, fi, fi1, fi2;
  // first ask the user for the number
of Fibonacci numbers to calculate
  printf("How many Fibonacci numbers
do you want to see?\n");
  scanf("%d", &n);
  fi1 = 1;              
// variables to store F(i-1) and F(i-2)
  fi2 = 1;              
// initialize them to their starting value
  printf("1 1 ");       
// print the first 2 Fibonacci numbers
  for (i=3; i<=n; i++)  
// print the rest
    {
      fi = fi1 +
fi2;    // calculate the next number
      fi2 = fi1;        
// calculate the new F(i-1) and F(i-2)
      fi1 = fi;
      printf("%d
", fi); // print the result
    }
}
Mais tarde iremos aprender uma forma muito mais elegante de efectuar
estes cálculos, utilizando programação recursiva.
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, 30 October
2002