39
propósitos gerais particionar a resolução de um problema distribuir o serviço de programação reutilizar módulos já construídos facilitar o trabalho de manutenção Modularização Modularização Sub-programas Sub-programas Métodos auxiliares Métodos auxiliares 1 LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da Computação Ciência da Computação

LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Embed Size (px)

Citation preview

Page 1: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

propósitos gerais•particionar a resolução de um problema

•distribuir o serviço de programação

•reutilizar módulos já construídos

•facilitar o trabalho de manutenção

Modularização Modularização

Sub-programas Sub-programas

Métodos auxiliaresMétodos auxiliares

1

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 2: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

AbstraçãoAbstraçãoa construção de subprogramas é o recurso disponível para elaborar-se a abstração de processos.

em Java: métodos auxiliares

2

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 3: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Considere o seguinte problema:“Conhecendo-se numerador e denominador de duas frações, como obter o numerador e o denominador da fração irredutível resultado da adição dessas frações?”

A resolução pode ser representada pelo seguinte esboço de algoritmo:

entrar a primeira fração (n1 e d1);entrar a segunda fração (n2 e d2);somar as duas frações (calcular numerador da soma (n=n1*d2+n2*d1) e calcular denominador da soma (d=d1*d2));simplificar a fração somaexibir o resultado (n e d)

Nesse exemplo de esboço são apresentadas algumas abstrações de processos:

entrar a fração, simplificar a fração 3

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 4: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

No tratamento de problemas mais complexos, onde seja exigido um método de resolução mais longo, torna-se interessante estabelecer etapas menores e mais simples no método de resolução para depois, com a composição dessas etapas menores, alcançar a resolução do problema.

Nos algoritmos essas etapas menores são traduzidas por sub-algoritmos ou módulos auxiliares, nos programas em Java são os métodos auxiliares.

A articulação adequada entre módulo principal e módulos auxiliares define o método de resolução do problema.

Cada módulo auxiliar tem a sua finalidade específica e será acionado a partir do módulo principal ou de outro módulo auxiliar, quando for necessária a sua ação.

4

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

ObservaçõesObservações

Page 5: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Cada subprograma é uma unidade de programação que contêm uma seqüência de instruções que, se for executada, cumpre algum objetivo bem específico e determinado.

Essa unidade de programação pode ser utilizada (ou reutilizada) ao ser acionada por um programa ou por outro subprograma.

O emprego de subprogramas produz vantagens em termos de tempo de codificação, organização do programa e facilidade de manutenção.

5

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

ObservaçõesObservações

Page 6: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Uma definição de subprograma é composta pelo identificador desse subprograma, pela indicação de seus parâmetros, que constituem a forma de comunicação entre essa unidade de programação e o restante do programa (interface), e pela descrição das ações (corpo do subprograma) que devem ser executadas para que esse subprograma cumpra o seu objetivo.

Uma chamada ao subprograma ativa (aciona) essas ações;é a solicitação explícita para executar o subprograma.

Em geral, os subprogramas podem definir suas próprias variáveis locais, cujo acesso é restrito ao próprio subprograma onde são definidas (ambiente de referência local).

6

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

ObservaçõesObservações

Page 7: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

De forma geral, os subprogramas são classificados em duas categorias: função ou procedimento. Na linguagem Java, um método auxiliar pode fazer o papel de uma função ou de um procedimento.

Um procedimento representa um conjunto de instruções que define uma computação parametrizada, ou seja: um procedimento contêm a descrição parametrizada de um mecanismo de ação.

Ao acionar um procedimento, o sistema elabora uma associação entre os parâmetros formais (utilizados na descrição do procedimento) com os parâmetros reais, especificados na instrução de chamada. Dessa associação resultam os efeitos das ações descritas no procedimento sobre os parâmetros reais.

7

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

ObservaçõesObservações

Page 8: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Uma função segue o modelo de funções matemáticas.

Assim, um subprograma do tipo função não deve, ao ser acionado, alterar qualquer um dos parâmetros reais incluídos na respectiva instrução de chamada.

