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 for

O 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 encadeados


Os 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