Outline

Propaganda
1
Capítulo 6 - Métodos
2
6.1
Introdução
• Módulos
– Pequenos pedaços de um problema
• dividir para conquistar
– Facilitam o projeto, implementação, operação e manutenção
de programas grandes.
3
6.2
Módulos de Programa em Java
• Módulos em Java
– Métodos
– Classes
• As API Java fornecem vários módulos
• Programadores podem também criar seus próprios
módulos
– métodos definidos pelo programador
• Métodos
– Invocados por uma chamada de método
– Retornam um resultado para o método que o chamou
– Similar a um chefe (o que chama) requisitando a um
empregado (o chamado) que realize uma tarefa.
4
Chamadas de métodos
5
chefe
trabalha
dor1
trabalha
dor4
trabalha
dor2
trabalha
dor3
trabalha
dor5
Fig. 6.1 Relação hierárquica entre o chefe e seus empregados
6
6.3
Métodos da classe Math
• Classe java.lang.Math
– Fornece operações matemáticas comuns
– Calcular a raiz quadrada de 900.0:
• Math.sqrt( 900.0 )
– Método sqrt pertence à classe Math
• O operador ponto (.) permite o acesso ao método
sqrt
– O argumento 900.0 é passado entre parênteses
7
Método
abs( x )
Descrição
Exemplo
valor absoluto de x (este método também tem versões float, int e long) abs( 23.7 ) is 23.7
abs( 0.0 ) is 0.0
abs( -23.7 ) is 23.7
ceil( x )
arredonda x para o menor inteiro maior do que x
ceil( 9.2 ) is 10.0
ceil( -9.8 ) is -9.0
cos( x )
cosseno trigonométrico de x (x em radianos)
cos( 0.0 ) is 1.0
x
exp( x )
exponencial e
exp( 1.0 ) is 2.71828
exp( 2.0 ) is 7.38906
floor( x )
arredonda x para o maior inteiro menor do que x
floor( 9.2 ) is 9.0
floor( -9.8 ) is -10.0
log( x )
logaritmo natural de x (base e)
log( Math.E ) is 1.0
log( Math.E * Math.E ) is 2.0
max( x, y )
maior valor entre x e y (este método também tem versões float, int
max( 2.3, 12.7 ) is 12.7
elong)
max( -2.3, -12.7 ) is -2.3
min( x, y )
menor valor entre x e y (este método também tem versões float, int
min( 2.3, 12.7 ) is 2.3
elong)
min( -2.3, -12.7 ) is -12.7
y
pow( x, y )
x elevado a y (x )
pow( 2.0, 7.0 ) is 128.0
pow( 9.0, 0.5 ) is 3.0
sin( x )
seno trigonométrico de x (x em radianos)
sin( 0.0 ) is 0.0
sqrt( x )
raiz quadrada de x
sqrt( 900.0 ) is 30.0
sqrt( 9.0 ) is 3.0
tan( x )
tangente trigonométrica de x (x em radianos)
tan( 0.0 ) is 0.0
Fig. 6.2 métodos da classe Math.
8
6.4
Declaração de Métodos
• Métodos
– Permitem ao programador modularizar os programas
• Tornam mais gerenciável o desenvolvimento de programas
• Permitem a reutilização de software
• Evitam a repetição de código
– Variáveis locais
• Declaradas no interior da definição dos métodos
– Parâmetros
• Possibilitam a troca de informações entre métodos na chamada
dos métodos
9
6.4
Declaração de Métodos
• Os programadores podem escrever métodos
personalizados
10
Outline
O método main chama o
método quadrado
O método quadrado retorna
um valor inteiro
11
Outline
12
13
Versão usando swing
14
Versão usando swing
15
16
6.4
Declaração de Métodos
• Forma geral da declaração de um método:
tipo-do-valor-de-retorno nome-do-método(parâmetro1, parâmetro2, …,
parâmetroN) {
declarações e comandos
}
• Um método também pode retornar valores:
return expressão;
17
Outro exemplo: o método máximo
O usuário digita três
doubles
O método maximo retorna o
maior dos argumentos usando o
método max da classe Math
O método main passa
argumentos double para o
método maximo
18
Outro exemplo: o método máximo
19
20
6.5
Promoção de Argumentos
• Coerção de argumentos
– Forçar a conversão dos argumentos para um tipo apropriado
a fim de passá-los para um método
• e.g., System.out.println( Math.sqrt( 4 ) );
– O número inteiro 4 é promovido a double
– Calcula Math.sqrt( 4.0 )
– Então executa System.out.println()
• Regras para a promoção de tipos
– Especificam como converter entre tipos sem perda de
informação
21
Type
double
float
long
int
char
short
byte
boolean
Promoções válidas
Nenhuma
double
float or double
long, float or double
int, long, float or double
int, long, float or double
short, int, long, float or double
Nenhuma (valores boolean não são considerados
como sendo números em Java)
Fig. 6.5 Promoções permitidas para os tipos primitivos.
22
6.6
Pacotes de APIs Java
• Pacotes
– Classes agrupadas em categorias de classes relacionadas
– Promovem a reutilização de software
– declarações import especificam as classes usadas em um
programa Java
• e.g., import javax.swing.JOptionPane;
Package
java.applet
Description
java.awt
The Java Abstract Window Toolkit Package contains the classes and interfaces required to create and manipulate
GUIs in Java 1.0 and 1.1. In Java 2, the Swing GUI components of the javax.swing packages are often used
instead.
java.awt.event
The Java Abstract Window Toolkit Event Package contains classes and interfaces that enable event handling for
GUI components in both the java.awt and javax.swing packages.
java.io
The Java Input/Output Package contains classes that enable programs to input and output data (see Chapter 17,
Files and Streams).
java.lang
The Java Language Package contains classes and interfaces (discussed throughout this text) that are required by
many Java programs. This package is imported by the compiler into all programs.
java.net
The Java Networking Package contains classes that enable programs to communicate via networks (see
Chapter 18, Networking).
java.text
The Java Text Package contains classes and interfaces that enable a Java program to manipulate numbers, dates,
characters and strings. The package provides many of Java’s internationalization capabilities that enable a
program to be customized to a specific locale (e.g., an applet may display strings in different languages, based on
the user’s country).
java.util
The Java Utilities Package contains utility classes and interfaces, such as date and time manipulations, randomnumber processing capabilities with class Random, storing and processing large amounts of data and breaking
strings into smaller pieces called tokens with class StringTokenizer (see Chapter 20; Data Structures,
Chapter 21, Java Utilities Package and Bit Manipulation; and Chapter 22, Collections).
javax.swing
The Java Swing GUI Components Package contains classes and interfaces for Java’s Swing GUI components that
provide support for portable GUIs.
javax.swing.event
The Java Swing Event Package contains classes and interfaces that enable event handling for GUI components in
package javax.swing.
Fig. 6.6
The Java Applet Package contains the Applet class and several interfaces that enable applet/browser interaction
and the playing of audio clips. In Java 2, class javax.swing.JApplet is used to define an applet that uses the
Swing GUI components.
Java API packages (a subset).
23
24
6.7
Geração de números aleatórios
• Geração de números aleatórios em Java
– Math.random()
• ( int ) ( Math.random() * 6 )
– Produz inteiros entre 0 - 5
– Seqüência pseudo-aleatória: Usa uma semente (seed) para
gerar seqüências diferentes de números aleatórios
25
Outline
Produz inteiros na faixa 1-6
Math.random retorna um
double. Convertemos então o
double para um int
26
Outline
27
28
Um jogo de dados
29
Outline
Produz inteiros no intervalo 1-6
Incrementa o contador de freqüência
apropriado, dependendo do número
aleatório gerado
30
31
6.8
Exemplo: Um jogo de sorte e azar
• Craps
– Joga os dados a primeira vez
• Se a soma é igual a 7 ou 11, o jogador ganha
• Se a soma é igual a 2, 3 ou 12, o jogador perde
• Qualquer outra soma (4, 5, 6, 8, 9, 10) se transforma nos
pontos do jogador
– Continua jogando os dados...
• A soma é igual aos pontos do jogador
– O jogador ganha
• A soma é igual a 7
– O jogador perde
1.
2.
3.
import javax.swing.*;
public class Craps {
String output = "";
4.
5.
6.
public static void main(String args[]) {
new Craps();
}
7.
8.
9.
10.
final int GANHOU = 0, PERDEU = 1, CONTINUA = 2;
int statusJogo = CONTINUA; // jogo ainda nao acabou
int meusPontos = 0;
// se o jogo nao acabou na primeira rodada
boolean primeiraRodada = true;
// verdadeiro se é a primeira rodada
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Craps() {
int somaDosDados;
while (true) {
if (primeiraRodada) {
somaDosDados = jogaDados();
switch (somaDosDados) {
case 7: case 11: // ganha na primeira rodada
statusJogo = GANHOU;
break;
case 2: case 3: case 12: // perde na primeira rodada
statusJogo = PERDEU;
break;
default: // guarda o numero de pontos
statusJogo = CONTINUA;
meusPontos = somaDosDados;
primeiraRodada = false;
break;
}
32
Outline
Craps.java
Linha 15
Invoca o método
jogaDados
Linha 17
Se a soma é 7 ou 11,
o usuário ganhou
Linha 20
Se o usuário obtém
um 2, 3 ou 12, o
usuário perdeu
Linha 23
Se a soma é 4, 5, 6, 8,
9 ou 10, esta soma
corresponde aos
pontos do jogador
33
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
} else {
somaDosDados = jogaDados();
// determina o status do jogo
if (somaDosDados == meusPontos)
statusJogo = GANHOU;
else if (somaDosDados == 7)
statusJogo = PERDEU;
}
mostraMensagem();
}
42.
43.
44.
// joga os dados, calcula a soma e mostra os resultados
public int jogaDados() {
int dado1, dado2, soma;
}
45.
46.
dado1 = 1 + (int) (Math.random() * 6);
dado2 = 1 + (int) (Math.random() * 6);
47.
48.
49.
soma = dado1 + dado2;
// soma o valor das faces
output += "dado1: " + dado1 + "\n";
output += "dado2: " + dado2 + "\n";
50.
51.
return soma;
}
// retorna a soma dos dados
Outline
Craps.java
Linhas 34-37
Se a soma é igual aos
pontos do jogador, o
usuário ganha; se a
soma é igual a 7, o
usuário perde
Lines 45-46
O método jogaDados
usa Math.random
para simular o
lançamento de dois
dados
Line 50
retorna o somatório
dos dados
34
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68. }
public void mostraMensagem() {
if (statusJogo == CONTINUA) {
output += "Seus pontos: " + meusPontos + "\n";
output += "Pressione OK para lancar os dados novamente..." + "\n";
} else {
if (statusJogo == GANHOU)
output += "Voce venceu! Pressione OK para recomecar o jogo." + "\n";
else
output += "Voce perdeu! Pressione OK para recomecar o jogo." + "\n";
// proxima rodada eh a primeira rodada de um novo jogo
primeiraRodada = true;
}
JOptionPane.showMessageDialog(null, output);
output = "";
}
Outline
35
Outline
Craps.java
36
Outline
Craps.java
37
6.9 Escopo das Declarações
• Escopo
– Partes do programa que podem referenciar uma entidade
pelo seu nome
– Regras básicas de escopo
• Escopo da declaração de parâmetros
• Escopo da declaração de variáveis locais
• Escopo da declaração de uma variável local que aparece na
expressão de inicialização de um laço for
• Escopo de um método ou atributo de uma classe
38
Outline
39
Outline
40
Outline
41
6.15 Sobrecarga de Métodos
• Sobrecarga de métodos (overload)
– Vários métodos com o mesmo nome
– Diferentes conjuntos de parâmetros para cada método
• Número de parâmetros
• Tipo dos parâmetros
42
Outline
Método quadrado recebe
um int como argumento
Método sobrecarregado (overloaded)
quadrado recebe um double
como argumento
43
Outline
44
Sobrecarga: Um erro!!!
Outline
O compilador não pode distinguir entre
métodos com nomes idênticos e mesma
lista de parâmetros
45
6.12 Recursão
• Métodos Recursivos
– Chamam a si próprios (direta ou indiretamente)
– O método sabe como resolver apenas um caso trivial do
problema (caso base)
– O método divide o problema:
• Caso base
• Um problema mais simples
– o método divide o problema em problemas mais simples
até que o problema possa ser resolvido (até que ele se
reduza ao caso base)
– Chamadas recursivas, ou
– Passos recursivos
46
valor final = 120
5!
5!
5! = 5 * 24 = 120 é retornado
5 * 4!
5 * 4!
4! = 4 * 6 = 24 é retornado
4 * 3!
4 * 3!
3! = 3 * 2 = 6 é retornado
3 * 2!
3 * 2!
2! = 2 * 1 = 2 is returned
2 * 1!
2 * 1!
1 retornado
1
1
(a) Seqüência de chamadas recursivas.
(b) Valores retornados por cada chamada recursiva.
Fig. 6.14 Cálculo recursivo de 5!.
47
Outline
Invoca o método fatorial
Testa o caso base (método fatorial
consegue resolver o caso base)
se não for o caso base retorna um
problema mais simples que o método
fatorial talvez consiga resolver na próxima
iteração
48
Outline
49
O método main()
50
O método fatorial()
object
this : FactorialTest
1: fatorial()
2[num<=1]:
<<if>>
3: return 1
4: return num*fatorial(num-1)
51
6.13 Outro exemplo usando recursão: A
série de Fibonacci
• A série de Fibonacci
– Cada número na série é a soma dos dois números anteriores
• e.g., 0, 1, 1, 2, 3, 5, 8, 13, 21…
fibonacci(0) = 0
fibonacci(1) = 1
fibonacci(n) = fibonacci(n - 1) + fibonacci( n – 1 )
• fibonacci(0) e fibonacci(1) são os casos base
– "Razão Dourada"
1 5
 1.6180339887498948482
