Muitas vezes queremos que o computador repita um conjunto de instruções por um determinado número de vezes. Existem instruções especiais para conseguir tal efeito, sendo designadas de instruções de iteração ou ciclos. Existem 3 tipos de ciclos em C: while, for e do while. Nesta aula vamos estudar apenas o ciclo while.
Exemplo: pretende-se fazer um programa para escrever no ecrã a palavra olá 100 vezes. Podemos fazer um programa com 100 printf's mas isso é uma chatice. Outra alternativa é dizer ao computador para repetir a instrução printf("Olá\n"); 100 vezes. O programa que se segue faz precisamente isso.
#include <stdio.h>
main()
{
int i;
i = 1;
while( i <= 100 )
{
printf("Olá\n");
i++;
}
}
A palavra-chave while significa em português
enquanto. No caso geral, a instrução tem o seguinte formato:
while( expressão )
instrução
O computador começa por testar a expressão do while. Se a expressão for verdadeira, o programa executa a instrução que vem a seguir à expressão (reparem que a instrução tanto pode ser simples como composta). Depois de executar a instrução, o computador volta a testar a expressão do while e continua assim indefinidamente até a expressão ser falsa. Nessa altura, o programa abandona o ciclo while e executa a instrução que aparece imediatamente a seguir ao final do ciclo.
No exemplo, a variável i serve para controlar a condição do ciclo while. Este tipo de situação é muito frequente em programação. Ao executar o programa, o computador vai fazer o seguinte:
i começa por valer 1
(1 <= 100) ? SIM
printf("Olá\n")
i passa a valer 2
(2 <= 100) ? SIM
printf("Olá\n")
i passa a valer 3
(3 <= 100) ? SIM
printf("Olá\n")
i passa a valer 4
...
(100 <= 100) ? SIM
printf("Olá\n")
i passa a valer 101
(101 <= 100) ? NÃO
acabou o ciclo while
Outro exemplo: pretende-se fazer um programa para escrever no ecrã os números de 1 a 100 (basta alterar o printf no programa acima).
#include <stdio.h>
main()
{
int i;
i = 1;
while( i <= 100 )
{
printf("%d\n", i);
i++;
}
}
Outro exemplo: pretende-se fazer um programa para escrever no ecrã os números de 1 a 100 e os respectivos quadrados. O resultado do programa dever ser:
1 1
2 4
3 9
4 16
5 25
...
100 10000
O programa é quase igual ao anterior, basta alterar o printf novamente.
#include <stdio.h>
main()
{
int i;
i = 1;
while( i <= 100 )
{
printf("%d %d\n", i, i*i);
i++;
}
}
Outro exemplo: pretende-se fazer um programa para calcula a soma dos N primeiros números naturais (1+2+3+...+N) em que N é um número introduzido pelo utilizador (NOTA: este programa poderia ser feito utilizando a fórmula da progressão aritmética, S = (1+N) * N/2, mas faz de conta que não sabíamos a fórmula).
#include <stdio.h>
main()
{
int i, s, n;
printf("Introduz N:\n");
scanf("%d", &n);
s = 0;
i = 1;
while( i <= n )
{
s = s + i;
i++;
}
printf("A soma é %d\n", s);
}
Estudem bem este exemplo porque é um clássico da programação. Pode parecer um bocado esquisito, mas sempre que necessitarem de somar um conjunto de parcelas, faz-se sempre assim:
s = s + (qualquer coisa)
No nosso exemplo, a variável i serve para varrer os números de 1 a N. A cada iteração do ciclo while, a variável s vai acumulando a soma. Ou seja, os valores que s vai assumir vão sendo sucessivamente:
0
1 (0+1)
3 (1+2 = 0+1+2)
6 (3+3 = 0+1+2+3)
10 (6+4 = 0+1+2+3+4)
...
Outro exemplo: pretende-se fazer um programa para calcular o factorial de N. O programa é praticamente idêntico ao anterior, basta mudar o sinal de '+' para '*', e inicializar a variável que vai ter o resultado com 1 em vez de 0.
#include <stdio.h>
main()
{
int i, factorial, n;
printf("Introduz N:\n");
scanf("%d", &n);
factorial = 1;
i = 1;
while( i <= n )
{
factorial = factorial * i;
i++;
}
printf("O factorial de %d é %d\n", n, factorial);
}
Os valores que a variável factorial vai assumir vão sendo sucessivamente:
1
1 (1*1)
2 (1*2 = 1*1*2)
6 (2*3 = 1*1*2*3)
24 (6*4 = 1*1*2*3*4)
...
Tal como na instrução if-else, a expressão que aparece a seguir à palavra while costuma ser uma expressão lógica, algo cujo valor é verdadeiro ou falso. No entanto, não é obrigatório que assim seja. Por exemplo, a seguinte instrução é válida em C.
while( 53 )
printf("...");
O que acontece é que o C interpreta o valor zero como sendo falso, e tudo o que for diferente de zero como sendo verdadeiro. Apesar do exemplo ser válido, não façam coisas deste estilo, pois isso é meio caminho andado para se fazer programas totalmente ilegíveis, sendo uma má prática de programação.
Antes de aprenderem os ciclos, não podiam fazer programas muito interessantes. Com a instrução while na mão já podes fazer programas mais sofisticados. De agora em diante, quase todos os programas que fizerem vão ter ciclos, e tal como aparecem if's dentro de if's, também podem aparecer while's dentro de while's, while's dentro de if's, if's dentro de while's, e por ái fora.
Estudem bem esta aula e as anteriores, elas são a base para tudo o que vem a seguir. A matéria que foi dada até aqui é o ABC da programação. Devem dominar esta matéria por completo porque senão vão perder o comboio durante as próximas semanas.