engenharia informática programação i & estruturas de dados e algoritmos 2001/2002 1 capitulo...

29
Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Upload: internet

Post on 17-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

1

Capitulo 5 - Decisões

Capitulo 5

Decisões

Page 2: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

2

Capitulo 5 - Decisões

Uma decisão

Page 3: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

3

Capitulo 5 - Decisões

A instrução if if (condição)

{ instrução

}

if (amount <= balance)

{ balance = balance - amount;

}

Page 4: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

4

Capitulo 5 - Decisões

Conjunto de instruções com um único if:

if (amount <= balance){ balance -= balance;

}

Page 5: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

5

Capitulo 5 - Decisões

Condições alternativas

Page 6: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

6

Capitulo 5 - Decisões

Instrução if/else• if (condição)

{ instrução1

}else

{ instrução2

}

• if (amount <= balance)

{ balance = balance - amount;

}

else

{ balance = balance - OVERDRAFT_PENALTY;

}

Page 7: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

7

Capitulo 5 - Decisões

Operadores relacionais (comparações)

• < > diferente• <= >= corresponde a • == != corresponde a =

Page 8: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

8

Capitulo 5 - Decisões

Comparação de valores com virgula flutuante

• Erros de arredondamento:double r = Math.sqrt(2)r * r é 2.0000000000000004 e não 2r * r == 2 é falso

• Para testar se x e y são suficientemente próximos:|x - y| e, e é um valor muito pequeno (e.x. 10-14.)

• Não é valido para números muito grande, p.e., 1014. Deve usar-se : |x - y| max(|x|, |y|)Math.abs(x - y) <= EPSILON * Math.max(Math.abs(x), Math.abs(y));

Page 9: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

9

Capitulo 5 - Decisões

Comparação de Strings• Não utilizar == para strings!

if (input == "Y") // Errado!!!• Utilize o método equals :

if (input.equals("Y"))• == testa se duas strings se referem ao mesmo

objecto, i.e., se são apenas dois nomes diferentes para o mesmo objecto. Método equals testa se os objectos a que se referem são iguais.

• Para efectuar um teste Case insensitive ("Y" ou y")

if (input.equalsIgnoreCase("Y"))

Page 10: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

10

Capitulo 5 - Decisões

Comparação de Objectos• == para testar a identidade, equals

para testar o conteúdo• Rectangle a = new Rectangle(5, 10, 20, 30);Rectangle b = new Rectangle(5, 10, 20, 30);

• a != b, mas a.equals(b)• Aviso: devemos definir o método equals na nossa classe (capitulo 9)

Page 11: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

11

Capitulo 5 - Decisões

Comparação de objectos

Page 12: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

12

Capitulo 5 - Decisões

Comparação Lexicográfica

• s.compareTo(t) < 0 significa: s vem antes de t no dicionário

• "car" vem antes de "cargo" que vem antes de "cathode".

• Todas as letras maiúsculas vem antes das minúsculas: "Hello" vem antes de "car"

Page 13: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

13

Capitulo 5 - Decisões

Comparação lexigrafica

Page 14: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

14

Capitulo 5 - Decisões

Alternativas múltiplas• if (condição1) instrução1;else if (condição2) instrução2;else if (condição3) instrução3;else instrução4;

• A primeira condição verdadeira é executada.A ordem é importante.

Page 15: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

15

Capitulo 5 - DecisõesProgram Richter.java

public class Richter{ public String getMagnitude(double theMagnitude) {

Earthquake quake = new Earthquake(theMagnitude);return quake.getDescription());

}}

public class Earthquake{ public Earthquake(double magnitude) {

richter_ = magnitude; }

Page 16: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

16

Capitulo 5 - Decisões public String getDescription() { String r; if (richter_ >= 8.0) r = "Most structures fall"; else if (richter_ >= 7.0) r = "Many buildings destroyed"; else if (richter_ >= 6.0) r = "Many buildings considerably damaged, some collapse"; else if (richter_ >= 4.5) r = "Damage to poorly constructed buildings"; else if (richter_ >= 3.5) r = "Felt by many people, no destruction"; else if (richter_ >= 0) r = "Generally not felt by people"; else r = "Negative numbers are not valid"; return r; }

private double richter_;} // Nota: a regra de estilo n.º10 não foi respeitada apenas por // falta de espaço