2
52
Usamos long, porque os números de
Fibonacci crescem muito rapidamente
Outline
Passa o número digitado pelo usuário
para o método fibonacci
Testa o caso base (o método fibonacci
consegue resolver o caso base)
Se não for o caso base, retorna um
problema mais simples que o método
fibonacci conseguirá resolver nas
próximas iterações
53
Outline
54
fibonacci( 3 )
return
return
fibonacci( 1 )
return 1
fibonacci( 2 )
+
fibonacci( 0 )
+
fibonacci( 1 )
return 1
return 0
Fig. 6.17 Conjunto de chamadas recursivas para fibonacci (3).
55
56
6.14 Recursão vs. Iteração
• Iteração
– Usa estruturas de repetição (for, while ou do…while)
– Repetição através do uso explicito dessas estruturas de
repetição
– Termina quando a condição de continuação do laço falha
– Controle do número de repetições através de um contador
• Recursão
–
–
–
–
Usa estruturas de seleção (if, if…else ou switch)
Repetição através da chamada repetitiva de métodos
Termina quando atinge o caso base
Controla o número de repetições dividindo o problema em
problemas mais simples
57
6.14 Recursão vs. Iteração
• Recursão
–
–
–
–
Mais overhead do que a iteração
Mais memória necessária do que a iteração
Pode sempre ser resolvida iterativamente
Freqüentemente pode ser implementada com umas poucas
linhas de código
A iteração é humana, a recursão divina.
anônimo
58
Download