Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/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
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;
}
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;
}
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
5
Capitulo 5 - Decisões
Condições alternativas
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;
}
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 =
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));
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"))
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)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
11
Capitulo 5 - Decisões
Comparação de objectos
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"
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
13
Capitulo 5 - Decisões
Comparação lexigrafica
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.
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; }
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
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;}
}
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
18
Capitulo 5 - Decisões
Cálculo de impostos
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();
}}
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;
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); }}
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_;}
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
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)) )...
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
25
Capitulo 5 - Decisões
Fluxograma para combinações de &&
e ||
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
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"))...
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
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;
Top Related