Page 17: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

17

Capitulo 5 - Decisões

Ciclos aninhados• if (condição1){ if (condição1a) {

instrução1a;}

else{

instrução1b;}

}

Page 18: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

18

Capitulo 5 - Decisões

Cálculo de impostos

Page 19: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

19

Capitulo 5 - Decisões

Program Tax.java

public class Tax{ // method to calculate the incoming tax // status may be “M” or “S” public getTax(double income,String status) {

TaxReturn aTaxReturn = new TaxReturn(income, status);return aTaxReturn.getTax();

}}

Page 20: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

20

Capitulo 5 - Decisõespublic class TaxReturn{ public TaxReturn(double anIncome, String aStatus) { income_ = anIncome; status_ = aStatus; }

public double getTax() { double tax = 0;

final double RATE1 = 0.15; final double RATE2 = 0.28; final double RATE3 = 0.31;

final double SINGLE_CUTOFF1 = 21450; final double SINGLE_CUTOFF2 = 51900;

Page 21: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

21

Capitulo 5 - Decisõesfinal double SINGLE_BASE2 = 3217.50;final double SINGLE_BASE3 = 11743.50;final double MARRIED_CUTOFF1 = 35800;final double MARRIED_CUTOFF2 = 86500;final double MARRIED_BASE2 = 5370;final double MARRIED_BASE3 = 19566;

if (status_.equalsIgnoreCase("S")){ if (income_ <= SINGLE_CUTOFF1) { tax = RATE1 * income_; } else if (income <= SINGLE_CUTOFF2) { tax = SINGLE_BASE2 + RATE2 * (income_ - SINGLE_CUTOFF1); } else { tax = SINGLE_BASE3 + RATE3 * (income_ - SINGLE_CUTOFF2); }}

Page 22: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

22

Capitulo 5 - Decisões else { if (income_ <= MARRIED_CUTOFF1) { tax = RATE1 * income_; } else if (income_ <= MARRIED_CUTOFF2) { tax = MARRIED_BASE2 + RATE2 * (income_ - MARRIED_CUTOFF1); } else { tax = MARRIED_BASE3 + RATE3 * (income_ - MARRIED_CUTOFF2); } } return tax; }

private double income_; private String status_;}

Page 23: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

23

Capitulo 5 - Decisões

O tipo booleano

• George Boole (1815-1864): pioneiro no estudo da lógica

• O valor da expressão x < 10 é true ou false.

• Tipo booleano: um de dois valores (V ou F)

• O método equals devolve um valor do tipo boolean

Page 24: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

24

Capitulo 5 - Decisões

Operadores booleanos• && e|| ou! negação

• if ( (tday == bday) && (tmonth == month) )...

• if ( (tmonth == 4) || (tmonth == 6) || (tmonth == 9) || (tmonth == 11) )...

• if ( (tmonth > bmonth) || ((tmonth == bmonth) && (tday > bday)) )...

Page 25: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

25

Capitulo 5 - Decisões

Fluxograma para combinações de &&

e ||

Page 26: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

26

Capitulo 5 - Decisões

Tabelas de verdade

• A B A && Btrue true truetrue false falsefalse any false

• A B A || Btrue any truefalse true truefalse false false

• A !Atrue falsefalse true

Page 27: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

27

Capitulo 5 - Decisões

Lei de De Morgan

• !(A && B) é idêntico a !A || !B• !(A || B) é idêntico a !A && !B• if ( !(country.equals("USA") && !state.equals("AK) && !state.equals("HI")) )...

• if (!country.equals("USA") || !!state.equals("AK) || !!state.equals("HI"))...

Page 28: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

28

Capitulo 5 - Decisões

Variáveis booleanas• boolean shipByAir = false;

if (!country.equals("USA"))

{ shipByAir = true;

}else if ( state.equals("AK") || state.equals("HI") )

{ shipByAir = true;

}if (shipByAir) ... else ...

• As variáveis bolenas são por vezes chamadas flags

Page 29: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 5 - Decisões Capitulo 5 Decisões

Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002

29

Capitulo 5 - Decisões

Boolean do's and don'ts• não escrever:

if (shipByAir == true)...if (shipByAir != false)...

• escrever:if (shipByAir)...

• não escrever:if (balance < 0) {

return true; } else

{ return false; }

• escrever:return balance < 0;