Programação Imperativa

Aula 7

Sumário




Instruções simples e instruções compostas

Em C as instruções podem ser simples ou compostas. Até agora apenas vimos instruções simples. Exemplos:

        x=7;
        printf(...);
        scanf(...);

Uma instrução composta é um conjunto de instruções delimitado por chavetas. Exemplo de uma instrução composta:

        {
          x=7;
          printf(...);
          scanf(...);
        }

Uma instrução composta também costuma ser designada por bloco. Além de conter instruções, os blocos também podem ter declarações de variáveis.

Fluxo de um programa, estruturas de controlo

Os programas que vimos até agora têm a seguinte estrutura:

        main()
        {
           declarações

           instrução1
           instrução2
           instrução3
           ...  
           instruçãoN
        }

O programa começa com a palavra main() e é seguido de um bloco. Esse bloco pode ter declarações (ex: variáveis) e depois aparece um conjunto de instruções que são executadas sequencialmente uma após outra. Contudo, há situações em que queremos que a execução das instruções não seja sequencial, existindo instruções especiais para consiguir tal efeito. Essas instruções chamam-se estruturas de controlo e alteram o fluxo sequencial do programa.

Nesta aula vamos aprender uma estrutura de controlo muito importante que permite que o computador tome decisões de modo a só executar instruções mediante a verificação de uma condição. Essa estrutura de controlo chama-se if-else.


Instrução de selecção: if-else

Exemplo 1: o programa seguinte pede ao utilizador para introduzir um número e depois responde dizendo se o número é par ou ímpar.

        #include <stdio.h>

        main()
        {
           int n;

           printf("Introduza um número inteiro: ");
           scanf( "%d", &n );
           if( n % 2 == 0 )
              printf("%d é par\n", n);
           else
              printf("%d é ímpar\n", n);
        }

Ao ser executado, o programa vai fazer o seguinte (o que aparece em bold é escrito pelo utilizador):

        Introduza um número inteiro:
        7
        7 é ímpar

Exemplo 2: o programa seguinte pede ao utilizador para introduzir um número não negativo. Se o utilizador não obedecer, o computador escreve a mensagem: "Número inválido" no ecrã. Em ambos os casos, o computador termina com uma mensagem de "Até logo".

        #include <stdio.h>

        main()
        {
           int n;

           printf("Introduza um número inteiro não negativo: ");
           scanf( "%d", &n );
           if( n < 0 )
              printf("Número inválido\n");
           printf("Até logo\n");
        }

Ao ser executado, o programa vai fazer o seguinte:

        Introduza um número inteiro não negativo:
        6
        Até logo

Se a pessoa introduzisse um número negativo iria aparecer:

        Introduza um número inteiro não negativo:
        -20
        Número inválido
    Até logo


Antes de aprenderem a instrução if-else não podiam fazer este tipo de programas porque o computador executava sempre todas as instruções desde o início do programa. Com a instrução if-else o computador executa só algumas instruções. Tudo vai depender do valor da condição do if.

Em inglês, a palavra if significa se e a palavra else significa senão. Saber inglês ajuda bastante. O bocado:

           if( n % 2 == 0 )
              printf("%d é par\n", n);
           else
              printf("%d é ímpar\n", n);

significa:

           se( n a dividir por 2 der resto 0 )
              Escreve( n é par );
           senão
              Escreve( n é ímpar )

O caso geral da instrução if-else é:

        if( expressão ) 
           instrução1
        else
           instrução2

em que a parte do else é opcional. O if-else funciona do seguinte modo. O valor da expressão é calculado. Se for verdadeiro (em C, tudo o que é diferente de zero é verdadeiro), a instrução1 será executada mas a instrução2 não. Se a condição for falsa (o valor da expressão é zero), a instrução2 será executada mas a instrução1 não.

Reparem que uma instrução tanto pode ser simples como composta. Por outras palavras, se quiserem executar mais do que uma instrução simple, terão de agrupá-las dentro das chavetas e criar uma instrução composta. Exemplo:

        if( expressão )
     {
            instrução1
            instrução2
            instrução3
            instrução4
         }
        else
     {
            instrução5
            instrução6
         }
    instrução7
    instrução8

No exemplo acima, se a expressão for verdadeira o computador irá executar as instruções 1, 2, 3, 4, 7, 8. Se a condição for falsa o computador irá executar as instruções 5, 6, 7, 8.

As instruções podem ser instruções quaisquer. Por exemplo, podem ser printf, scanf, instruções de atribuição, e até podem ser outras instruções if-else.

As expressões costumam ser expressões lógicas (condições) cujo valor é verdadeiro ou falso. Essas expressões podem usar os seguintes operadores relacionais:

Símbolo Significado
<
menor
>
maior
<=
menor ou igual
>=
maior ou igual
==
igual
!=
diferente

Mais um exemplo: o seguinte programa é uma modificação do programa que calcula a área de um círculo. Neste caso, se o utilizador introduzir um número negativo para o raio, o computador deve escrever que não consegue calcular a área. Caso contrário, calcula a área e escreve o resultado no ecrã.

        #include <stdio.h>

        #define PI 3.14159 

        main()
        {
           float area, raio;

           printf("Introduza o raio: ");
           scanf("%f", &raio);
           if( raio < 0 )
              printf("Não posso calcular a área\n");
           else
            {
               area = PI * raio * raio;
               printf("A área é %f\n", area );
            }
        }

Reparem que há muitas maneiras de se fazer o mesmo programa. O programa também poderia ter sido escrito assim:

        #include <stdio.h>

        #define PI 3.14159 

        main()
        {
           float area, raio;

           printf("Introduza o raio: ");
           scanf("%f", &raio);
           if( raio >= 0 )
            {
               area = PI * raio * raio;
               printf("A área é %f\n", area );
            }
       else 
              printf("Não posso calcular a área\n");
        }

e também poderia ter sido escrito assim:

        #include <stdio.h>

        #define PI 3.14159 

        main()
        {
           float area, raio;

           printf("Introduza o raio: ");
           scanf("%f", &raio);
           if( raio >= 0 )
            {
               area = PI * raio * raio;
               printf("A área é %f\n", area );
            }
       if( raio < 0 )
              printf("Não posso calcular a área\n");
        }