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.