Você está na página 1de 18

Universidade Federal de Minas Gerais

Instituto de Cincias Exatas Departamento de Cincia da Computao Programao Modular e Orientao a Objetos Lista de Exerccio 02 Classes e objetos Aluno : Esdras Vitor Silva Pinto

1. Introduo
No paradigma da programao orientada a objetos, as classes definem um tipo abstrato 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 dos mtodos que as caractersticas do objeto so lidas, alteradas ou processadas para gerar um novo dado referente ao objeto. Nesta aula prtica, estuda-se a implementao de uma classe bem como a instanciao de um objeto em Java.

2. Objetivos
Realizar alteraes em uma classe previamente projetada, projetar e criar uma nova classe e instanciar objetos em Java.

3. Parte Prtica
3.1. Desafio 1 3.1.1. Diagrama de classes
Uma classe pode ser representada atravs de um diagrama de classes. Para uma classe chamada Circle, que rene as caractersticas comuns a todos os crculos, o seu projeto pode ser representado pelo seguinte diagrama de classes:

Figura 1: Diagrama de classes da classe Circle

Com base neste diagrama, podemos retirar as seguintes concluses: i) A classe Circle possui trs variveis de instncias acessveis apenas por mtodos da prpria classe, uma vez que seu tipo de acesso definido como private (o sinal de - que antecede uma varivel ou um mtodo indica que esta varivel ou mtodo so de acesso privado). A classe Circle possui trs construtores : Circle(), que cria um objeto com as definies padres mostradas no diagrama, Circle(radius : double), que cria um objeto cujo valor do raio fornecido por parmetro, e Circle(radius: double, color : String), que cria um objeto com o valor de raio e cor passados por parmetro. 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, por apenas retornar os valores das variveis de instncias ou utiliza-las para obter outro dado referente ao objeto, so chamados de mtodos de 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 de instncia, so chamados de mtodos modificadores. O mtodo toString() fornece uma breve descrio do objeto. Todos esses mtodos descritos anteriormente podem ser acessados de outra classe, j que o tipo de acesso desses mtodos definido como public (o sinal de + que antecede uma varivel ou um mtodo indicia que esta varivel ou mtodo so de acesso pblico). O ultimo mtodo, chamado calcLength(), um mtodo privado, usado para calcular o comprimento do crculo.

ii)

iii)

3.1.2. Cdigo fonte das classes Circle e TestCircle


O cdigo referente classe Circle na linguagem Java mostrado a seguir.
public class Circle { // variveis de instancia privadas, isto , private double radius = 1.0; // Armazena private String color = "red"; // Armazena private double length; // Armazena no acessveis de fora desta classe. o raio do crculo a cor do crculo o comprimento do crculo

// primeiro construtor o qual atribui valores iniciais a ambos: radius e color. public Circle() { 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. public Circle(double radius) { this.radius = radius; // cria o objeto com o primeiro construtor:.Circle() this.color = "red";

calcLength(); } // Terceiro construtor que inicia radius e color com os parmetos recebidos public Circle(double radius, String color) { this.radius = radius; this.color = color; calcLength(); } // Metodo de acesso para obter o valor armazenado em radius public double getRadius() { return (this.radius); } // Metodo de acesso para computar a rea de um circulo. public double getArea() { return (this.radius)*(this.radius)*Math.PI; // PI a constante . //Math a classe onde PI definido . } // metodo Get para a varivel de instancia color public String getColor() { return (this.color); } // mtodo Get para a varivel de instancia length public double getLength() { return (this.length); } // metodo Set para a varivel de instancia radius public void setRadius(double radius) { this.radius = radius; calcLength(); } // metdodo Set para a varivel de instancia color public void setColor(String color) { this.color = color; } // Mtodo para o clculo do comprimento do crculo private void calcLength() { this.length = 2*(Math.PI)*(this.radius); } // Mtodo toString public String toString() { return "Circulo: raio = " + radius + " cor = " + color; } }
Figura 2: Cdigo fonte em Java da classe Circle