O efeito da execução de uma função deve ser exclusivamente o retorno de um dado, ou seja: cada vez que uma função for acionada, ao final de sua execução, ocorre o retorno de um dado que efetivamente substitui a respectiva ordem de chamada.

8

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

ObservaçõesObservações

Page 9: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

A construção/implementação de uma função equivale a um acréscimo no repertório dos operadores já disponíveis na linguagem (operadores pré-definidos) - uma função é a abstração de uma operação.

A construção/implementação de um procedimento equivale a um acréscimo no repertório de comandos oferecidos pela linguagem - um procedimento é a abstração de um controle ou uma série de comandos.

9

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

ObservaçõesObservações

Page 10: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

• o módulo “chamador” aciona o módulo auxiliar - nesse momento a execução do módulo “chamador” é suspensa;

• o módulo auxiliar passa a ser executado;

• ao final da execução do módulo auxiliar, a execução do módulo “chamador” é retomada, a partir do ponto onde foi acionado o módulo auxiliar.

mecanismo de funcionamento

10

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 11: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

• no momento em que o módulo “chamador” aciona o módulo auxiliar , pode ocorrer o “trânsito” de dados do módulo “chamador” para o módulo auxiliar;

• ao final da execução do módulo auxiliar, quando a execução do módulo “chamador” é retomada, pode ocorrer o “trânsito” de dados do módulo auxiliar para o módulo “chamador”;

• esse “trânsito” de dados é estabelecido por meio de parâmetros.

mecanismo de funcionamento

11

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 12: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

mecanismo de funcionamento

principalauxiliar A

auxiliar B

auxiliar C

chamada ao auxiliar A

chamada ao auxiliar B

chamada ao auxiliar C

início

fim

12

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Observação:O processo dado por um programa Java se inicia sempre com a execução do método main( ).

Page 13: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Passagem de parâmetrosHá três modelos semânticos fundamentais de passagem de parâmetros:

modo entrada (in mode)modo saída (out mode)modo entrada-saída (in-out mode)

unidade chamadora módulo auxiliarmodo entrada

entrada-saída

modo saída

13

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 14: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Passagem de parâmetrosunidade chamadora módulo auxiliar

na ordem de chamada, são especificados os parâmetros reais

no módulo auxiliar, são especificados os parâmetros formais

14

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 15: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

modo entrada (in mode)o parâmetro formal pode receber o dado do parâmetro real.

unidade chamadora módulo auxiliarmodo entrada

modo saída (out mode)o parâmetro formal pode transmitir o dado ao parâmetro real.

unidade chamadoramodo saída

modo entrada-saída (in-out mode)o parâmetro formal pode receber ou transmitir o dado.

unidade chamadoraentrada-saída

módulo auxiliar

módulo auxiliar

Passagem de parâmetros

15

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 16: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Passagem por valor modo entrada

16

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

O valor do parâmetro real é enviado ao módulo auxiliar para inicializar o parâmetro formal que se configura como uma variável local ao subprograma.Nessa situação, o parâmetro real pode ser uma expressão cujo valor ou resultado será transmitido ao subprograma, inicializando o parâmetro formal correspondente.

Page 17: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Passagem por resultado modo saída

17

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

O parâmetro formal, que se configura como uma variável local ao subprograma, tem o seu conteúdo transmitido ao parâmetro real imediatamente antes da execução (do subprograma) ser encerrada.Nessa situação, o parâmetro real deve ser uma variável cujo conteúdo será redefinido como efeito da execução do subprograma.

Page 18: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Passagem por referência modo entrada-saída

18

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Neste modelo não ocorre transmissão de valores entre parâmetro real e parâmetro formal. A unidade chamadora transmite ao subprograma um caminho de acesso – uma variável de referência - ao parâmetro real que passa a ser partilhado pelo subprograma, ou seja: as referências, no corpo do subprograma, feitas ao parâmetro formal, efetivamente são referências ao parâmetro real. Assim, qualquer operação de redefinição de conteúdo do parâmetro formal resulta, efetivamente, em redefinição do conteúdo do parâmetro real.Nessa situação, o parâmetro real deve ser uma variável (em Java uma variável de tipo referenciado) cujo conteúdo será redefinido como efeito da execução do subprograma.

