BC0505 – Processamento da InformaçãoAssunto: Modularização de Código e Passagem de Parâmetros Aula Prática: 05 Introdução – Métodos e Modularização No Java, como em outras linguagens de Programação Orientadas a Objeto (POO), o código pode ser simplificado empregando-se métodos de classe, em princípio análogo às funções das linguagens funcionais. De fato, sem utilizar POO, em algoritmos seqüenciais, como os estudados, não há diferenças notáveis. Toda a classe executável em Java deve incluir um método main, que é o método chamado automaticamente pela JVM quando a classe é executada. Como já visto, a declaração do método main é feita na forma: public static void main(String[] args) { código do usuário } De forma similar, outros métodos podem ser definidos para executar blocos de código do usuário. Como exemplo, uma função fatorial pode ser implementada em um método como segue (recursiva): [1] [2] [3] [4] [5] [6] Versão: 0.1c public static long fatorial(long n) { if (n <= 1) return 1; else return n*fatorial(n - 1); } [1] Métodos públicos podem ser acessados por outras classes. Em POO, métodos também podem ser privados e protegidos, por enquanto utilizaremos apenas métodos públicos. [2] Lembre-se também que métodos declarados como estáticos apenas podem acessar métodos e variáveis de classe estáticas (não instanciadas em objetos, ou únicas, da classe). [3] O tipo da variável retornada pelo método deve ser declarado, ou identificado como void (vazio) no caso de o método não retornar nada. [4] O nome do método segue as mesmas regras de nomenclatura das variáveis, como estudado anteriormente. [5] Definimos os tipos de entrada aceitas pelo método ao declarar os tipos e nomes de variáveis locais entre parênteses (válidas somente no escopo do método), que receberão os valores passados como parâmetros pela chamada, separados por vírgula. [6] Caso o valor de retorno não seja declarado void (vazio), o bloco deverá incluir o return, que indica o valor a ser retornado ao ponto de chamada, finalizando a execução do método. Métodos podem ser copiados para novos programas e reutilizados. Métodos declarados públicos podem ser acessados externamente por qualquer classe, assim limpando/simplificando o código principal, o que é particularmente útil em projetos extensos. Para utilizar uma classe externa, basta importá-la no início da classe, caso não esteja no mesmo projeto. Quando utilizamos o método Math.pow(2,6) para efetuar a operação 26, estamos chamando o método pow (exponenciação) da classe padrão Math, que oferece funções (ex. sin(), cos(), random(), etc.) e constantes (Math.PI e Math.E ) matemáticas. Classes padrões como System (chamadas do sistema) e Math são automaticamente incluídas. Outras classes cujos métodos públicos já utilizamos são String, Integer, Double, java.util.Scanner e javax.swing.JOptionPane. 1 como inteiros: public static int ask(String m. } } O método ask pode ser sobrecarregado para outros tipos de variável. d)). como String vazia. int meses = Integer. "1")). assumindo o valor padrão no caso de entrada inválida. } catch (Exception e) { e. Tente deixar o código o mais breve possível.showInputDialog(m. double d) { try { return Double. } catch (Exception e) { e. caracteres não numéricos ou com erro de formatação. É substituído por: double valorInicial = ask("Valor inicial: ". passando por meio de parâmetros os valores que os novos métodos venham a utilizar.parseDouble( JOptionPane. "300")). return d. 300). . } } Note que o código substituído incorpora tratamento de erros. Por motivos didáticos a mensagem de erro ainda é exibida no console (e.parseDouble( JOptionPane. o código: double valorInicial = Double.printStackTrace().Atividade 1 – Modularizando o código O código da página seguinte pode ser simplificado escrevendo-se métodos modulares com o objetivo de reduzir a repetição de blocos de código ao longo do programa. int i) { try { return Integer.showInputDialog("Valor inicial: ".showInputDialog("Quantos meses? ".parseInt(JOptionPane. Modifique o programa abaixo criando 2 métodos (ask e planejar) para reduzir ao máximo a repetição do código do método main. i)). implementando-se um método ask de forma que: public static double ask(String m.printStackTrace). return i.printStackTrace().showInputDialog(m. int meses = ask("Quantos meses? ". embora possa ser omitida.parseInt( JOptionPane. 1). Por exemplo. format("%d meses (%d anos) em Letras do Tesouro Nacional\n". meses = 0. double objetivo = ask("Qual o objetivo?"..format("%d meses (%d anos) no CDB\n". meses. meses = 0.format("Para um investimento de R$ %.012. 300000f).2% ao mês // ~1.0082.import javax. saldo = investimento. meses.2f seria:\n\n". double juros_LTN = 1. saldo = saldo * juros_Multimercado + complemento. } frase += String. } } frase += String. meses. meses/12).swing. objetivo). while (saldo < objetivo) { meses++. meses/12). public class Aplicacao { public static void main(String[] args) { double investimento = ask("Qual o valor investido?". while (saldo < objetivo) { meses++.016. } frase += String. meses/12).format("%d meses (%d anos) em Fundos Multimercado\n". double juros_CDB = 1.57% ao mês na média // ~0. double complemento = ask("Qual o complemento mensal?". if (meses % 12 == 0 && meses > 1) { saldo -= saldo * taxaAnual_Multimercado. meses/12).2f " + "com aplicações mensais de R$ %. meses = 0.82% ao mês // ~1.2f\n" + "O tempo para atingir R$ %. saldo = saldo * juros_CDB + complemento. saldo = investimento. double juros_Poupanca = 1. } frase += String. frase). saldo = saldo * juros_LTN + complemento. 800f)..format("%d meses (%d anos) na Poupança\n".01. complemento.showMessageDialog(null. 15000f). double saldo = investimento.0057.. saldo = saldo * juros_Poupanca + complemento.6% ao mês double taxaAnual_Multimercado = 0. while (saldo < objetivo) { meses++. investimento. double juros_Multimercado = 1.JOptionPane. // 1% ao ano String frase = String. int meses = 0. } } } . while (saldo < objetivo) { meses++. saldo = investimento. meses. // ~0. JOptionPane. Vale ressaltar que o tipo suportado deverá ser double. 3.showMessageDialog(null.showInputDialog("Digite o segundo valor: ")).showInputDialog("Escolha a sua opção: \n" + "1 – adição\n")). JOptionPane. double v2.1. divisão e subtração. import javax.Atividade 2 – Operações aritméticas package calculo. . Depure o código e verifique o que ocorre no Java. 3.parseDouble( JOptionPane.JOptionPane. v2 = Double. b) Os métodos podem ser sobrecarregados para lidar com tipos diferentes de entrada e saída. JOptionPane.showMessageDialog(null. v1 = Double. Faça o teste trabalhando com os módulos modAdição (com e sem passagem de parâmetros). } } a) Complete o programa construindo métodos para multiplicação. Construa um novo módulo modAdição que tenha passagem dos parâmetros double v1 e double v2. Faça um programa que leia mil números através de uma estrutura de repetição e utilize um processo randômico para sorteio do valor. Os número devem estar entre 0 e 100. } public static void main(String[] args) { int opcao.showInputDialog("Digite o primeiro valor: ")). res = v1 + v2. Verifique: a) Qual foi o número sorteado mais vezes b) Qual foi o número sorteado menos vezes c) Qual foi o maior número d) Qual foi o menor número. } JOptionPane. Concatene o código da atividade 1 de forma que o método main execute apenas o comando frase(). public class Calculo { static void modAdicao() { double v1. opcao = Integer. "Planejamento financeiro". "Soma = " + res). if (opcao == 1) { modAdicao().parseInt( JOptionPane. JOptionPane.showMessageDialog(null. Exercícios para Casa 3. double res.INFORMATION_MESSAGE).2. " Fim do Programa").swing.parseDouble( JOptionPane. .3. Os métodos celsius(t). long.15. No final. Fahrenheit e Kelvin. Dados: (Fahrenheit) = 1. int.8*(Celsius) + (Kelvin) = (Celsius) + 273. 3. kelvin(t) e fahrenheit(t) (sobrecarregados) devem receber um número de qualquer tipo (byte. 32.Escreva uma função para cada opção. float ou double) e retornar uma String no formato “%d ºC = %d ºF = %d K”. Crie métodos para exibição de temperaturas em graus Celsius. imprima esses valores na tela para o usuário.