lp2 laboratório de programação 2 - pucsp.brjarakaki/lp2/lp2_modulo5.pdf · entrar a fração,...
TRANSCRIPT
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
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
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
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
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
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
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
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
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
• 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
• 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
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( ).
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
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
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
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.
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.
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.
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
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
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:
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
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);
}
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
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.
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); }}
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
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
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
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
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
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
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
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
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
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
// 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.
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.
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.