Page 19: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Passagem por referência modo entrada-saída

19

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

nome do parâmetro realnome do parâmetro formal

os nomes dos parâmetros (real e formal)são aliases, identificam a mesma variável.

toda alteração feita no parâmetro formal reflete-se no parâmetro realporque a posição de memória, referida pelo endereço, é a mesma.

endereço

conteúdo

Page 20: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Em Java, a passagem de parâmetros de tipos primitivos (int, char, float, double, ... ) é sempre por valor.

Quando há a necessidade de se ter como efeito da execução de um método em Java, uma redefinição do conteúdo de uma variável da unidade chamadora, essa unidade chamadora deve fornecer (como valor) o conteúdo de uma variável de referência (um vetor ou um objeto definido por uma classe) e o método acionado deve possuir, em correspondência, um parâmetro formal com o mesmo tipo da variável do método chamador colocada como parâmetro real, e assim fazer referência ao objeto que deve sofrer a modificação.

Quando um vetor é colocado como parâmetro real na chamada a uma função (método), o valor passado à função (método) é o endereço (valor da referência) desse vetor. A partir desse endereço e aplicando aritmética da indexação, a função (método) poderá manipular os componentes daquele vetor.

20

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 21: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

novamente vamos considerar o problema:“Conhecendo-se numerador e denominador de duas frações, como obter o numerador e o denominador da fração irredutível resultado da adição dessas frações?”

esboço de método de resolução: entrar a primeira fração (n1 e d1); entrar a segunda fração (n2 e d2); calcular numerador da soma (n=n1*d2+n2*d1); calcular denominador da soma (d=d1*d2); simplificar a fração soma exibir o resultado (n e d)

vamos desenvolver o método de resolução elaborandoo módulo principal e três módulos auxiliares:

primeiro: realizar a entrada de uma fração segundo: realizar a simplificação de uma fração terceiro: realizar o cálculo do mdc(x,y)

obs: na operação de simplificação é necessário obter o máximo divisor comum do numerador e denominador. 21

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

primeiro exemplo:

Page 22: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

métodos auxiliares

22

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

void entraFracao(Fracao f){f.num=Integer.parseInt(JOptionPane.showInputDialog("digite o numerador : "));f.den=Integer.parseInt(JOptionPane.showInputDialog("digite o denominador: "));

} int mdc(int a, int b){

int resto;resto=a%b;while(resto>0){

a=b; b=resto;resto=a%b;

} return(b); } void simplificaFracao(Fracao f){

int md;md=mdc(f.num, f.den);f.num=f.num/md;f.den=f.den/md;

}

class Fracao{int num, den;

}void indica que o método não retorna valor diretamente

void indica que o método não retorna valor diretamente

int indica que o método retorna um valor int

Page 23: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

método executar( )

23

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

void executar( ){Fracao fr1, fr2, frsoma;fr1=new Fracao();fr2=new Fracao();frsoma=new Fracao();entraFracao(fr1);entraFracao(fr2);frsoma.num=fr1.num*fr2.den+fr1.den*fr2.num;frsoma.den=fr1.den*fr2.den;JOptionPane.showMessageDialog(null,"fracao soma: "+frsoma.num+" / "+frsoma.den);simplificaFracao(frsoma);JOptionPane.showMessageDialog(null,"soma simplificada: "+frsoma.num+" / "+frsoma.den);

}

Page 24: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

24

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

