Decisões, Decisões

O que iremos cobrir?
  • O 3º fundamento da programação - Branching
  • Branches únicos e múltiplos
  • Usando expressões boolean

O 3º fundamento na construção de blocos de código é o branching. O branching é o termo que descreve a abilidade que os programas podem ter em executar uma sequência por entre varias outras possibilidades, dependo de uma certa condição.

Nos tempos idos do Assembler JUMP (salta) é a única forma de branching, onde o programa (dependendo de uma condição)literalmente para uma determinada morada na memória do computador, isto normalmente acontecia acontecia quando o resultado da instrução era de 0. Programas extraordinariamente complexos eram criados usando apenas este comando - acho que isto acaba de deitar por terra o pré-requisitos mínimos para um programa de Dijkstras. Mas com a chegada de linguagens de alto nível, uma nova versão do JUMP apareceu o GOTO. Ainda hoje O BASIC usa este comando, GOTO, e podes experimentar com ele usando este código:

10 PRINT "Começando na linha 10"
20 J = 5
30 IF J < 10 GOTO 50
40 Print "Esta linha não é mostrada"
50 STOP

Repara que mesmo sendo um programa tão pequeno como este que acabamos de fazer, ainda levas uns segundos a perceber o que esta realmente a acontecer. Agora imagina o que se passaria quando estamos a falar de programas com milhares de linhas de código, isto torna a tarefa de compreender o programa, impossível. Por essa razão a maioria das linguagens modernas de programação ou não tem o JUMP e o GOTO ou então desencorajam o seu uso.

O statement if

Os statements mais óbvios e mais intuitivos que podemos encontrar são o if, then, else (se, então, senão numa tradução directa). Estes statements seguem a lógica da língua Inglesa. IF (se) determinada condição de um Boolean é verdadeiro THEN (então) este bloco de código é executado ELSE (senão) um outro bloco de código é executado. Fácil não!

No BASIC seria assim:

PRINT "Começa aqui"
J = 5
IF J > 10 THEN
    PRINT "Isto nunca é mostrado"
ELSE
    STOP
END IF

Penso eu que este exemplo é muito mais fácil de interpretar que o anterior exemplo do GOTO. o if permite-nos testar qualquer coisa, desde que o resultado possa ser avaliado em verdadeiro ou falso. como um valor Boolean.

O Python é muito semelhante:

import sys  # somente para nos deixar sair
print "Começa aqui"
j = 5
if j > 10:
    print "Isto nunca é mostrado"
else:
    sys.exit()

É quase idêntico, não é?

Podes criar uma cadeia de if/then/else statements ao agrupa-los (nesting) um dentro do outro. como neste exemplo que se segue:

# Assumindo que já criaste uma variável largura, contendo um valor...
if largura == 100:
   area = 0 
else:
   if largura == 200:
      comprimento = comprimento * 2
   else:
      if largura == 500:
           largura = largura/10
      else:
           print "largura de valor insperado!"

Nota: Repara que usei o == para testar a igualdade em cada if statement, enquanto usei o = para atribuir variáveis. Usar o = em vez do == é um dos erros mais comuns que pode ocorrer enquanto usamos o Python, felizmente o Python avisamos que existe um erro de sintaxe, mas por vezes terás que procurar com muita atenção até que o encontres o problema..

Expressões boolean

És capaz de te lembrar que na secção da "Matérias-primas" mencionei uma tipo de dados, o Boolean. Também foi dito que que este tipo de dado só podia ter 2 valores, ou verdadeiro ou falso. Raramente se cria uma variável contendo Boolean, mas em compensação criamos com muita frequência valores temporários de Boolean através de expressões. Uma expressão é uma combinação de variaveis e valores usando operadores e como resultado obtemos um valor, vê o exemplo:

if x < 5:
  print x

x < 5 é a expressão. Expressões podem ser muito complexas. Mas no caso de branch elas são até relativamente simples porque só podem avaliar um valor ou verdadeiro ou falso. Contudo a definição destes 2 valores podem variar de linguagem para linguagem, em algumas linguagens o 0 é mesmo que falso.

Branches no Tcl

No Tcl o if statement também é muito semelhante ao encontrado nas duas outras linguagens:

if {$x < 5} {
   puts $x
}elseif {$x == 5} {
   puts "its 5!"
}else{
   puts "maior que 5"
   }

Penso que isto é de muito fácil interpretação. é claro que elseif e o else são opcionais, mas suponho que já tinhas chegado a essa conclusão.

Os Case statements

Uma sequência de if/else/if/else ... agrupados é uma construção tão comum que muitas linguagens um tipo especial de branch para essas situações. O case ou Switch statement, e no Tcl é mais ou menos assim:

switch $largura {
    100 { set area 0} 
    200 { set comprimento [expr {comprimento * 2}] }
    500 { set largura [expr {$largura / 2}] }
    }

Nem o BASIC ou o Python têm esta construção exemplificada acima, mas em compensação apresentam um que penso ter uma leitura ainda mais fácil o if/elsif/else:

if largura < 100:
   area = 0
elif largura < 200:
   comprimento = comprimento * 2
elif largura < 500:
   largura = largura/10
else:
   print "largura demasiado grande!"

Repara na indentação do elif, que não muda (muito importante no Python). Acho que também devo mencionar que as duas versões do Python deste programa são válidas, apenas acho a segunda mais fácil de interpretar.

O BASIC por sua vez tem o Elseif ...THEN, que funciona exactamente da mesma forma que o elif do Python.

Pontos a lembrar
  • o Branch é formado pelo if/else
  • o else é opcional
  • Quando se trata de decisões com múltiplas soluções podemos usar o CASE ou if/elif

Anterior  Próxima  Índice


Em caso que tenhas alguma dúvida ou queiras comentar esta página envia-me um e-mail para: babyboy@oninet.pt