A classe Circle no possui o mtodo main() e, portanto, no pode ser executada. Para utilizar esta classe, necessrio criar uma nova classe que possua o mtodo main(). Nessa nova classe que sero instanciados os objetos da classe Circle. A seguir mostrado o cdigo fonte em Java de uma classe chamada TesteCircle que instancia objetos da classe Circle.
public class TestCircle { public static void main(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 = new Circle(); // 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 = new Circle(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 = new Circle(3.0,"blue"); // Exibe o radio e a cor do circulo c3 System.out.println( "O circulo c3 tem raio de " + c3.getRadius() + " e area de " + c3.getArea() ); // Exibe as cores dos circulos System.out.println("The circle System.out.println("The circle System.out.println("The circle c1,c2 c1 is c2 is c3 is e " " " c3 + c1.getColor()); + c2.getColor()); + c3.getColor());

// Teste de acesso varivel de instancia da classe Circle // c1.radius = 5.0; // Instancia um objeto da classe Circle Circle c4 = new Circle(4.0,"Green"); // Exibe o raio, rea e cor do circulo c4 System.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 setColor c4.setRadius(6.0); // Altera o raio do circulo c4 para 6.0 c4.setColor("White"); // Altera a cor do circulo c4 para "White"

// Exibe os novos valores de raio, rea e cor do circulo c4 System.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 explicitamente System.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 alocar memria para o objeto. No trecho mostrado a seguir, inicialmente cria-se uma referncia para o objeto c1 e, em seguida, utilizando o operador new, aloca-se memria para o objeto c1. importante ressaltar que aps o operador new deve-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 = new Circle();
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 sua criao. Logo, c1 foi criado com os valores padres definido na classe Circle. O objeto c2 foi criado utilizando o construtor Circle(radius: double), conforme segue:
// 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 = new Circle(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 (valor padro). Para utilizar um mtodo de um objeto, basta escrever o nome do objeto, colocar ponto no final, e escrever o nome do mtodo. Por exemplo, no trecho a seguir utilizado os mtodos getRadius() e getArea dos objetos c1 e c2.

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.141592653589793 O 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. A seguir, 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 = new Circle(3.0,"blue"); // Exibe o radio e a cor do circulo c3 System.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.274333882308138


Figura 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 System.out.println("The circle System.out.println("The circle System.out.println("The circle c1,c2 c1 is c2 is c3 is e " " " c3 + c1.getColor()); + c2.getColor()); + c3.getColor());

Console :

The circle c1 is red The circle c2 is red The 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 encapsulao de dados e mtodos. Desta forma, os atributos ou mtodos que possuem tipo de acesso privado, no podem ser acessados de outra classe. Para ilustrar essa restrio de acesso, considere o trecho a seguir no qual se tenta atribuir um valor varivel radius do objeto c1 dentro da classe TestCircle.
// Teste de acesso varivel de instancia da classe Circle, dentro // da classe TestCircle c1.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:

A mensagem de exceo acima diz que a varivel radius no visvel na classe TestCircle. Assim, no possvel modificar o valor de radius diretamente; preciso utilizar um mtodo para realizar esta tarefa. Muitas vezes necessrio alterar os atributos de um objeto. Para isto, utiliza-se os 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 destes dois mtodos.
// Modifica as variveis de instancia do circulo c4 atravs // dos modificadores c4.setRadius(6.0); // Altera o raio do circulo c4 para 6.0 c4.setColor("branco"); // Altera a cor do circulo c4 para "branco" // Exibe os novos valores de raio, rea e cor do circulo c4 System.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 this precedendo aos atributos da classe Circle. A palavra chave this quando precede uma varivel, indica que essa varivel se refere a uma varivel de instncia da classe. Desta forma, possvel nomear os argumentos dos mtodos modificadores e dos construtores com o mesmo nome dos atributos, sem causar conflitos. O mtodo privado calcLength() da classe Circle, calcula o comprimento do objeto quando o mesmo instanciado. Alm disso, caso o raio seja modificado, este mtodo chamado para recalcular o comprimento do objeto. O mtodo de acesso getLength() retorna o comprimento do objeto. O trecho abaixo ilustra a utilizao do mtodo getLength().
// Cria um objeto do tipo Circle com raio 7.0 e cor yellow Circle c5 = new Circle(7.0,"yellow"); // Exibe o comprimento do objeto c5 System.out.println( "O circulo c5 tem comprimento de " + c5.getLength());

Console: O circulo c5 tem comprimento de 43.982297150257104


Figura 11: Trecho do cdigo da classe TestCircle no qual utilizado o mtodo getLength()

O mtodo toString() retorna uma breve descrio de uma instncia da classe Circle. Esta descrio contm o raio e a cor do objeto. O mtodo toString() pode ser chamando explicitamente, utilizando a sintaxe NomeObjeto.ToString(), ou implicitamente, quando o objeto utilizado no argumento do mtodo println(). A seguir, mostrado um trecho no qual o mtodo toString() chamado explicitamente.

c2.setRadius(1.2); // Chama o mtodo toString() do circulo c1 explicitamente System.out.println(c1.toString());

Console: Circulo: raio = 1.2 cor = red


Figura 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 mtodo toString() chamado implicitamente, conforme ilustrado abaixo.
// Chama o mtodo toString() do circulo c2 explicitamente System.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 = red Circulo: raio = 1.2 cor = red Operador '+' 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 Triangle na linguagem Java.

3.2.2. Implementao da Classe 3.2.2.1. Variveis de instncia

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 privadas private double side1; private double side2; private double side3;
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 os valores dos lados passados por parmetro. A implementao deste construtor mostrada a seguir.
// Construtor : Cria um triangulo com os lados fornecidos // por parmetro public Triangle(double side1, double side2, double side3) { 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 s podem 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. private double calcAngleBetweenTwoSides( double sideA, double sideB, double sideC) { // Calcula o cosseno do ngulo entre os lados sideA e sideB utilizando
1

Figura retirada do site http://www.mathwarehouse.com/trigonometry/law-of-cosines-formulaexamples.php

// a lei dos cossenos double cosAngle = ((sideA)*(sideA) + (sideB)*(sideB) (sideC)*(sideC))/(2*sideA*sideB); // Calcula o arco cujo cosseno cosAngle (em radianos) utilizando o // mtodo acos() da classe Math. double angle = Math.acos(cosAngle); // Retorna o ngulo em radianos com cinco casas decimais return (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 propores relativas de seus lados e de seus ngulos internos. Quanto proporo dos lados, um tringulo pode ser equiltero, isscele ou escaleno. Quando proporo dos ngulos interno, um tringulo pode ser retngulo, acutngulo ou obtusngulo. O mtodo checkEquilateral() verifica se uma dada instancia da classe Triangle do tipo Equiltero, isto , este mtodo verifica se as variveis de instancia side1, side2 e side3 so iguais. A seguir mostrado o cdigo deste mtodo.
// Mtodo privado que verifica se o triangulo em questo equiltero // Retorna true se o triangulo for equiltero e false caso no seja. private boolean checkEquilateral() { if((side1 == side2) && (side2 == side3)) { return true; } else { return false; } }
Figura 19: Cdigo em Java do mtodo checkEquilateral()

O mtodo checkIsoceles() verifica se um dado objeto da classe Triangle do tipo Issceles, isto , este mtodo verifica se o objeto possui apenas dois lados iguais. 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. private boolean checkIsoceles() { if((side1 == side2) && (side1 != side3) || (side1 == side3) && (side1 != side2) || (side2 == side3) && (side2 != side1)) { return true; } else { return false; } }
Figura 20: Cdigo em Java do mtodo checkIsoceles()

O mtodo checkRectangle() verifica se um dado objeto da classe Triangle do tipo Retngulo, isto , verifica se o tringulo possui um ngulo interno de 90. Para a implementao deste mtodo, considerou-se o fato de que todo tringulo 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. private boolean checkRectangle() { double temp; double[] sides = {side1,side2,side3}; // Preocura pelo maior lado do tringulo e armazena-o na ultima // posio do vetor sides. for(int i = 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 double A2 = Math.floor(sides[2]*sides[2]*1E4)/1E4; // Calcula o quadrado dos outros dois lados e armazena o // resultado com quatro casas decimais double B2 = Math.floor(sides[1]*sides[1]*1E4)/1E4; double C2 = 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)) { return true; } else { return false; } }
Figura 21: Cdigo do mtodo checkRectangle()

O mtodo checkAcute() verifica se uma dada instancia de Triangle do tipo Acutngulo. Um tringulo acutngulo se todos seus ngulos internos forem menores 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 que zero, j que o cosseno de ngulos entre 0 e 90 positivo. O cdigo do mtodo checkAcute() mostrado a abaixo.

// Mtodo privado que verifica se o triangulo em questo acutngulo. // Retorna true se o triangulo for acutngulo e false caso no seja. private boolean checkAcute() { if(Math.cos(calcAngleBetweenTwoSides(side1, side2, side3)) > 0 && Math.cos(calcAngleBetweenTwoSides(side1, side3, side2)) > 0 && Math.cos(calcAngleBetweenTwoSides(side2, side3, side1)) > 0) { return true; } else { return false; } }
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 o permetro do objeto, getArea(), que retorna a rea do objeto, e getType(), que retorna o tipo do triangulo. A implementao desses mtodos so mostradas a seguir.
// Mtodo de acesso para obter o permetro do tringulo public double getPerimeter() { return (side1 + side2 + side3); }
Figura 23: Cdigo em Java do mtodo getPerimeter()

// Mtodo de acesso para obter a rea do tringulo public double getArea() { // Calcula o ngulo oposto entre os lados side1 e side2 double oppositeAngle = calcAngleBetweenTwoSides(side1, side2, side3); // Calcula e retorna a rea do tringulo return ((side1*side2*Math.sin(oppositeAngle))/2); }
Figura 24: Cdigo em Java do mtodo getArea()

// Mtodo de acesso para obter o tipo do tringulo public String getType() { String triangleType = ""; // Obtm o tipo do tringulo com base nas propores relativas // de seus lados if(checkEquilateral() == true) // Verifica se o tringulo // equiltero { triangleType = triangleType + "Equiltero e "; } else if(checkIsoceles() == true) // Verifica se o // tringulo isscele { triangleType = triangleType + "Isceles e "; }

else { triangleType = triangleType + "Escaleno e "; } // Obtm o tipo do tringulo com base nas propores relativas // de seus ngulos if(checkRectangle() == true) // Verifica se o tringulo // retngulo { triangleType = triangleType + " Retngulo"; } else if(checkAcute() == true) { triangleType = triangleType + " Acutangulo"; } else { triangleType = triangleType + " Obtuso"; } return triangleType; }
Figura 25: Cdigo em Java do mtodo getType()

// Verifica se o tringulo // acutngulo

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 ngulos internos. Na implementao deste mtodo, utilizou-se o mtodo floor da classe Math para exibir os valores numricos com duas casas decimais. O cdigo 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. public String toString() { String sides = "Lados : " + Math.floor(side1*100)/100 + " , " + Math.floor(side2*100)/100 + " , " + Math.floor(side3*100)/100; String area = " Area String perimeter = " + String type = " Tipo : " + Math.floor(getArea()*100)/100; Perimetro : " Math.floor(getPerimeter()*100)/100; : " + getType();

// Calcula o ngulo interno entre os lados side1 e side2 double angleA = calcAngleBetweenTwoSides(side1, side2, side3); // Converte o ngulo para graus angleA = Math.floor((angleA*180)/(Math.PI)*100)/100; // Calcula o ngulo interno entre os lados side1 e side3 double angleB = 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 side3 double angleC = calcAngleBetweenTwoSides(side2, side3, side1);

// Converte o ngulo para graus angleC = 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.
public class Triangle { // Variveis de instancia privadas private double side1; private double side2; private double side3; // Construtor : Cria um triangulo com os lados fornecidos // por parmetro public Triangle(double side1, double side2, double side3) { this.side1 = side1; this.side2 = side2; this.side3 = side3; } // Mtodo de acesso para obter o permetro do tringulo public double getPerimeter() { return (side1 + side2 + side3); } // Mtodo de acesso para obter a rea do tringulo public double getArea() { // Calcula o ngulo oposto entre os lados side1 e side2 double oppositeAngle = calcAngleBetweenTwoSides(side1, side2, side3); // Calcula e retorna a rea do tringulo return ((side1*side2*Math.sin(oppositeAngle))/2); } // Mtodo de acesso para obter o tipo do tringulo public String getType() { String triangleType = ""; // Obtm o tipo do tringulo com base na propores relativas de seus lados if(checkEquilateral() == true) // Verifica se o tringulo equiltero { triangleType = triangleType + "Equiltero e "; } else if(checkIsoceles() == true) // Verifica se o tringulo isceles { triangleType = triangleType + "Isceles e "; }

else { triangleType = triangleType + "Escaleno e "; } // Obtm o tipo do tringulo com base na propores relativas de seus ngulos if(checkRectangle() == true) // Verifica se o tringulo retngulo { triangleType = triangleType + " Retngulo"; } else if(checkAcute() == true) // Verifica se o tringulo acutangulo { triangleType = triangleType + " Acutangulo"; } else { triangleType = triangleType + " Obtuso"; } return triangleType; } // 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. private double calcAngleBetweenTwoSides(double sideA, double sideB, double sideC) { // Calcula o cosseno do ngulo entre os lados sideA e sideB utilizando // a lei dos cossenos double cosAngle = ((sideA)*(sideA) + (sideB)*(sideB) - (sideC)*(sideC))/(2*sideA*sideB); // Calcula o arco cujo cosseno cosAngle (em radianos) utilizando o // mtodo acos() da classe Math. double angle = Math.acos(cosAngle); // Retorna o ngulo em radianos com cinco casas decimais return (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. public String 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 side2 double angleA = calcAngleBetweenTwoSides(side1, side2, side3); // Converte o ngulo para graus angleA = Math.floor((angleA*180)/(Math.PI)*100)/100; // Calcula o ngulo interno entre os lados side1 e side3 double angleB = 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 side3

double angleC = calcAngleBetweenTwoSides(side2, side3, side1); // Converte o ngulo para graus angleC = 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. private boolean checkEquilateral() { if((side1 == side2) && (side2 == side3)) { return true; } else { return false; } } // Mtodo privado que verifica se o triangulo em questo retngulo // Retorna true se o triangulo for retngulo e false caso no seja. private boolean checkRectangle() { double temp; double[] sides = {side1,side2,side3}; // Preocura pelo maior lado do tringulo e armazena-o na ultima // posio do vetor sides. for(int i = 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 double A2 = Math.floor(sides[2]*sides[2]*1E4)/1E4; // Calcula o quadrado dos outros dois lados e armazena o // resultado com quatro casas decimais double B2 = Math.floor(sides[1]*sides[1]*1E4)/1E4; double C2 = 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)) { return true; } else { return false; } }

// Mtodo privado que verifica se o triangulo em questo isceles // Retorna true se o triangulo for isceles e false caso no seja. private boolean checkIsoceles() { if((side1 == side2) && (side1 != side3) || (side1 == side3) && (side1 != side2) || (side2 == side3) && (side2 != side1)) { return true; } else { return false; } } // Mtodo privado que verifica se o triangulo em questo acutngulo. // Retorna true se o triangulo for acutngulo e false caso no seja. private boolean checkAcute() { if(Math.cos(calcAngleBetweenTwoSides(side1, side2, side3)) > 0 && Math.cos(calcAngleBetweenTwoSides(side1, side3, side2)) > 0 && Math.cos(calcAngleBetweenTwoSides(side2, side3, side1)) > 0) { return true; } else { return false; } } }
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 chamado os mtodos getPerimeter(), getArea() e getType() das instancias t1, t2 e t3, respectivamente. Posteriormente, utilizou-se o mtodo toString() para cada uma dessas instncias. O cdigo da classe TestTriangle mostrado abaixo.
public class TestTriangle { public static void main(String[] args) { // Cria uma instancia t1 da classe Triangle Triangle t1 = new Triangle(4,7,6); // Cria uma instancia t2 da classe Triangle Triangle t2 = new Triangle(9, 9, 15); // Cria uma instancia t3 da classe Triangle Triangle t3 = new Triangle(3, 4, 5); // Utilizao do mtodo getPerimeter() para obter o perimetro // do tringulo t1 System.out.println("Perimeto de t1 = " + t1.getPerimeter());

// Utilizao do mtodo getArea() para obter a rea do // tringulo t2 System.out.println("Area de t2 = " + t2.getArea()); // Utilizao do mtodo getType() para obter o tipo do // tringulo t3 System.out.println("Tipo de t3 = " + t3.getType()); // Utilizao do mtodo toString() explicitamente System.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.0 Area de t2 = 37.312053566591445 Tipo de t3 = Escaleno e Retngulo Lados : 4.0 , 7.0 , 6.0 Area : 11.97 Perimetro : 17.0 Tipo : Escaleno e Acutangulo Angulos internos : 58.81 , 86.41 , 34.77 Lados : 9.0 , 9.0 , 15.0 Area : 37.31 Perimetro : 33.0 Tipo : Isceles e Obtuso Angulos internos : 112.88 , 33.55 , 33.55 Lados : 3.0 , 4.0 , 5.0 Area : 5.99 Perimetro : 12.0 Tipo : Escaleno e Retngulo 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 primeiro contato com o projeto e criao de classes e objetos na linguagem Java. Muitos conceitos importantes relacionadas aos paradigmas da programao orientada a objeto, como o encapsulamento e modificadores de acesso foram tambm abordados nesta aula. Os resultados dos testes realizados com as classes projetadas demonstram que elas esto implementadas corretamente. Ao final desta aula, sinto apto para projetar e criar classes, bem como instanciar objetos na linguagem Java.

Você também pode gostar