import javax.swing.JOptionPane;class Aplicacao{ class Fracao{ int num, den; } void entraFracao(Fracao f){ f.num=Integer.parseInt(JOptionPane.showInputDialog("digite o numerador : ")); f.den=Integer.parseInt(JOptionPane.showInputDialog("digite o denominador: ")); } int mdc(int a, int b){

int resto;resto=a%b;while(resto>0){

a=b; b=resto;resto=a%b;

} return(b); } void simplificaFracao(Fracao f){

int md;md=mdc(f.num, f.den);f.num=f.num/md;f.den=f.den/md;

} void executar( ){

Fracao fr1, fr2, frsoma;fr1=new Fracao();fr2=new Fracao();frsoma=new Fracao();entraFracao(fr1);entraFracao(fr2);frsoma.num=fr1.num*fr2.den+fr1.den*fr2.num;frsoma.den=fr1.den*fr2.den;JOptionPane.showMessageDialog(null,"fracao soma: "+frsoma.num+" / "+frsoma.den);simplificaFracao(frsoma);JOptionPane.showMessageDialog(null,"soma simplificada: "+frsoma.num+" / "+frsoma.den);

}}

código da classe Aplicacao

Page 25: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

25

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Outra abordagem:

É possível uma abordagem alternativa para a construção desse programa:na classe Fracao, além de especificar os campos correspondentes a numerador e denominador de uma fração (int num, den; que são os atributos de uma fração), pode-se definir na própria classe, as operações relativas a uma fração, neste caso as operações de entrada, saída, simplificação e adição. Dessa forma o programa ficará composto por três classes: Principal, Aplicacao e Fracao, veja a construção na próxima tela.Observe que na classe Fracao, as “operações” atuam diretamente sobre os campos num e den.

Page 26: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

26

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

class Aplicacao{ void executar( ){ Fracao fr1, fr2, frs; fr1=new Fracao(); fr2=new Fracao(); frs=new Fracao(); fr1.entraFracao(); fr2.entraFracao(); frs.somaFracao(fr1,fr2); frs.mostraFracao("fracao soma: "); frs.simplificaFracao(); frs.mostraFracao("soma simplificada: "); }}

public class Principal { public static void main(String[] args ){ Aplicacao ap=new Aplicacao( ); ap.executar( ); } }

import javax.swing.JOptionPane;class Fracao{ int num, den; void entraFracao( ){ num=Integer.parseInt(JOptionPane.showInputDialog("digite o numerador : ")); den=Integer.parseInt(JOptionPane.showInputDialog("digite o denominador: ")); } int mdc(int a, int b){ int resto; resto=a%b; while(resto>0){ a=b; b=resto; resto=a%b; } return(b); } void simplificaFracao(){ int md; md=mdc(num, den); num=num/md; den=den/md; } void somaFracao(Fracao f1, Fracao f2){ num=f1.num*f2.den+f1.den*f2.num; den=f1.den*f2.den; } void mostraFracao(String mensagem){

JOptionPane.showMessageDialog(null,mensagem+" "+num+" / "+den); }}

Page 27: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Considere o seguinte problema:“Durante um curso, o aluno realiza três atividades de avaliação e sua nota final é obtida como média ponderada entre a menor e a maior das três notas obtidas, com pesos 3 e 7 respectivamente. Conhecendo-se as três notas parciais (valores reais) obtidas por um aluno, como determinar sua nota final?”

Veja na próxima tela a constituição de um método auxiliar que tem como parâmetros de entrada três valores reais e como parâmetro de saída, o maior desses três valores.(linha de declaração do método: float maior(float a, float b, float c) )

Construa outro método auxiliar, semelhante ao primeiro, para obter o menor dos três valores. float menor(float a, float b, float c)

Construa o método executar( ) onde deve-se ter:a entrada das três notas;a ordem de chamada ao primeiro módulo auxiliar (obter a maior);a ordem de chamada ao segundo módulo auxiliar (obter a menor);o cálculo da média;a saída da média.

27

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 28: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

float maior(float a, float b, float c){ float maior; maior=a; if(b>maior) maior=b; if(c>maior) maior=c; return(maior);}

28

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

parâmetros de entradatipo do valor retornado

nome do método auxiliar

variável local

Page 29: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Considere novamente o problema:“Durante um curso, o aluno realiza três atividades de avaliação e sua nota final é obtida como média ponderada entre a menor e a maior das três notas obtidas, com pesos 3 e 7 respectivamente. Conhecendo-se as três notas parciais (valores reais) obtidas por um aluno, como determinar sua nota final?”

