APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Angelo Martins – Dep. Eng. Informática - ISEP
Estruturas de Decisão
Aula 2
1
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Conteúdo
• Estruturas de decisão - conceito e aplicação• Estrutura If ... Then
− Apresentação das diversas variantes desta estrutura. Expressões lógicas complexas.
• Estruturas de decisão encadeadas− Combinação de várias estruturas de forma a tomar
decisões mais complexas.
2
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Conceito
• As linguagens de programação têm instruções que permitem tomar decisões com base numa condição (expressão lógica). Em VB existe o IF ... Then− Sintaxe (geral)
If <expressão lógica> then <bloco de instruções 1>[Else <bloco de instruções 2>]End If
− Explicação▪ Se a expressão lógica for verdadeira será executado o
bloco de instruções 1, caso contrário executa-se o 2.
O código entre parêntesis rectos é opcional, ou seja, não tem necessariamente que existir.
3
Condição Verdadeira?
Instrução
Bloco de Instruções
Instrução
SIM
NÃO
Condição Verdadeira?
Instrução
Bloco de Instruções 1
Instrução
SIM
Bloco de Instruções 2
NÃO
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Estruturas de Decisão
IF...THEN ...ELSE
IF...THEN
4
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Exemplo de aplicação
• Pretende-se um programa que resolva equações do 2º grau.− Raízes: 3 TextBox para introdução dos
coeficientes da equação.
3 Label para indicar qual a função de cada uma das TextBox
2 Label para apresentar os resultados (as duas raízes).
5
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Nomes dos objectos
txtB
lblTitulo
Label3
A form do programa já tem o aspecto final, mas falta ainda atribuir nomes aos objectos.
Label2
cmdCalc
frmEqGrau2
Label4txtA
txtC
lblR1 lblR2
Label5
Label6
6
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Regras para nomes
• Utiliza-se a notação húngara:<prefixo><nome>− o prefixo identifica o tipo de objecto.
− o nome está relacionado com a função do objecto no programa e deve permitir a sua fácil identificação.
lstAlunoslstListBox
frmEqGrau2frmForm
cmdCalc, cmdSaircmdCommandButton
lblNumAlunos, lblAlblLabel
txtA, txtR1, txtNumAlunostxtTextBox
ExemplosPrefixoTipo
7
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
O código
Option Explicit
Private Sub cmdCalc_Click()
Dim a As Single, b As Single, c As Single Dim delta As Single a = val(txtA.Text) b = val(txtB.Text) c = val(txtC.Text) delta = Sqr(b ^ 2 - 4 * a * c) lblR1.Caption = (-b + delta) / (2 * a) lblR2.Caption = (-b - delta) / (2 * a)
End Sub
O código do programa é o seguinte:
Leitura dos valores contidos nas três caixas de texto. Não é verificado se os valores são válidos.
Declaração das variáveis
A variável delta permite economizar alguns cálculos, não sendo necessário repetir o cálculo da raiz quadrada para a segunda raiz.
Para o interpretador do VB - obriga a declarar variáveis
Sqr() é uma função do VB que fornece a raiz quadrada de um número positivo
8
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Testar
Uma vez terminado o programa, vamos efectuar testes. Para tal, introduzem-se valores conhecidos:
1, 2, 1 (raiz dupla –1).
9
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Testar II
Vamos testar com outros valores: 1, 0, 1 (raízes complexas +i e -i).
Ocorreu um erro e o programa foi interrompido: a função Sqr() não aceita argumentos negativos!
10
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Solução
Option ExplicitPrivate Sub cmdCalc_Click() Dim a As Single, b As Single, c As Single Dim delta As Single lblR1.Caption = "" lblR2.Caption = "" a = txtA.Text b = txtB.Text c = txtC.Text delta = b ^ 2 - 4 * a * c
If delta >= 0 Then lblR1.Caption = (-b + Sqr(delta)) / (2 * a) lblR2.Caption = (-b - Sqr(delta)) / (2 * a) Else MsgBox "Raízes complexas!" End IfEnd Sub
A função Sqr() não pode receber argumentos negativos.
delta representa agora o interior da raiz
Mensagem a indicar que as raízes são complexas.
Limpa o conteúdo inicial das Label com as raízes, de forma a que os resultados anteriores não apareçam.
Se delta for maior ou igual a zero então é possível calcular a raiz quadrada. Existem raízes reais para a equação.
11
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Testando novamente
De novo com os valores: 1, 0, 1 (raízes complexas +i e -i).
O programa já não dá erro, informando antes o utilizador da natureza complexa das raízes!
O programa pode ainda dar erro devido a certos valores introduzidos pelo utilizador. Tente descobrir e eliminar essa possibilidade (pista: atenção às divisões!). Tente também apresentar as raízes complexas da equação.
Sugestão:
12
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Decisões complexas
• Exemplo de Problema:− Pretende-se elaborar um programa que determine
qual o maior de três números dados pelo utilizador.
• Solução− Há duas abordagens possíveis para este problema:
▪ utilizar três estruturas de decisão independentes− Cada estrutura avalia uma expressão que, por si só, permite
definir o resultado.▪ utilizar duas estruturas de decisão encadeadas
− As estruturas estão dependentes dos resultados das estruturas anteriores. A expressão avaliada numa dada estrutura não define completamente o resultado final.
13
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Decisões independentes• Cada If ... then determina se um número é o maior
dos três:Private Sub cmdCalc_Click() Dim a As Integer, b As Integer, c As Integer Dim max As Integer lblMax.Caption = "" a = txtA.Text b = txtB.Text c = txtC.Text If a > b And a > c Then max = a End If If b > a And b > c Then max = b End If If c > a And c > b Then max = c End If lblMax.Caption = maxEnd Sub
Se b for maior do que a e do que c, então é certamente o maior número.
Apresenta-se o maior numa Label.
Repare-se que max, a variável que vai conter o maior dos números, é do mesmo tipo que as variáveis que contêm os valores lidos.
Condição múltipla - verdadeira só se as 2 sub-condições forem simultaneamente verdadeiras (AND)
14
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Teste do programa
E o resultado está correcto!
Ou talvez não!...
Esquecemos-nos que poderia haver números iguais!
lblMax
15
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Decisões independentes II
• Cada If ... then determina se um número é o maior dos três:
Private Sub cmdCalc_Click() Dim a As Integer, b As Integer, c As Integer Dim max As Integer lblMax.Caption = "" a = txtA.Text b = txtB.Text c = txtC.Text If a >= b And a >= c Then max = a End If If b >= a And b >= c Then max = b End If If c >= a And c >= b Then max = c End If lblMax.Caption = maxEnd Sub
Se a for maior ou igual a b e maior ou igual a c, então é certamente o maior número.
16
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Decisões encadeadasCada If...then avalia só parte da condição completa:
Private Sub cmdCalc_Click() Dim a As Integer, b As Integer, c As Integer Dim max As Integer lblMax.Caption = "" a = txtA.Text b = txtB.Text c = txtC.Text If a >= b And a >= c Then max = a Else If b >= c Then max = b Else max = c End If End If lblMax.Caption = maxEnd Sub
Mas a segunda só se verifica se b for maior do que c. Claro que a não é o maior, senão a primeira condição seria verdadeira.
Se nenhum dos anteriores era o maior, então é c.
A primeira condição é verificada caso a seja o maior dos três...
Temo
s dua
s estr
utura
s de d
ecisã
o enc
adea
das,
a se
gund
a den
tro da
“com
pone
nte fa
lsa” d
a prim
eira.
17
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Decisões encadeadas II
• Também podia ser usada a estrutura If...ElseIf:Private Sub cmdCalc_Click() Dim a As Integer, b As Integer, c As Integer Dim max As Integer lblMax.Caption = "" a = txtA.Text b = txtB.Text c = txtC.Text If a >= b And a >= c Then max = a ElseIf b >= c Then max = b Else max = c End If lblMax.Caption = maxEnd Sub
Em vez de construir uma cascata de IFs, esta estrutura permite aumentar a legibilidade do programa quando as decisões são mutuamente exclusivas. O resultado prático é exactamente o mesmo do exemplo anterior.
Atenção, podem ser usados vários ElseIf, mas só pode haver um Else!
18
Sintaxe:
IF condição1 THEN Acção1
ELSEIF condição2 THEN Acção2
ELSEIF condição3 THEN Acção 3
ELSE Acção4
ENDIF
Condição 1
Condição 2
Condição 3
Instrução 1
Acção 3
Instrução 3
Acção 2
Acção 1
V F
V F
V
Acção 4
F
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Diagrama de Fluxo
Estruturas de decisão encadeadas
19
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Exemplo - Enunciado
Enunciado:Adaptar o programa de cálculo das raízes da equação de 2º grau de forma a evitar as situações de divisão por zero
Option ExplicitPrivate Sub cmdCalc_Click() Dim a As Single, b As Single, c As Single Dim delta As Single lblR1.Caption = "" lblR2.Caption = "" a = txtA.Text b = txtB.Text c = txtC.Text delta = b ^ 2 - 4 * a * c If delta >= 0 Then lblR1.Caption = (-b + Sqr(delta)) / (2 * a) lblR2.Caption = (-b - Sqr(delta)) / (2 * a) Else MsgBox "Raízes complexas!" End If
End Sub
If a <> 0 Then
Else MsgBox "Inválido - divisão por zero!"End If
20
Private Sub cmdGo_Click() Dim nota As Single nota = txtNotas.Text If (nota < 0) Or (nota > 20) Then lblSaida.Caption = "Nota Inválida!" ElseIf nota < 6 Then lblSaida.Caption = "Mau" ElseIf nota < 10 Then lblSaida.Caption = "Medíocre" ElseIf nota < 14 Then lblSaida.Caption = "Suficiente" ElseIf nota < 17 Then lblSaida.Caption = "Bom" Else
lblSaida.Caption = "Muito Bom" End If End Sub
!"#$%&'!()*+,%&)+-+#./010*)02+30*)*+)3+34.50)10*)#&316$7+*)*+)/+,)8+,696#01&:
;)2&**<8+=)65>,6#0,).5)?.0=?.+,)3@5+,&)1+)>=&#&* )!"#!$%) 1+3/,&)1+).50)1010)+*/,./.,0#&316#6&30=:
A-+52=&B!
"#
"#
!"#$%&'()*+(,-./0123#,456
C65)3&/0)"*)D63E=+
3&/0)F)/-/'&/0*:G+-/
H9)I3&/0)J)K()L,)I3&/0)M)NK()G4+3
))))=>=D0610:O02/6&3)F)!'&/0)H38P=610Q!
A=*+H9)3&/0)J)R)G4+3
))))=>=D0610:O02/6&3)F)!S0.!
A=*+H9)3&/0)J)TK)G4+3
))))=>=D0610:O02/6&3)F)!S+1<&#,+!
A=*+H9)3&/0)J)TU)G4+3
))))=>=D0610:O02/6&3)F)!D.96#6+3/+!
A=*+H9)3&/0)J)TV)G4+3
))))=>=D0610:O02/6&3)F)!W&5!
A=*+B)=>=D0610:O02/6&3)F)!S.6/&)W&5!
A31)H9
78.()*+
!"#$%&'!()*+,%&)+-+#./010*)02+30*)*+)3+34.50)10*)#&316$7+*)*+)/+,)8+,696#01&:
;)2&**<8+=)65>,6#0,).5)?.0=?.+,)3@5+,&)1+)>=&#&* )!"#!$%) 1+3/,&)1+).50)1010)+*/,./.,0#&316#6&30=:
A-+52=&B!
"#
"#
!"#$%&'()*+(,-./0123#,456
C65)3&/0)"*)D63E=+
3&/0)F)/-/'&/0*:G+-/
H9)I3&/0)J)K()L,)I3&/0)M)NK()G4+3
))))=>=D0610:O02/6&3)F)!'&/0)H38P=610Q!
A=*+H9)3&/0)J)R)G4+3
))))=>=D0610:O02/6&3)F)!S0.!
A=*+H9)3&/0)J)TK)G4+3
))))=>=D0610:O02/6&3)F)!S+1<&#,+!
A=*+H9)3&/0)J)TU)G4+3
))))=>=D0610:O02/6&3)F)!D.96#6+3/+!
A=*+H9)3&/0)J)TV)G4+3
))))=>=D0610:O02/6&3)F)!W&5!
A=*+B)=>=D0610:O02/6&3)F)!S.6/&)W&5!
A31)H9
78.()*+
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Exemplo - solução
Enunciado:P r o g r a m a q u e f a ç a corresponder a uma dada nota numérica a classif icação qualitativa correspondente. Deve ainda assinalar notas inválidas.
txtNotas
lblSaidacmdGo
21
Nota
inválida?
nota < 6?
nota < 10?
Leitura da
nota
"Medíocre"
Fim
"Mau"
"Nota
inválida!"
V F
V F
V
"Muito Bom"
F
nota < 14?
nota < 17?
F
"Suficiente"
V
"Bom"
V F
End If
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Exemplo - fluxograma
Private Sub cmdGo_Click() Dim nota As Single nota = txtNotas.Text If (nota < 0) Or (nota > 20) Then lblSaida.Caption = "Nota Inválida!" ElseIf nota < 6 Then lblSaida.Caption = "Mau" ElseIf nota < 10 Then lblSaida.Caption = "Medíocre" ElseIf nota < 14 Then lblSaida.Caption = "Suficiente" ElseIf nota < 17 Then lblSaida.Caption = "Bom" Else
lblSaida.Caption = "Muito Bom" End If End Sub
22 5 12 17
22
APROGCivil
ISEP–DEI, Angelo Martins © 2006ISEP-DEI, António Silva, © 2007 Estruturas de Decisão
Conclusão
• Nesta aula introduzimos as estruturas de decisão, que permitem aos programas tomar decisões e adaptar-se a diferentes situações.
• Apresentámos duas formulações:− If … Then … [Else …] End If
− If … Then … ElseIf …[Else …] End If
• Estes conceitos vão ser explorados nas aulas práticas, resolvendo exercícios.
23