estruturas de decisão - departamento de engenharia ...asilva/page14/page16/assets/teoricas...

23
APROG Civil ISEP–DEI, Angelo Martins © 2006 ISEP-DEI, António Silva, © 2007 Estruturas de Decisão Angelo Martins – Dep. Eng. Informática - ISEP Estruturas de Decisão Aula 2 1

Upload: phungcong

Post on 20-Jan-2019

216 views

Category:

Documents


0 download

TRANSCRIPT

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