Considere a seguinte declaração para a classe Notas:class Notas{ float n1, n2, n3;}

Construa um método auxiliar que tenha como único parâmetro um registro do tipo Notas (três valores reais), de tal forma que esse método “receba” as três notas e “devolva-as” em ordem crescente (passagem por referência).

void classifica(Notas x)

Construa o método executar( ) onde deve-se ter: a entrada das três notas (os três campos de um registro Notas) ; a ordem de chamada ao método classifica( )

(dispor em ordem crescente as três notas); o cálculo da média; a saída da média.

29

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 30: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Considere novamente o problema:“Durante um curso, o aluno realiza três atividades de avaliação e sua nota final é obtida como média ponderada entre a menor e a maior das três notas obtidas, com pesos 3 e 7 respectivamente. Conhecendo-se as três notas parciais (valores reais) obtidas por um aluno, como determinar sua nota final?”

Modifique a construção do programa anterior de forma a dispor na classe Notas, além dos atributos n1, n2 e n3, os métodos para tratamento dos mesmos:

um método para realizar a entrada das três notasvoid entraNotas( ) e

um método para realizar a classificação (ordem crescente) das três notasvoid classificaNotas( ).

A classe Notas, com essa modificação, deve ser separada da classe Aplicacao onde deve ser construído apenas o método executar( ).

(veja a constituição do programa da tela 26) .

30

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 31: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Problema proposto Um número é perfeitoperfeito se a soma de todos os seus divisores, exceto ele mesmo, é igual ao próprio número. Por exemplo, o número 6 é perfeitoperfeito porque 1 + 2 + 3 = 6.

Um número é abundanteabundante se a soma de todos os seus divisores, exceto ele mesmo, é maior do que o próprio número. Por exemplo, o número 12 é abundanteabundante porque 1 + 2 + 3 + 4 + 6 = 16.

Um número é deficientedeficiente se a soma de todos os seus divisores, exceto ele mesmo, é menor do que o próprio número. Por exemplo, o número 10 é deficientedeficiente porque 1 + 2 + 5 = 8.

Construa um programa que faça a classificação (perfeito, abundante, deficiente) de cada um dos valores: 2, 3, 4, ... , 30 .Utilize o método auxiliar para obter a soma dos divisores próprios de um inteiro:

int somaDivisores(int x){ int soma, d; soma=1; for(d=2; d<=x/2; d=d+1) if(x%d==0) soma=soma+d; return(soma);}

31

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 32: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Problema proposto

Dois números inteiros são amigosamigos se a soma dos divisores próprios do primeiro for igual ao segundo e a soma dos divisores próprios do segundo for igual ao primeiro.

Conhecendo-se um valor inteiro positivo como verificar se tal valor é perfeitoperfeito e, se não for perfeitoperfeito, se possui ou não um número amigoamigo? Exibir como resultado uma mensagem indicativa e, se for o caso, exibir o valor amigoamigo.

Reutilize o método auxiliar (tela anterior) para obter a soma dos divisores próprios de um inteiro.

32

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 33: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Problema proposto

Implemente um programa em Java que leia dia, mês e ano (uma data)e calcule e imprima a quantidade de dias que faltam até o fim do ano. Considerar dia, mês e ano como valores inteiros correspondentes a uma data válida.O método executar( )executar( ) deve utilizar dois métodos auxiliares para resolver o problema:

método diasNoMes( int m, int a )diasNoMes( int m, int a ) que calcula e retorna a quantidade de dias no mês mm.

método diasFimAno( int d, int m, int a )diasFimAno( int d, int m, int a ) que calcula e retorna a quantidade de dias transcorridos desde a data (parâmetro de entrada) até o fim do ano dessa data.

continua>>>

33

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 34: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

O primeiro desses módulo auxiliares está pronto:

int diasNoMes(int m, int a){ int qdias; switch(m){ case 2: if( (a%4==0 && a%100!=0) || (a%400==0) ) qdias=29; else qdias=28; break; case 4: case 6: case 9: case 11: qdias=30; break; default: qdias=31; } return(qdias);}

continua>>>

