ex2 poo ufmg

Upload: -cold-

Post on 09-Feb-2018

239 views

Category:

Documents


0 download

TRANSCRIPT

  • 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.php
  • 7/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.