View
244
Download
0
Category
Preview:
Citation preview
7/22/2019 Ex2 Poo Ufmg
1/18
Universidade Federal de Minas GeraisInstituto de Cincias ExatasDepartamento de Cincia da ComputaoProgramao Modular e Orientao a Objetos
Lista de Exerccio 02Classes e objetos
Aluno : Esdras Vitor Silva Pinto
1. Introduo
No paradigma da programao orientada a objetos, as classes definem um tipoabstrato de dados. Uma instncia particular de uma classe constitui um objeto.As classes so compostas por variveis de instncias, construtores e mtodos.As variveis de instncia armazenam os atributos do objeto. Os construtores
tm a funo de realizar a inicializao do objeto recm-criado. Atravs dosmtodos que as caractersticas do objeto so lidas, alteradas ou processadaspara gerar um novo dado referente ao objeto. Nesta aula prtica, estuda-se aimplementao de uma classe bem como a instanciao de um objeto emJava.
2. Objetivos
Realizar alteraes em uma classe previamente projetada, projetar e criar uma
nova classe e instanciar objetos em Java.
3. Parte Prtica3.1. Desafio 1
3.1.1. Diagrama de classes
Uma classe pode ser representada atravs de um diagrama de classes. Parauma classe chamada Circle, que rene as caractersticas comuns a todos oscrculos, o seu projeto pode ser representado pelo seguinte diagrama declasses:
Figura 1: Diagrama de classes da classe Circle
7/22/2019 Ex2 Poo Ufmg
2/18
Com base neste diagrama, podemos retirar as seguintes concluses:
i) A classe Circle possui trs variveis de instncias acessveis apenaspor mtodos da prpria classe, uma vez que seu tipo de acesso definido como private (o sinal de - que antecede uma varivel ouum mtodo indica que esta varivel ou mtodo so de acesso
privado).ii) A classe Circle possui trs construtores : Circle(), que cria um objetocom as definies padres mostradas no diagrama, Circle(radius :double), que cria um objeto cujo valor do raio fornecido porparmetro, e Circle(radius: double, color : String), que cria um objetocom o valor de raio e cor passados por parmetro.
iii) A classe Circle possui oito mtodos. Os mtodos getRadius(),getArea(), getColor() e getLength() fornecem o valor do raio, rea,cor e comprimento do objeto, respectivamente. Esses mtodos, porapenas retornar os valores das variveis de instncias ou utiliza-laspara obter outro dado referente ao objeto, so chamados de mtodosde acesso. Os mtodos setRadius(radius : double) e setColor(color :String) modificam o valor das variveis de instncias radius e color,respectivamente. Esses mtodos, por modificar as variveis deinstncia, so chamados de mtodos modificadores. O mtodotoString() fornece uma breve descrio do objeto. Todos essesmtodos descritos anteriormente podem ser acessados de outraclasse, j que o tipo de acesso desses mtodos definido comopublic (o sinal de + que antecede uma varivel ou um mtodo indicia
que esta varivel ou mtodo so de acesso pblico). O ultimomtodo, chamado calcLength(), um mtodo privado, usado paracalcular o comprimento do crculo.
3.1.2. Cdigo fonte das classes Circle e TestCircle
O cdigo referente classe Circle na linguagem Java mostrado a seguir.
publicclassCircle {// variveis de instancia privadas, isto , no acessveis de fora desta classe.privatedoubleradius= 1.0; // Armazena o raio do crculoprivateString color= "red"; // Armazena a cor do crculoprivatedoublelength; // Armazena o comprimento do crculo
// primeiro construtor o qual atribui valores iniciais a ambos: radius e color.publicCircle(){
this.color= "red";this.radius= 1.0;calcLength();
}
// Segundo construtor que inicia radius com o parmetro recebido, e matem color com
// o valor padro definido.publicCircle(doubleradius){
this.radius= radius; // cria o objeto com o primeiro construtor:.Circle()this.color= "red";
7/22/2019 Ex2 Poo Ufmg
3/18
calcLength();}
// Terceiro construtor que inicia radius e color com os parmetos recebidospublicCircle(doubleradius, String color){
this.radius= radius;this.color= color;
calcLength();}
// Metodo de acesso para obter o valor armazenado em radiuspublicdoublegetRadius(){
return(this.radius);}
// Metodo de acesso para computar a rea de um circulo.publicdoublegetArea() {
return(this.radius)*(this.radius)*Math.PI; // PI a constante .
//Math a classe onde PI definido .}
// metodo Get para a varivel de instancia colorpublicString getColor(){
return(this.color);}
// mtodo Get para a varivel de instancia lengthpublicdoublegetLength(){
return(this.length);}
// metodo Set para a varivel de instancia radiuspublicvoidsetRadius(doubleradius){
this.radius= radius;calcLength();
}
// metdodo Set para a varivel de instancia colorpublicvoidsetColor(String color){
this.color= color;}
// Mtodo para o clculo do comprimento do crculoprivatevoidcalcLength(){
this.length= 2*(Math.PI)*(this.radius);}
// Mtodo toStringpublicString toString(){
return"Circulo: raio = "+ radius+ " cor = "+ color;
}}
Figura 2: Cdigo fonte em Java da classe Circle
7/22/2019 Ex2 Poo Ufmg
4/18
A classe Circle no possui o mtodo main() e, portanto, no pode serexecutada. Para utilizar esta classe, necessrio criar uma nova classe quepossua o mtodo main(). Nessa nova classe que sero instanciados osobjetos da classe Circle. A seguir mostrado o cdigo fonte em Java de umaclasse chamada TesteCircle que instancia objetos da classe Circle.
publicclassTestCircle {
publicstaticvoidmain(String[] args) {
// Declara c1 como varivel habilitada a armazenar uma referencia para objeto da// classe Circle.Circle c1;
// atribui a c1 a referencia retornada pelo construtor padro Circle ()c1 = newCircle();
// Para invocar os metodos classe Circle para operar sobre a instncia c1,// usa-se o operador ponto (.).
//Em outras palavras: usa-se o ponto para enviar uma mensagem ao objeto c1 para que// ele execute um de seus mtodos.System.out.println( "O circulo c1 tem o raio de "+ c1.getRadius()+ " e area de "+ c1.getArea());
// Declara e aloca uma segunda instancia da classe Circle chamada c2// com o valor do radius igual a 2.0 e color com valor padro.Circle c2 = newCircle(2.0);
// Para invocar os metodos a operar sobre a instncia c2, usa-se o operador ponto(.)
System.out.println( "O circulo c2 tem raio de "+ c2.getRadius()+ " e area de "+ c2.getArea() );
// Declara e aloca uma terceira instancia da classe Circle chamada c3// com o valor do radius igual a 3.0 e color igual a "blue".Circle c3 = newCircle(3.0,"blue");
// Exibe o radio e a cor do circulo c3System.out.println( "O circulo c3 tem raio de "+ c3.getRadius()+ " e area de "+ c3.getArea() );
// Exibe as cores dos circulos c1,c2 e c3System.out.println("The circle c1 is "+ c1.getColor());System.out.println("The circle c2 is "+ c2.getColor());
System.out.println("The circle c3 is "+ c3.getColor());
// Teste de acesso varivel de instancia da classe Circle// c1.radius = 5.0;
// Instancia um objeto da classe CircleCircle c4 = newCircle(4.0,"Green");
// Exibe o raio, rea e cor do circulo c4System.out.println( "O circulo c4 tem raio de "+ c4.getRadius()+ " e area de "+ c4.getArea() + " e cor "+ c4.getColor());
// Modifica as variveis de instancia do circulo c4 atravs dos modificadores
// setRadius e setColorc4.setRadius(6.0); // Altera o raio do circulo c4 para 6.0c4.setColor("White"); // Altera a cor do circulo c4 para "White"
7/22/2019 Ex2 Poo Ufmg
5/18
// Exibe os novos valores de raio, rea e cor do circulo c4System.out.println( "O circulo c4 tem raio de "+ c4.getRadius()+ " e area de "+ c4.getArea() + " e cor "+ c4.getColor());
c1.setRadius(5.0);c2.setRadius(1.2);
// Chama o mtodo toString() do circulo c1 explicitamente
System.out.println(c1.toString());
// Chama o mtodo toString() do circulo c2 explicitamenteSystem.out.println(c2.toString());
// Chama o mtodo toString implicitamente no mtodo println()System.out.println(c2);
// Chama o mtodo toString implicitamente utilizando o operador '+'System.out.println("Operador '+' tambm chama toString implicitamente : "+ c2);
}
}
Figura 3: Cdigo fonte em Java da classe TesteCicle
3.1.3. Anlise do cdigo das classes Circle e TestCircle
Para instanciar um objeto em Java, preciso criar uma referencia e alocarmemria para o objeto. No trecho mostrado a seguir, inicialmente cria-se umareferncia para o objeto c1 e, em seguida, utilizando o operador new, aloca-sememria para o objeto c1. importante ressaltar que aps o operador newdeve-se chamar um dos construtores da classe. Esse construtor ser
responsvel por criar o objeto.
Circle c1;// atribui a c1 a referencia retornada pelo construtor padro Circle()c1 = newCircle();
Figura 4: Trecho do cdigo da classe TestCircle no qual o objeto c1 instanciado
No caso do objeto c1 acima, o construtor padro foi utilizado para a suacriao. Logo, c1 foi criado com os valores padres definido na classe Circle. Oobjeto c2 foi criado utilizando o construtor Circle(radius: double), conformesegue:
// Declara e aloca uma segunda instancia da classe Circle chamada c2// com o valor do radius igual a 2.0 e color com valor padro.Circle c2 = newCircle(2.0);
Figura 5: Trecho do cdigo da classe TestCircle no qual o objeto c2 instanciado
Desta forma, o raio do circulo c2 iniciado com 2.0, ao invs de 1.0 (valorpadro). Para utilizar um mtodo de um objeto, basta escrever o nome doobjeto, colocar ponto no final, e escrever o nome do mtodo. Por exemplo, notrecho a seguir utilizado os mtodos getRadius() e getArea dos objetos c1 ec2.
7/22/2019 Ex2 Poo Ufmg
6/18
System.out.println( "O circulo c1 tem o raio de "+ c1.getRadius()+ " e area de "+ c1.getArea());
System.out.println( "O circulo c2 tem raio de "+ c2.getRadius()+ " e area de "+ c2.getArea() );
Figura 6: Trecho do cdigo da classe TestCircle no qual se exibe o raio e a rea dos objetos c1 e c2
A execuo deste ultimo trecho nos fornece o seguinte resultado:
Console:O circulo c1 tem o raio de 1.0 e area de 3.141592653589793O circulo c2 tem raio de 2.0 e area de 12.566370614359172
A classe Circle possui ainda o construtor Circle(radius: double, color : String),que cria um objeto com os valores de raio e cor passados por parmetro. Aseguir, mostrado a criao de um objeto c3 com este construtor.
// Declara e aloca uma terceira instancia da classe Circle chamada c3// com o valor do radius igual a 3.0 e color igual a "blue".
Circle c3 = newCircle(3.0,"blue");
// Exibe o radio e a cor do circulo c3System.out.println( "O circulo c3 tem raio de "+ c3.getRadius()
+ " e area de "+ c3.getArea() );
Console : O circulo c3 tem raio de 3.0 e area de 28.274333882308138Figura 7: Trecho do cdigo da classe TestCircle no qual o objeto c3 instanciado
Para exibir as cores dos crculos, pode-se utilizar o mtodo getColor(),conforme mostrado a seguir.
// Exibe as cores dos circulos c1,c2 e c3System.out.println("The circle c1 is "+ c1.getColor());System.out.println("The circle c2 is "+ c2.getColor());System.out.println("The circle c3 is "+ c3.getColor());
Console : The circle c1 is redThe circle c2 is redThe circle c3 is blue
Figura 8: : Trecho do cdigo da classe TestCircle no qual utilizado o mtodo getColor() da classe Circle
Uma caracterstica muito importante das classes a de permitir encapsulaode dados e mtodos. Desta forma, os atributos ou mtodos que possuem tipode acesso privado, no podem ser acessados de outra classe. Para ilustraressa restrio de acesso, considere o trecho a seguir no qual se tenta atribuirum valor varivel radius do objeto c1 dentro da classe TestCircle.
// Teste de acesso varivel de instancia da classe Circle, dentro// da classe TestCirclec1.radius = 5.0;
Figura 9: Trecho do cdigo da classe TestCircle onde tenta-se acessar diretamente o atributo radius do objeto c1
Ao executar o programa, tem-se o seguinte resultado:
7/22/2019 Ex2 Poo Ufmg
7/18
A mensagem de exceo acima diz que a varivel radius no visvel naclasse TestCircle. Assim, no possvel modificar o valor de radiusdiretamente; preciso utilizar um mtodo para realizar esta tarefa.
Muitas vezes necessrio alterar os atributos de um objeto. Para isto, utiliza-seos mtodos modificadores. No caso da classe Circle, o valor de radius e color
podem ser modificados por meio dos mtodos setRadius() e setColor(),respectivamente. A seguir, tem-se um trecho mostrando a utilizao destesdois mtodos.
// Modifica as variveis de instancia do circulo c4 atravs// dos modificadoresc4.setRadius(6.0); // Altera o raio do circulo c4 para 6.0c4.setColor("branco"); // Altera a cor do circulo c4 para "branco"
// Exibe os novos valores de raio, rea e cor do circulo c4System.out.println( "O circulo c4 tem raio de "+ c4.getRadius()
+ " e area de "+ c4.getArea() + " e cor "+ c4.getColor());
Console:O circulo c4 tem raio de 6.0 e area de 113.09733552923255 e cor branco
Figura 10: Trecho do cdigo da classe TestCircle no qual utilizado os mtodos setRadius() e setColor()
Conforme pode ser visto na figura 2, utilizou-se a palavra chave thisprecedendo aos atributos da classe Circle. A palavra chave this quandoprecede uma varivel, indica que essa varivel se refere a uma varivel deinstncia da classe. Desta forma, possvel nomear os argumentos dosmtodos modificadores e dos construtores com o mesmo nome dos atributos,sem causar conflitos. O mtodo privado calcLength() da classe Circle, calcula ocomprimento do objeto quando o mesmo instanciado. Alm disso, caso o raioseja modificado, este mtodo chamado para recalcular o comprimento doobjeto. O mtodo de acesso getLength() retorna o comprimento do objeto. Otrecho abaixo ilustra a utilizao do mtodo getLength().
// Cria um objeto do tipo Circle com raio 7.0 e cor yellowCircle c5 = newCircle(7.0,"yellow");// Exibe o comprimento do objeto c5System.out.println( "O circulo c5 tem comprimento de "+
c5.getLength());
Console: O circulo c5 tem comprimento de 43.982297150257104Figura 11: Trecho do cdigo da classe TestCircle no qual utilizado o mtodo getLength()
O mtodo toString() retorna uma breve descrio de uma instncia da classeCircle. Esta descrio contm o raio e a cor do objeto. O mtodo toString()pode ser chamando explicitamente, utilizando a sintaxeNomeObjeto.ToString(), ou implicitamente, quando o objeto utilizado noargumento do mtodo println(). A seguir, mostrado um trecho no qual omtodo toString() chamado explicitamente.
7/22/2019 Ex2 Poo Ufmg
8/18
c2.setRadius(1.2);// Chama o mtodo toString() do circulo c1 explicitamenteSystem.out.println(c1.toString());
Console: Circulo: raio = 1.2 cor = redFigura 12: Trecho do cdigo da classe TestCircle no qual o mtodo toString() utilizado explicitamente
Quando um objeto passado por parmetro para o mtodo println(), o mtodotoString() chamado implicitamente, conforme ilustrado abaixo.
// Chama o mtodo toString() do circulo c2 explicitamenteSystem.out.println(c2.toString());
// Chama o mtodo toString implicitamente no mtodo println()System.out.println(c2);
// Chama o mtodo toString implicitamente utilizando o operador '+'System.out.println("Operador '+' tambm chama toString implicitamente: "+ c2);
Console:Circulo: raio = 1.2 cor = redCirculo: raio = 1.2 cor = redOperador '+' tambm chama toString implicitamente : Circulo: raio =1.2 cor = red
Figura 13: Trecho do cdigo da classe TestCircle que ilustra a chamada implicita do mtodo toString()
3.2. Desafio 2
3.2.1. Diagrama de classe
No desafio 2, projetou-se uma classe chamada Triangle, que rene as
caractersticas comuns dos tringulos. O diagrama de classe desta classe mostrado abaixo.
Figura 14: Diagrama de classe da classe Triangle
No prximo tpico, ser feita uma anlise da implementao da classe Trianglena linguagem Java.
3.2.2. Implementao da Classe3.2.2.1. Variveis de instncia
7/22/2019 Ex2 Poo Ufmg
9/18
A classe Triangle possui trs variveis de instancia com tipo de acesso privado,utilizadas para armazenar os lados do tringulo. A declarao destas variveis mostrada a seguir.
// Variveis de instancia privadasprivatedoubleside1;privatedoubleside2;
privatedoubleside3;Figura 15: Variveis de instancia da classe Triangle
3.2.2.2. Construtor
A classe Triangle contm apenas um construtor, que cria um objeto com osvalores dos lados passados por parmetro. A implementao deste construtor mostrada a seguir.
// Construtor : Cria um triangulo com os lados fornecidos// por parmetropublicTriangle(doubleside1, doubleside2, doubleside3){
this.side1= side1;this.side2= side2;this.side3= side3;
}Figura 16: Construtor da classe Triangle
3.2.2.3. Mtodos Privados
A classe Triangle contm cinco mtodos de acesso privado. Estes mtodos spodem ser chamados dentro da classe Triangle. O mtodo
calcAngleBetweeTwoSides (sideA : double, sideB : double, sideC : double)calcula o ngulo entre dois lados de um tringulo utilizando a lei do cosseno(figura 171).
Figura 17: Lei dos cossenos
A implementao deste mtodo mostrada abaixo.
// Mtodo privado para obter o ngulo entre dois lados de// um tringulo. Recebe como parmetros sideA,sideB e sideC,// onde sideA e sideB so os lados no qual se deseja obter// o ngulo e sideC lado oposto a este ngulo.privatedoublecalcAngleBetweenTwoSides(doublesideA, doublesideB,
doublesideC){
// Calcula o cosseno do ngulo entre os lados sideA e sideB utilizando
1Figura retirada do sitehttp://www.mathwarehouse.com/trigonometry/law-of-cosines-formula-
examples.php
http://www.mathwarehouse.com/trigonometry/law-of-cosines-formula-examples.phphttp://www.mathwarehouse.com/trigonometry/law-of-cosines-formula-examples.phphttp://www.mathwarehouse.com/trigonometry/law-of-cosines-formula-examples.phphttp://www.mathwarehouse.com/trigonometry/law-of-cosines-formula-examples.phphttp://www.mathwarehouse.com/trigonometry/law-of-cosines-formula-examples.phphttp://www.mathwarehouse.com/trigonometry/law-of-cosines-formula-examples.php7/22/2019 Ex2 Poo Ufmg
10/18
// a lei dos cossenosdoublecosAngle = ((sideA)*(sideA) + (sideB)*(sideB)
(sideC)*(sideC))/(2*sideA*sideB);
// Calcula o arco cujo cosseno cosAngle (em radianos) utilizando o// mtodo acos() da classe Math.doubleangle = Math.acos(cosAngle);
// Retorna o ngulo em radianos com cinco casas decimaisreturn(Math.floor(angle*1E5)/1E5);}
Figura 18: Implementao do mtodo calcAngleBetweeTwoSides() , responsvel por calcular o ngulo entre dois
lados de um triangulo
A classificao de um tringulo pode ser feita com base nas proporesrelativas de seus lados e de seus ngulos internos. Quanto proporo doslados, um tringulo pode ser equiltero, isscele ou escaleno. Quando proporo dos ngulos interno, um tringulo pode ser retngulo, acutngulo ouobtusngulo. O mtodo checkEquilateral() verifica se uma dada instancia da
classe Triangle do tipo Equiltero, isto , este mtodo verifica se as variveisde instancia side1, side2 e side3 so iguais. A seguir mostrado o cdigodeste mtodo.
// Mtodo privado que verifica se o triangulo em questo equiltero// Retorna true se o triangulo for equiltero e false caso no seja.privatebooleancheckEquilateral(){
if((side1== side2) && (side2== side3)){
returntrue;}
else{
returnfalse;}
}Figura 19: Cdigo em Java do mtodo checkEquilateral()
O mtodo checkIsoceles() verifica se um dado objeto da classe Triangle dotipo Issceles, isto , este mtodo verifica se o objeto possui apenas dois ladosiguais. O cdigo deste mtodo mostrado abaixo.
// Mtodo privado que verifica se o triangulo em questo issceles
// Retorna true se o triangulo for issceles e false caso no seja.privatebooleancheckIsoceles(){
if((side1== side2) && (side1!= side3) ||(side1== side3) && (side1!= side2) ||(side2== side3) && (side2!= side1))
{returntrue;
}else{
returnfalse;
}}Figura 20: Cdigo em Java do mtodo checkIsoceles()
7/22/2019 Ex2 Poo Ufmg
11/18
O mtodo checkRectangle() verifica se um dado objeto da classe Triangle dotipo Retngulo, isto , verifica se o tringulo possui um ngulo interno de 90.Para a implementao deste mtodo, considerou-se o fato de que todotringulo retngulo deve satisfazer ao teorema de Pitgoras, a saber
A = B + C (Teorema de Pitgoras),
onde A a hipotenusa e B e C so os catetos. O cdigo deste mtodo mostrado abaixo.
// Mtodo privado que verifica se o triangulo em questo retngulo// Retorna true se o triangulo for retngulo e false caso no seja.privatebooleancheckRectangle(){
doubletemp;double[] sides = {side1,side2,side3};
// Preocura pelo maior lado do tringulo e armazena-o na ultima// posio do vetor sides.for(inti = 0; i < 2; i++){
if(sides[i] > sides[i+1]){
temp = sides[i+1];sides[i + 1] = sides[i];sides[i] = temp;
}}
// Calcula o quadrado do maior lado e armazena o resultado// com quatro casas decimais
doubleA2 = Math.floor(sides[2]*sides[2]*1E4)/1E4;
// Calcula o quadrado dos outros dois lados e armazena o// resultado com quatro casas decimaisdoubleB2 = Math.floor(sides[1]*sides[1]*1E4)/1E4;doubleC2 = Math.floor(sides[0]*sides[0]*1E4)/1E4;
// Verifica se a regra de Pitgoras valida para o tringulo// em questo. Caso seja vlida, ento o tringulo retngulo.if(A2 == (B2 + C2)){
returntrue;}
else{
returnfalse;}
}
Figura 21: Cdigo do mtodo checkRectangle()
O mtodo checkAcute() verifica se uma dada instancia de Triangle do tipoAcutngulo. Um tringulo acutngulo se todos seus ngulos internos foremmenores do que
. Para efeito de implementao, pode-se calcular os ngulos
internos do objeto e verificar se o cosseno de todos eles so maiores do quezero, j que o cosseno de ngulos entre 0 e 90 positivo. O cdigo domtodo checkAcute() mostrado a abaixo.
7/22/2019 Ex2 Poo Ufmg
12/18
// Mtodo privado que verifica se o triangulo em questo acutngulo.// Retorna true se o triangulo for acutngulo e false caso no seja.privatebooleancheckAcute(){
if(Math.cos(calcAngleBetweenTwoSides(side1, side2, side3)) > 0 &&Math.cos(calcAngleBetweenTwoSides(side1, side3, side2)) > 0 &&Math.cos(calcAngleBetweenTwoSides(side2, side3, side1)) > 0)
{returntrue;
}else{
returnfalse;}
}Figura 22: Cdigo em Java do mtodo checkAcute()
3.2.2.4. Mtodos de Acesso
A classe Triangle possui trs mtodos de acesso: getPerimeter(), que retorna opermetro do objeto, getArea(), que retorna a rea do objeto, e getType(), queretorna o tipo do triangulo. A implementao desses mtodos so mostradas aseguir.
// Mtodo de acesso para obter o permetro do tringulopublicdoublegetPerimeter(){
return(side1+ side2+ side3);}
Figura 23: Cdigo em Java do mtodo getPerimeter()
// Mtodo de acesso para obter a rea do tringulopublicdoublegetArea(){
// Calcula o ngulo oposto entre os lados side1 e side2doubleoppositeAngle = calcAngleBetweenTwoSides(side1, side2,
side3);
// Calcula e retorna a rea do tringuloreturn((side1*side2*Math.sin(oppositeAngle))/2);
}Figura 24: Cdigo em Java do mtodo getArea()
// Mtodo de acesso para obter o tipo do tringulopublicString getType(){
String triangleType = "";
// Obtm o tipo do tringulo com base nas propores relativas// de seus ladosif(checkEquilateral() == true) // Verifica se o tringulo
// equiltero{
triangleType = triangleType + "Equiltero e ";}elseif(checkIsoceles() == true) // Verifica se o
// tringulo isscele{triangleType = triangleType + "Isceles e ";
}
7/22/2019 Ex2 Poo Ufmg
13/18
else{
triangleType = triangleType + "Escaleno e ";}
// Obtm o tipo do tringulo com base nas propores relativas// de seus ngulosif(checkRectangle() == true) // Verifica se o tringulo
// retngulo{
triangleType = triangleType + " Retngulo";
}elseif(checkAcute() == true) // Verifica se o tringulo
// acutngulo{
triangleType = triangleType + " Acutangulo";}else{
triangleType = triangleType + " Obtuso";
}
returntriangleType;}
Figura 25: Cdigo em Java do mtodo getType()
3.2.2.5. Mtodo toString()
O mtodo toString() da classe Triangle retorna uma descrio do objeto,incluindo a medida dos lados, a rea, o permetro, o tipo e os ngulosinternos. Na implementao deste mtodo, utilizou-se o mtodo floor da
classe Math para exibir os valores numricos com duas casas decimais. Ocdigo do mtodo toString() mostrado a seguir.
// Mtodo toString() : Exibe uma descrio da instancia// Esta descrio contm os lados, rea, permetro,// tipo do tringulo e angulos internos.publicString toString(){
String sides = "Lados : "+ Math.floor(side1*100)/100 + " , "+ Math.floor(side2*100)/100 + " , "+ Math.floor(side3*100)/100;
String area = " Area : "+ Math.floor(getArea()*100)/100;String perimeter = " Perimetro : "
+ Math.floor(getPerimeter()*100)/100;String type = " Tipo : "+ getType();
// Calcula o ngulo interno entre os lados side1 e side2doubleangleA = calcAngleBetweenTwoSides(side1, side2, side3);// Converte o ngulo para grausangleA = Math.floor((angleA*180)/(Math.PI)*100)/100;
// Calcula o ngulo interno entre os lados side1 e side3doubleangleB = calcAngleBetweenTwoSides(side1, side3, side2);// Converte o ngulo para graus
angleB = Math.floor((angleB*180)/(Math.PI)*100)/100;
// Calcula o ngulo interno entre os lados side2 e side3doubleangleC = calcAngleBetweenTwoSides(side2, side3, side1);
7/22/2019 Ex2 Poo Ufmg
14/18
// Converte o ngulo para grausangleC = Math.floor((angleC*180)/(Math.PI)*100)/100;
String angle = " Angulos internos : "+ angleA + " , "+ angleB + " , "
+ angleC + "";
return(sides + area + perimeter + type + angle);
}Figura 26: Cdigo em Java do mtodo toString()
3.2.3. Cdigo completo da classe Triangle
A seguir mostrado o cdigo completo da classe Triangle.
publicclassTriangle{
// Variveis de instancia privadasprivatedoubleside1;
privatedoubleside2;privatedoubleside3;
// Construtor : Cria um triangulo com os lados fornecidos// por parmetropublicTriangle(doubleside1, doubleside2, doubleside3){
this.side1= side1;this.side2= side2;this.side3= side3;
}
// Mtodo de acesso para obter o permetro do tringulo
publicdoublegetPerimeter(){
return(side1+ side2+ side3);}
// Mtodo de acesso para obter a rea do tringulopublicdoublegetArea(){
// Calcula o ngulo oposto entre os lados side1 e side2doubleoppositeAngle = calcAngleBetweenTwoSides(side1, side2, side3);
// Calcula e retorna a rea do tringuloreturn((side1*side2*Math.sin(oppositeAngle))/2);
}
// Mtodo de acesso para obter o tipo do tringulopublicString getType(){
String triangleType = "";
// Obtm o tipo do tringulo com base na propores relativas de seus ladosif(checkEquilateral() == true) // Verifica se o tringulo equiltero{
triangleType = triangleType + "Equiltero e ";}
elseif(checkIsoceles() == true) // Verifica se o tringulo isceles{triangleType = triangleType + "Isceles e ";
}
7/22/2019 Ex2 Poo Ufmg
15/18
else{
triangleType = triangleType + "Escaleno e ";}
// Obtm o tipo do tringulo com base na propores relativas de seus ngulosif(checkRectangle() == true) // Verifica se o tringulo retngulo{
triangleType = triangleType + " Retngulo";}elseif(checkAcute() == true) // Verifica se o tringulo acutangulo{
triangleType = triangleType + " Acutangulo";}else{
triangleType = triangleType + " Obtuso";}
returntriangleType;}
// Mtodo privado para obter o ngulo entre dois lado de// um tringulo. Recebe como parmetros sideA,sideB e sideC,// onde sideA e sideB so os lados no qual se deseja obter// o ngulo e sideC lado oposto a este ngulo.privatedoublecalcAngleBetweenTwoSides(doublesideA, doublesideB, doublesideC){
// Calcula o cosseno do ngulo entre os lados sideA e sideB utilizando// a lei dos cossenosdoublecosAngle = ((sideA)*(sideA) + (sideB)*(sideB) - (sideC)*(sideC))/(2*sideA*sideB);
// Calcula o arco cujo cosseno cosAngle (em radianos) utilizando o
// mtodo acos() da classe Math.doubleangle = Math.acos(cosAngle);
// Retorna o ngulo em radianos com cinco casas decimaisreturn(Math.floor(angle*1E5)/1E5);
}
// Mtodo toString() : Exibe uma descrio da instancia// Esta descrio contm os lados, rea, permetro,// tipo do tringulo e angulos internos.publicString toString(){
String sides = "Lados : "+ Math.floor(side1*100)/100 + " , "
+ Math.floor(side2*100)/100 + " , "+ Math.floor(side3*100)/100;
String area = " Area : "+ Math.floor(getArea()*100)/100;String perimeter = " Perimetro : "+ Math.floor(getPerimeter()*100)/100;String type = " Tipo : "+ getType();
// Calcula o ngulo interno entre os lados side1 e side2doubleangleA = calcAngleBetweenTwoSides(side1, side2, side3);// Converte o ngulo para grausangleA = Math.floor((angleA*180)/(Math.PI)*100)/100;
// Calcula o ngulo interno entre os lados side1 e side3doubleangleB = calcAngleBetweenTwoSides(side1, side3, side2);
// Converte o ngulo para grausangleB = Math.floor((angleB*180)/(Math.PI)*100)/100;
// Calcula o ngulo interno entre os lados side2 e side3
7/22/2019 Ex2 Poo Ufmg
16/18
doubleangleC = calcAngleBetweenTwoSides(side2, side3, side1);// Converte o ngulo para grausangleC = Math.floor((angleC*180)/(Math.PI)*100)/100;
String angle = " Angulos internos : "+ angleA + " , "+ angleB + " , "+ angleC + "";
return(sides + area + perimeter + type + angle);
}
// Mtodo privado que verifica se o triangulo em questo equiltero// Retorna true se o triangulo for equiltero e false caso no seja.privatebooleancheckEquilateral(){
if((side1== side2) && (side2== side3)){
returntrue;}else{
returnfalse;
}}
// Mtodo privado que verifica se o triangulo em questo retngulo// Retorna true se o triangulo for retngulo e false caso no seja.privatebooleancheckRectangle(){
doubletemp;double[] sides = {side1,side2,side3};
// Preocura pelo maior lado do tringulo e armazena-o na ultima// posio do vetor sides.
for(inti = 0; i < 2; i++){if(sides[i] > sides[i+1]){
temp = sides[i+1];sides[i + 1] = sides[i];sides[i] = temp;
}}
// Calcula o quadrado do maior lado e armazena o resultado// com quatro casas decimaisdoubleA2 = Math.floor(sides[2]*sides[2]*1E4)/1E4;
// Calcula o quadrado dos outros dois lados e armazena o// resultado com quatro casas decimaisdoubleB2 = Math.floor(sides[1]*sides[1]*1E4)/1E4;doubleC2 = Math.floor(sides[0]*sides[0]*1E4)/1E4;
// Verifica se a regra de Pitgoras valida para o tringulo// em questo. Caso seja vlida, ento o tringulo retngulo.if(A2 == (B2 + C2)){
returntrue;}else
{returnfalse;
}}
7/22/2019 Ex2 Poo Ufmg
17/18
// Mtodo privado que verifica se o triangulo em questo isceles// Retorna true se o triangulo for isceles e false caso no seja.privatebooleancheckIsoceles(){
if((side1== side2) && (side1!= side3) ||(side1== side3) && (side1!= side2) ||(side2== side3) && (side2!= side1))
{returntrue;
}else{
returnfalse;}
}
// Mtodo privado que verifica se o triangulo em questo acutngulo.// Retorna true se o triangulo for acutngulo e false caso no seja.privatebooleancheckAcute(){
if(Math.cos(calcAngleBetweenTwoSides(side1, side2, side3)) > 0 &&Math.cos(calcAngleBetweenTwoSides(side1, side3, side2)) > 0 &&Math.cos(calcAngleBetweenTwoSides(side2, side3, side1)) > 0)
{returntrue;
}else{
returnfalse;}
}
}
Figura 27: Cdigo da classe Triangle
3.2.4. Teste da classe Triangle
Para testar a classe Triangle, criou-se uma classe chamada TestTriangle.Nesta classe, foi instanciado trs objetos: t1, t2 e t3. Em seguida, foi chamadoos mtodos getPerimeter(), getArea() e getType() das instancias t1, t2 e t3,respectivamente. Posteriormente, utilizou-se o mtodo toString() para cadauma dessas instncias. O cdigo da classe TestTriangle mostrado abaixo.
publicclassTestTriangle {
publicstaticvoidmain(String[] args) {
// Cria uma instancia t1 da classe TriangleTriangle t1 = newTriangle(4,7,6);
// Cria uma instancia t2 da classe TriangleTriangle t2 = newTriangle(9, 9, 15);
// Cria uma instancia t3 da classe TriangleTriangle t3 = newTriangle(3, 4, 5);
// Utilizao do mtodo getPerimeter() para obter o perimetro// do tringulo t1System.out.println("Perimeto de t1 = "+ t1.getPerimeter());
7/22/2019 Ex2 Poo Ufmg
18/18
// Utilizao do mtodo getArea() para obter a rea do// tringulo t2System.out.println("Area de t2 = "+ t2.getArea());
// Utilizao do mtodo getType() para obter o tipo do// tringulo t3System.out.println("Tipo de t3 = "+ t3.getType());
// Utilizao do mtodo toString() explicitamenteSystem.out.println(t1.toString());System.out.println(t2.toString());System.out.println(t3.toString());
}}
Figura 28: Cdigo em Java da classe TestTriangle
Os resultados obtidos ao executar o cdigo acima so mostrados a seguir.
Perimeto de t1 = 17.0Area de t2 = 37.312053566591445Tipo de t3 = Escaleno e Retngulo
Lados : 4.0 , 7.0 , 6.0 Area : 11.97 Perimetro : 17.0 Tipo : Escaleno eAcutangulo Angulos internos : 58.81 , 86.41 , 34.77
Lados : 9.0 , 9.0 , 15.0 Area : 37.31 Perimetro : 33.0 Tipo : Isceles eObtuso Angulos internos : 112.88 , 33.55 , 33.55
Lados : 3.0 , 4.0 , 5.0 Area : 5.99 Perimetro : 12.0 Tipo : Escaleno eRetngulo Angulos internos : 89.99 , 53.12 , 36.86
Figura 29: Resultados produzidos pela classe TestTriangle
4. Concluses
As classes Circle e Triangle estudas nesta aula prtica permitiu um primeirocontato com o projeto e criao de classes e objetos na linguagem Java.Muitos conceitos importantes relacionadas aos paradigmas da programaoorientada a objeto, como o encapsulamento e modificadores de acesso foramtambm abordados nesta aula. Os resultados dos testes realizados com asclasses projetadas demonstram que elas esto implementadas corretamente.Ao final desta aula, sinto apto para projetar e criar classes, bem comoinstanciar objetos na linguagem Java.
Recommended