34

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 35: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Complete o segundo método (abaixo) e construa o método executar( ).

int diasFimAno(int d, int m, int a){ int qdias, mesvar; qdias = diasNoMes(m,a)- d + 1; for( mesvar = m+1; mesvar <13; mesvar=mesvar+1){

qdias = qdias+ ???????? ; }

return(????????); }

35

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 36: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

Considere os seguintes métodos auxiliares:

void lerVetor( float v[ ], int tv[ ] ) { float temp; tv[0] = -1; int conta = 1; temp=Float.parseFloat(JOptionPane.showInputDialog( "digite o componente "+conta+" ou -999 para encerrar")); while( temp != -999 && conta <= 20 ) { tv[0]=tv[0]+1; conta=conta+1; v[ tv[0] ] = temp; temp=Float.parseFloat(JOptionPane.showInputDialog( "digite o componente "+conta+" ou -999 para encerrar")); } tv[0]=tv[0]+1; // Define a quantidade de componentes do vetor}void exibirVetor( float v[ ], int tv ) { int k; String saida=””; for( k = 0; k < tv; k++ ) { saida=saida+"\n "+ (k+1) + "o. componente: " + v[ k ] ; } JOptionPane.showMessageDialog(null,saida);}

36

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Page 37: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

// Ordenação pelo método da Bolhavoid ordenarVetor( float v[ ], int tv ) { int conta, j, t = tv-1; float temp; for( conta = 1; conta < tv; conta++ ) { for( j = 0; j < t; j++ ) { if( v[j] > v[j+1] ) { temp = v[j]; v[j] = v[j+1]; v[j+1] = temp; } } t = t-1; }}

37

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

Implemente um programa Java (com a utilização desses três métodos auxiliares) para fazer a “entrada” de um vetor de valores float e a “saída” de tal vetor antes e depois de ter colocado os componentes em ordem crescente.

Veja as observações na próxima página.

Page 38: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

38

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

O método lerVetor( ) realiza a leitura dos elementos de um vetor com componentes de tipo float com um número qualquer de componentes não superior a 20. Utiliza o valor -999 como sentinela.

O primeiro parâmetro formal do método lerVetor( ) - float v[] - corresponde ao vetor cujo conteúdo será definido a partir da execução desse método. Esse parâmetro receberá o endereço da primeira posição do vetor colocado como parâmetro real na ordem de chamada a esse método. O conteúdo do vetor v[] não é efetivamente transmitido de ou para o métodolerVetor( ), pois a passagem é por referência. O segundo parâmetro int tv[] representa o número de elementos do vetor. A passagem, neste caso, também é por referência.

No método executar( ) o vetor é um dos parâmetros reais e deve ser dimensionado com tamanho 20. O segundo parâmetro é um vetor de tamanho 1 porque este é um artifício utilizado, no sistema de linguagem Java, para simular a passagem por referência de um parâmetro de tipo primitivo (int).O método ordenarVetor( ) implementa o algoritmo da bolha (bubble sort) para colocar em ordem não decrescente uma seqüência de números reais.O método executar( ) deverá acionar os métodos lerVetor( ), ordenarVetor( ) e exibirVetor( ). No método executar( ) serão utilizadas essas três abstrações de processos.

Page 39: LP2 Laboratório de Programação 2 - pucsp.brjarakaki/lp2/LP2_modulo5.pdf · entrar a fração, simplificar a fração 3 LP2 Laboratório de Programação 2 Ciência da Computação

39

LP2 Laboratório de Programação 2 LP2 Laboratório de Programação 2 Ciência da ComputaçãoCiência da Computação

problema proposto

Dado um vetor de números reais, determinar e exibir o valor de seu maior componente e a posição de sua primeira ocorrência. Construa e utilize um método auxiliar com a seguinte declaração:

void maiorComponente( float v[ ], Maior m )

onde o “tipo” Maior será definido pela classe

class Maior{ float valor; int posic;}

o campo valor deverá corresponder ao valor do maior componente e o campo posic à posição de sua primeira ocorrência.

Utilize o método lerVetor( ) apresentado no problema anterior.