Você está na página 1de 5

BC0505 Processamento da Informao

Assunto: Modularizao de cdigo e passagem de parmetros Aula Prtica: 4 Introduo Modularizao


No Java, como em outras linguagens de Programao Orientadas a Objeto, o cdigo pode ser simplificado empregando-se mtodos de classe, de princpio anlogo s funes nas linguagens funcionais. Em algoritmos seqenciais, como os estudados nesta disciplina, sem empregar Programao Orientada a Objeto, no h diferenas notveis entre mtodos e funes. Toda a classe executvel em Java j deve incluir ao menos um mtodo, o mtodo main, que aquele chamado automaticamente pela JVM quando a classe principal executada. Como j visto a declarao do mtodo main feita na forma: public static void main(String[] args) { cdigo do usurio }

Verso: 0.2

De forma similar, outros mtodos podem ser definidos pelo usurio para executar blocos de cdigo repetidos vrias vezes. Por exemplo, uma funo fatorial (recursiva) pode ser implementada em um mtodo como segue:
[1] [2] [3] [4] [5] [6]

public static long fatorial(long n) { return n>1?n*fatorial(n - 1):1; } [1] Mtodos pblicos podem ser acessados por outras classes. Em POO, mtodos tambm podem ser privados e protegidos, por enquanto utilizaremos apenas mtodos pblicos. [2] Lembre-se tambm que mtodos declarados como estticos apenas podem acessar mtodos e variveis de classe estticas (no instanciadas em objetos, ou nicas da classe). [3] O tipo da varivel retornada pelo mtodo deve ser declarado ou identificado por void (vazio) no caso do mtodo no retornar nada. [4] A nomenclatura segue as mesmas regras de variveis, como estudado (http://drop.io/Processamento/asset/00-introd-prog-java-com-netbeans-pdf ). [5] Definimos os parmetros de entrada do mtodo declarando as variveis locais que recebero os valores, separadas por vrgula, (existiro somente no escopo do mtodo). [6] Caso o mtodo no tenha sido declarado como void (vazio), o mtodo dever incluir um comando return, que finaliza a execuo do mtodo e retorna ao ponto de chamada o valor indicado. Mtodos podem ser copiados e reutilizados em novos projetos. Mtodos declarados pblicos podem ser acessados externamente por qualquer classe, simplificando o cdigo principal, o que particularmente til em projetos com cdigos extensos. Para utilizar uma classe externa, basta import-la no incio da classe, caso no esteja no mesmo projeto. Quando utilizamos o mtodo Math.pow(2,6) para efetuar a operao 26, estamos chamando o mtodo pow (exponenciao) da classe padro Math, que oferece funes (ex. sin(), cos(), random(), etc.) e constantes (Math.PI e Math.E ) matemticas. Classes padro do Java como System (chamadas do sistema), Math , String, Integer, Double, etc. so automaticamente includas. As demais devem ser manualmente especificadas, como java.util.Scanner e javax.swing.JOptionPane.

Atividade 1 Modularizando o cdigo


O cdigo da pgina seguinte deve ser simplificado escrevendo-se mtodos modulares com o objetivo de reduzir a repetio de cdigo ao longo do programa. Por exemplo, o cdigo: double valorInicial = Double.parseDouble( JOptionPane.showInputDialog("Valor inicial: ", "300")); int meses = Integer.parseInt( JOptionPane.showInputDialog("Quantos meses? ", "1")); retorna uma mensagem de erro no caso de uma entrada de dados invlida (faa o teste), ex. String vazia, caracteres no numricos ou com erros de formatao, como , ao invs de .). O comando pode ser substitudo por um mtodo que desempenhe a leitura incorporando tratamento de erros. double valorInicial = ler("Valor inicial: ", 300); int meses = ler("Quantos meses?", 1); implementando-se na classe um mtodo ler de forma que: public static double ler(String m, double d) { try { return Double.parseDouble( JOptionPane.showInputDialog(m, d)); } catch (Exception e) { e.printStackTrace(); return d; } } O mtodo ler pode ser sobrecarregado* para aceitar outros tipos de varivel, como nmeros inteiros: public static int ler(String m, int i) { try { return Integer.parseInt(JOptionPane.showInputDialog(m, i)); } catch (Exception e) { e.printStackTrace(); return i; } Na estrutura try { comandos } catch(Exception) { cdigo em caso de erro }, o comando e.printStackTrace exibe a mensagem de erro produzida no console (pode ser omitida) apenas para fins didticos, mas o programa continua sua execuo normalmente, retornando o valor padro especificado na chamada. Repare que o mtodo chamado depende do valor passado e da varivel que recebe o retorno. a) O programa a seguir no deve ser copiado, em lugar, tente reduzir ao mximo a repetio do cdigo dentro do mtodo main, tentando deix-lo o mais breve possvel. Dica: passe a um mtodo os valores atravs de parmetros, de forma que a chamada fique parecida com mensagem = tempo("investimento", juros, inicial, complemento, objetivo);

