Aula 8: Bifurcações I (if ... then ... else)



 
Até já, todas as instruções do programa foram sempre executadas. Além disso, foram executadas exactamente na ordem como escrito. A primeira linha do código foi executada ao primeiro, depois a segunda linha, etc. Isto não é sempre assim. Com branching (branch é tronco em inglês; parte de um árvore) podemos controlar a execução do programa. 
Imagine pretende execrever um programa para calcular o raiz de um número. Tomar o raiz de um número negativo não faz sentido. Por isso, queria gerar um erro se o utilizador deu um valor negativo. Queria que aparece o texto

  Negative numbers are not allowed!

no ecrã. Obviamente, não quer que estetexto vai aparecer sempre, mas sim só quando o utilizador dá um número negativo. Se o utilizador dá um número positivo quer o raiz deste número no ecrã:

  O raiz de 5 is 2.23607

Queria haver uma maneira de verificar se um número é negativo e dependente de este verificação executar partes diferentes do programa. Exactamente isto é possível com branching. Vamos ver as isntruções "if-then", "if-then-else" e "case-of".


if ... then ...

A maneira mais simples de haver controlo sobre a execução das instruções é com o statement if .. then. O síntaxe completo é
 
 if condition then instruction;

Para condition podemos pôr a nossa condição e para instruction substituimos a instrução (ou instruções) a ser executa se (e só se) a condição é verdade.
Nota que condition é uma expressão que retornerá um valor do tipo boolean (veja aula 4). Isto pode ser uma variável. Por exemplo se b for declarado como boolean, a seguinta linha de código é correcta:
  if b then instruction;
No outro lado, mais vulgar são condições com expressões que comparam coisas, por exemplo
  if (x = y) then instruction;
  if (x < y) then instruction;
 

 comparison 
 meaning 
(a = b)
a equal to b
(a <> b)
a not equal to b
(a < b)
a smaller than b
(a > b)
a larger than b
(a <= b)
 a smaller or equal to b
(a >= b)
a larger or equal to b
Lembra que se nós queremos executar mais do que uma instrução podemos juntar-os com a combinação begin ... end. Assim, para a estrutura if ... then, as instruções aparecem como uma só instrução:
  if (a = b) then
    begin
      instruction1;
      instruction2;
    end;
Neste caso, ambas as instruções instruction1 e instruction2 serão executadas se a é igual a b.

A execução normal do programa continua depois o bloco de instruções. No exemplo a seguir, instruction3 e instruction4 serão executadas, apesar da condição (a = b).
 
  if (a = b) then
    begin
      instruction1; 
      instruction2;
    end;
  instruction3;
  instruction4;
a ser executado:
(a=b)
(a<>b)
 instruction1 
instruction2
instruction3
instruction4
 instruction3 
instruction4

Nota que aqui acaba a semelhança com os troncos de um árvore. Num árvore, os troncos nunca se juntaram; uma vez dividido nunca mais será possível juntar com o tronco prinicpal.


if ... then ... else ...

Se nós também queremos executar coisas quando a condição é falsa podemos fazer isto com a estrutura if ... then ... else. A forma geral desta estrutura é
 
 if condition then 
   instructionA
 else
   instructionB;

Nota a peculiaridade de PASCAL: a instrução a antes else não é finailzda pela ponto-e-vírgula ;

exemplo:
 
if (a=b) then
  begin
    instruction1; 
    instruction2;
  end
else
  begin
    instruction3;
    instruction4;
  end;
instruction5;
instruction6;
a ser executado:
 (a=b) 
 (a<>b) 
 instruction1 
instruction2
instruction5
instruction6
 instruction3 
instruction4
instruction5
instruction6

Aqui vem um exemplo completo que calcula o raiz de um núemro dado pelo utilizador:

PROGRAM SquareRoot;

Var x: real;
       root: real;

begin
  writeln('De um numero');
  readln(x);
  if (x<0) then
    writeln('Numeros negativos nao sao permitidos!')
  else
    begin
      root := Sqrt(x);
      writeln('O raiz de ', x:0:4, ' e ', root:0:4);
    end;
  writeln('Bom dia');
end.

Running the program; two examples:
 
 De um numero
 3.68
 O raiz de 3.6800 e 1.9183 
 Bom dia
 De um numero
 -3.68
 Numeros negativos nao sao permitidos! 
 Bom dia

Aula 8: ... de raizes e troncos 

Mini teste:

Para testar o seu conhecimento, sobre o que aprendeu nesta aula, clique aqui para um teste on-line.

Peter Stallinga. Universidade do Algarve, 16 Maio 2002