engenharia informática programação i & estruturas de dados e algoritmos 2001/2002 1 capitulo...
TRANSCRIPT
![Page 1: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/1.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
1
Capitulo 7 – Métodos avançados
Capitulo 7
Métodos avançados
![Page 2: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/2.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
2
Capitulo 7 – Métodos avançados
Parâmetros formais e actuais
• Parâmetros formais(implícitos + explícitos):class BankAccount{ public void deposit(double amount) {
balance += amount; } . . .}
• Parâmetros actuais(argumentos):harrysChecking.deposit(allowance - 200)
![Page 3: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/3.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
3
Capitulo 7 – Métodos avançados
Passagem de parâmetros
![Page 4: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/4.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
4
Capitulo 7 – Métodos avançados
Parâmetros de objecto
• public void transfer(BankAccount other, double amount)
{ withdraw(amount); other.deposit(amount);}
• Chamada com uma referencia a um objecto e um parâmetro numérico:double allowance = 800;momsSavings.transfer(harrysChecking, allowance);
![Page 5: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/5.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
5
Capitulo 7 – Métodos avançados
Referencia a objecto e parametro numerico
![Page 6: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/6.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
6
Capitulo 7 – Métodos avançados
Métodos para alteração e para acesso
• Acesso: não altera o estado de um parâmetro implícito (ex.. getBalance)
• Alteração: altera o estado de um parâmetro implícito (ex.. deposit)
• Classe Inalterável: Todos os métodos são unicamente para acesso (ex.. String)
![Page 7: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/7.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
7
Capitulo 7 – Métodos avançados
O que se entende por efeitos colaterais
• Qualquer alteração fora do parâmetro implícito
• P.e: modificação de outro parâmetro fora do objecto (ex.. transfer)
• P.e: imprimir dentro do método: public void deposit(double amount){
– if (amount < 0) JOptionPane.showInputDialog("Bad value"); . . .
}
![Page 8: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/8.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
8
Capitulo 7 – Métodos avançados
Minimizar os efeitos colaterais
• Excelente: Sem modificações (getBalance)• Bom: métodos para alterações que apenas
alteram parâmetros implicídos (deposit)• Regular: Métodos que alteram parâmetros
explícitos (transfer)• Miserável: Métodos com outros efeitos
colaterais (alterar variáveis estáticas, enviar para o écran)
![Page 9: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/9.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
9
Capitulo 7 – Métodos avançados
Métodos estáticos• Métodos sem parâmetros implícitos• Não actuam num objecto• Exemplo típico: quando todos os parâmetros
são números:x e y são aproximadamente iguais se
• |x - y| max(|x|, |y|)• public static boolean approxEqual
(double x, double y){
• return Math.abs(x - y) <= EPSILON * Math.max(Math.abs(x), Math.abs(y));}
![Page 10: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/10.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
10
Capitulo 7 – Métodos avançados
Métodos estáticos• Em Java, todos os métodos devem
pertencer a uma classeclass Numeric{
• public static boolean approxEqual(double x, double y) { . . . }}
• A chamada á feita através do nome da classe:if (Numeric.approxEqual(a, b)) . . .
![Page 11: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/11.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
11
Capitulo 7 – Métodos avançados
Não é possível modificar parâmetros numéricos
• public static void updateBalance (double balance, double interestRate){
• double interest = balance * interestRate / 100; balance = balance + interest;}
• Não resulta:double savings = 10000;double rate = 5;updateBalance(savings, rate);
![Page 12: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/12.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
12
Capitulo 7 – Métodos avançados
Um método não pode modificar
parâmetros numericos
![Page 13: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/13.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
13
Capitulo 7 – Métodos avançados
É possível modificar o estado do parâmetro de um objecto
• public static void updateBalance (BankAccount account, double interestRate){
• double interest = account.getBalance() * interestRate / 100; account.deposit(interest);}
• BankAccount collegeFund = new BankAccount(10000);
double rate = 5;updateBalance(collegeFund, rate);
![Page 14: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/14.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
14
Capitulo 7 – Métodos avançados
Um método pode modificar o estado do
parametro de um objecto
![Page 15: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/15.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
15
Capitulo 7 – Métodos avançadosNão é possível modificar o conteúdo do objecto passado
como parâmetro• public static chooseAccount(BankAccount
betterAccount, BankAccount candidate1, BankAccount candidate2){ if (candidate1.getBalance() > candidate2.getBalance()) betterAccount = candidate1; else betterAccount = candidate2;}
• BankAccount collegeFund = new BankAccount(10000);BankAccount momsSavings = new BankAccount(8000);BankAccount myAccount = null; // não resulta!! chooseAccount(myAccount,momsSavings,collegeFund);
![Page 16: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/16.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
16
Capitulo 7 – Métodos avançados
Um método não pode substituir um parametro objecto
![Page 17: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/17.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
17
Capitulo 7 – Métodos avançados
Variáveis estáticas
• Uma variável por classe, e não por objecto
• Exemplo: última conta bancaria atribuída propriedade da classe e não do objecto
• public class BankAccount{ . . . private double balance; private int accountNumber; private static int lastAssignedNumber;}
![Page 18: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/18.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
18
Capitulo 7 – Métodos avançados
Variáveis estáticas
• public BankAccount(){
• lastAssignedNumber++; accountNumber = lastAssignedNumber;}
• Inicialização de variáveis estáticas:class BankAccount{ . . . private static int lastAssignedNumber = 0;}
• Constantes estáticas: Math.PI
![Page 19: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/19.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
19
Capitulo 7 – Métodos avançados
Atributos e variaveis estáticas
![Page 20: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/20.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
20
Capitulo 7 – Métodos avançados
Tipos de variáveis
• Atributos• Variáveis estáticas• Variáveis locais• Parâmetros
![Page 21: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/21.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
21
Capitulo 7 – Métodos avançados
Escopo• Escopo da classe — definido na classe(atributos
ou variáveis estáticas)• Escopo do bloco — definido no bloco(variável
local)• Shadowing//”esconder” uma variável com escopo
superiorclass BankAccount{
• public BankAccount(double initialBal) {
double balance = initialBal; } private double balance; }
![Page 22: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/22.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
22
Capitulo 7 – Métodos avançados
Como comentar os métodos
• /** Tests whether two floating-point numbers are equal except for roundoff @param x a floating-point number @param y a floating-point number @return true if x and y are approximately equal*/public static boolean approxEqual(double x, double y){ . . .}
![Page 23: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/23.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
23
Capitulo 7 – Métodos avançados
Comentários às classes
• /** A class that stores the position and speed of a simulated cannon ball*/public class CannonBall{ . . .}
• Ferramenta de extração de comentários:javadoc MyProg.java
![Page 24: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/24.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
24
Capitulo 7 – Métodos avançados
Página HTML produzida pela javadoc
![Page 25: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/25.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
25
Capitulo 7 – Métodos avançados
Pré-condições
• O que deve um método fazer quando é chamado com parâmetros incorrectos?Math.sqrt(-1);account.deposit(-1000);
• Não fazer nada?• Acabar o programa?• Retornar uma mensagem de erro?
![Page 26: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/26.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
26
Capitulo 7 – Métodos avançados
Pré-condições• Condição pré estabelecida:
@param amount the amount ofmoney to deposit; must be > 0
• Lançar uma excepção se uma das pré condições for violada:if (amount <= 0) throw new IllegalArgumentException();
• Quem executa é responsável: executa os métodos com parâmetros que preencham todos os pré requisitos
• Responsabilidade do programador: Apenas computa resultados acertados quando os parâmetros preencherem as pré-condições
![Page 27: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/27.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
27
Capitulo 7 – Métodos avançados
Recursividade
• n! = 1 2 3 . . . n• 0! = 1
1! = 12! = 23! = 64! = 245! = 120
![Page 28: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/28.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
28
Capitulo 7 – Métodos avançados
Recursividade• Não existem operações ... mágicas:
public static int factorial(int n){
return 1 * 2 * 3 * ... * n;}
• Não foi assim que chegamos ao resultado da tabela — Foi usadon! = (n - 1)! n
• public static int factorial(int n){
return factorial(n - 1) * n;}
• Quase certo—mas a recursividade tem que terminar...
![Page 29: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/29.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
29
Capitulo 7 – Métodos avançados
Recursividade• Toda a recursividade tem que
simplificar a computação de alguma forma
• Devem existir casos especiais para efectuar computações simples
• factorial(4) calls factorial(3) factorial(3) calls factorial(2) factorial(2) calls factorial(1) factorial(1) calls factorial(0) factorial(0) returns 1 factorial(1) returns 1 * 1 = 1 factorial(2) returns 1 * 2 = 2 factorial(3) returns 2 * 3 = 6factorial(4) returns 6 * 4 = 24
![Page 30: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/30.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
30
Capitulo 7 – Métodos avançados
Program Fac.java
public class Fac{ public String getFactorial(int n) {
return(n + "! = ” + factorial(n)); }
![Page 31: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/31.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
31
Capitulo 7 – Métodos avançados
/** Computes the factorial of an integer. @param n an integer >= 0 @return n! */ public static int factorial(int n) { if (n == 0) { return 1; } else { int result = n * factorial(n - 1); return result; } }}
![Page 32: Engenharia Informática Programação I & Estruturas de Dados e Algoritmos 2001/2002 1 Capitulo 7 – Métodos avançados Capitulo 7 Métodos avançados](https://reader035.vdocuments.site/reader035/viewer/2022062404/552fc0fc497959413d8ba292/html5/thumbnails/32.jpg)
Engenharia InformáticaProgramação I & Estruturas de Dados e Algoritmos2001/2002
32
Capitulo 7 – Métodos avançados
Towers of Hanoi