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