* Sobrecarregar mtodos significa criar vrios mtodos com mesmo nome, porem que operam com tipos de variveis diferentes, aceitem parmetros adicionais ou de tipos diferentes.

public class Main { /** Variveis de classe ou "variveis Globais" o modificador final indica uma constante */ final static double Poupanca = 1.0055; // + 0,55% ao mes na media final static double CDB = 1.0075; // + 0,75% ao mes final static double LTN = 1.01; // + 1% ao mes final static double Multimercado = 1.014; // + 1,4% ao mes final static double taxaAnual = 0.01; // - 1% ao ano public static void main(String[] args) { double inicial = ler("Qual o valor investido? ", 1000f); double complemento = ler("Qual o complemento mensal? ", 0f); double objetivo = ler("Qual o seu objetivo? ", 1000000f); String frase = String.format( "O tempo para um investimento de R$ %,.2f com aplicaes "+ "mensais de R$ %,.2f\n atingir R$ %,.2f :\n\n", inicial, complemento, objetivo); int meses = 0; double saldo = inicial; double juros = Poupanca; while (saldo < objetivo) { meses++; saldo = saldo * juros + complemento; } frase += String.format("%d meses (%d anos) na poupanca\n", meses, meses / 12); meses = 0; saldo = inicial; juros = CDB; while (saldo < objetivo) { meses++; saldo = saldo * juros + complemento; } frase += String.format( "%d meses (%d anos) no CDB\n", meses, meses / 12); meses = 0; saldo = inicial; juros = LTN; while (saldo < objetivo) { meses++; saldo = saldo * juros + complemento; } frase += String.format( "%d meses (%d anos) em Letras do Tesouro Nacional\n", meses, meses / 12); meses = 0; saldo = inicial; juros = Multimercado; while (saldo < objetivo) { meses++; saldo = saldo * juros + complemento; if (meses % 12 == 0) saldo -= saldo * taxaAnual; } frase += String.format( "%d meses (%d anos) em Fundos Multimercado\n", meses, meses / 12); JOptionPane.showMessageDialog(null, frase); }

b) Modularize o cdigo de forma que o novo mtodo main contenha apenas um comando, como segue: public static void main(String[] args) { JOptionPane.showMessageDialog(null, frase(), "Planejamento financeiro", JOptionPane.CLOSED_OPTION); } public static String frase() { double i = ler("Qual o valor investido? ", 1000f); double c = ler("Qual o complemento mensal? ", 0f); double o = ler("Qual o objetivo? ", 1000000f); return String.format("O tempo para um investimento de R$ %,.2f\n" + "com aplicacoes mensais de R$ %,.2f atingir R$ %,.2f " + "seria:\n\n" + tempo("na Poupanca", .55, 0, i,c,o) + tempo("no CDB", .75, 0, i,c,o) + tempo("em Letras do Tesouro Nacional", 1.1, 0,i,c,o) + tempo("em Fundos Multimercado", 1.5, 1, i,c,o),i,c,o); } public static String tempo(String s, double juros, double taxa, double saldo, double complemento, double objetivo) {...

Atividade 2 Sobrecarga de mtodos


Como demonstrado na atividade anterior, os mtodos podem ser sobrecarregados para lidar com tipos diferentes de entrada e sada. Podemos implementar classes com o propsito de oferecer ferramentas reutilizveis para tratamento da informao de um dado tipo, ou que aceitem parmetros distintos. O cdigo a seguir introduz uma subclasse embutida que prope operar um determinado tipo de objeto. Lembre-se que a classe principal (cujo nome o mesmo do arquivo) sempre contm o mtodo main.

a) Note que houve um erro ao utilizar valores de ponto flutuante. Isso ocorre porque o Java considera valores de dupla preciso como padro. Uma soluo acrescentar um f no final do nmero, indicando que este do tipo float. b) Modifique a classe Cubo para que opere com double. c) Crie um mtodo para testar a isometria do cubo, retornando true se as laterais do cubo forem iguais. d) Crie um mtodo que retorne a rea de superfcie do cubo.

3. Exerccios para Casa 3.1. Construa uma subclasse que receba um valor raio, que pode ser passado por byte, int, long,
float ou double. Crie mtodos distintos para retornar (em double): a) o permetro da circunferncia; b) a rea do circulo; c) o volume da esfera;

3.3. Crie uma classe Temperatura que receba uma temperatura em graus Celsius, Fahrenheit e Kelvin atravs dos mtodos celsius(t), kelvin(t) e fahrenheit(t) (sobrecarregados) em qualquer formato (byte, int, long, float ou double) realizando as converses necessrias. Um mtodo
toString() deve retornar uma String no seguinte formato: "%f C = %f F = % K".

Dados: (Fahrenheit) = 1.8*(Celsius) + 32; (Kelvin) = (Celsius) + 273.15;

Você também pode gostar