Aula 7: Selecção/Ramificação I (if ... , if ... else ...)

Traduzido por Ana Paula Costa

 
Até agora, todas as instruções que se colocaram num programa foram executadas. Mais ainda, elas foram executadas exactamente na ordem em que foram colocadas. A primeira linha do programa foi executada primeiro, depois a segunda, depois a terceira, e por aí fora. Nem sempre é assim. Com a ramificação (um ramo faz parte de uma árvore) podemos controlar o fluxo de um programa. 
Vamos imaginar um programa que recebe um número e calcula o raíz quadrada desse número. Calcular a raíz quadrada de um número negativo não faz sentido (a não ser que se esteja a trabalhar com número complexos, claro), e então queremos que o programa gere um erro e páre quando o utilizador introduzir um número negativo. Deverá surgir no écran uma mensagem como:

  Negative numbers are not allowed!

Obviamente, nem sempre queremos que esta mensagem surja no écran; no caso do utilizador introduzir um número positivo, queremos que seja calculada a sua raíz quadrada e que o resultado apareça no écran:

  The square-root of 5 is 2.23607

É preciso ter uma forma de verificar o número e dependendo do resultado, executar partes do programa.


if ...

A maneira mais simples de ter o controlo sobre as instruções que serão executadas é utilizando a instrução if ... A sintaxe completa da instrução é
 
 if condição 
   instrução; 

Em condição iremos colocar a nossa condição e em instrução colocamos a(s) nossa(s) instrução(ões) que serão executadas se e só se a condição for verdadeira.
A condição é uma expressão que irá resultar num valor do tipo booleano (ver aula 4). Pode ser uma variável, por exemplo, sendo b declarado como int, o seguinte está correcto:
  if b instrução;
Por outro lado, são mais comuns condições com expressões que comparam variáveis, tais como:
  if (x == y) instrução;
  if (x < y) instrução;
 

 comparação 
 significado 
(a == b)
a igual a b
(a != b)
a diferente de b
(a < b)
a menor que b
(a > b)
a maior que b
(a <= b)
 a menor ou igual a b
(a >= b)
a maior ou igual a b
Não esquecer que se se pretender executar mais do que uma instrução, elas devem ser agrupadas entre { ... } , de maneira a serem interpretadas pela instrução if como uma só.
  if (a == b)
    {
      instrução1;
      instrução2;
    }
Neste caso, a instrução1 e a instrução2 serão executadas quando a for igual a b.

A execução normal do programa irá prosseguir após o bloco de instruções. No exemplo seguinte, a instrução3 e a instrução4 serão executadas independentemente da condição (a = b).
 
  if (a == b) 
    {
      instrução1; 
      instrução2;
    }
  instrução3;
  instrução4;
Ao ser executado:
(a igual a b)
(a diferente de b)
 instrução1 
instrução2
instrução3
instrução4
 instrução3 
instrução4

De notar que a analogia com a ramificação das árvores termina aqui. Numa árvore, os ramos nunca se voltam a encontrar novamente; uma vez num ramo, não é possível voltar ao tronco principal.


if ... else ...

Se também se quiser que o programa faça coisas no caso da condição não ser verdadeira deve-se utilizar a instrução if ... else. A forma geral desta instrução é
 
 if condição 
   instruçãoA;
 else
   instruçãoB;

exemplo:
 
if (a==b)
  {
    instrução1; 
    instrução2;
  }
else
  {
    instrução3;
    instrução4;
  }
instrução5;
instrução6;
Ao ser executado:
 (a igual a b) 
 (a diferente de b) 
 instrução1 
instrução2
instrução5
instrução6
  instrução3 
instrução4
instrução5
instrução6

Aqui está o programa completo que demonstra o uso da estrutura de selecção para calcular a raíz quadrada de um número:

#include <stdio.h>

#include <math.h>

main()
{
   double x;
   double root;

  printf("Give a number");
  scanf("%f", &x);
  if (x<0)
    printf("Negative numbers are not allowed!\n");
  else
    {
      root = sqrt(x);
      printf("The square-root of %0.4f is %0.4f\n", x, root);
    }
  printf("Have a nice day\n");
}

Correndo o programa; dois exemplos:
 
 Give a number
 3.68
 The square-root of 3.6800 is 1.9183 
 Have a nice day
 Give a number
 -3.68
 Negative numbers are not allowed! 
 Have a nice day

Aula 8: ... de raízes e ramos 


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, 10 October 2002