Programação Imperativa

Aula 9

Sumário


Instruções de iteração: ciclo while

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)
     ...

Um aparte...

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.

Aviso importante!

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.