|
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