Classe Herdeira! Duvida Cruel no Triangulo!

9 respostas
M

Olá Tchurma!!

Gente. me ajudem aqui. eu tenho uma questao que ja consegui fazer 80% da mesma, mas nao consigo terminar a ultima parte…

quem souber dá uma dica… por favor me envie.

Questao: Escreva a classe ObjGeom que represente um objeto geometrico em duas dimensoes. ela dever ter metodos para inicializar o obejto, mostrar seus dados, calcular e retornar sua area e perimetro. Usando esse classe como base, escreva as classes herdeiras Circulo (contendo duas coordenadas para o centro e um raio), Retangulo ( contendo dois valores para os lados) e Triangulo(Contendo tres valores para os lados), só que sobrepoem os metodos descritos em ObjGeom.

Dicas: A área de um circulo pode ser calculada Math.PIrr, onde r é raio do circulo. O Perimetro de um circulo é dado por 2Math.PIr. A área do Retangulo é dada por bh, onde b é um dos lados e h é o outro lado. Seu perimetro é dado 2b+2h. A área do Triangulo é dada por Math.sqrt(s(s-a)(s-b)(s-c)), onde Math.sqrt é a funçao q calcula a raiz quadrada, e a,b,c, sao os lados do Triangulo, e s é a metade do perimetro do triangulo. O perimetro do Triangulo é calculado como (a+b+c).

Eu ja fiz as seguintes classes e estao funcionando:

ObjGeom

class ObjGeom{
    private double x,y;
    
    public double getX(){
        return x;
    }
    public double getY(){
        return y;
    }
    public void  setX(double a){
        x=a;
    }
    public void  setY(double b){
        y=b;
    }
    ObjGeom (double a, double b){
        setX(a);
        setY(b);
    }
    
}

Circulo

class Circulo extends ObjGeom{
        private double r;
        
        Circulo(double a, double b, double c){
            super (a,b);
            setRaio(c);
        }
        
        public void setRaio(double a){
            r=a;
        }
        public double getRaio(){
            return r;
        }
        public double area(){
            return Math.PI*getRaio()*getRaio();
        }
        public double perimetro(){
            return 2*Math.PI*getRaio();
        }
            
}

Retangulo

class Retangulo extends ObjGeom{
    private double b,h;
    
    Retangulo(double x, double y, double z, double q){
        super(x,y);
        b=z;h=q;
    }
    public double getB(){
        return b;
    }
    public double getH(){
        return h;
    }
    public double area(){
        return b*h;
    }
    public double perimetro(){
        return ((2*b)+(2*h));
    }

}

Triangulo

class Triangulo extends ObjGeom{
    private double x,y,z,s;
    
    
    Triangulo(double a, double b, double c){
        super(a,b);
            c=z;
  }
            
     public void setMPerimetro(double a, double b, double c){
            s=(a+b+c)/2;
        }
      public double getMPerimetro(){
          return s;
 }
      public double area(){
          return Math.sqrt(s*(s-a)*(s-b)*(s-c));
      }
}

Só que a Classe Triangulo o seguinte erro quando tento compilar.

CANNOT SOLVE SYMBOL- VARIABLE a

nesse linha:

return Math.sqrt(s*(s-a)*(s-b)*(s-c));

Se alguem puder dar uma dica, eu agradeço.

MigMax.

9 Respostas

L

MigMax,

observe o seguinte na classe Triângulo: a variável “a” ela é utilizada apenas como um parâmetro alguns métodos e para o construtor (double a). Porém, no método area, não foi definida a passagem deste parâmetro :slight_smile:

class Triangulo extends ObjGeom{ 
    private double x,y,z,s; 
    
    
    Triangulo(double a, double b, double c){ 
        super(a,b); 
            c=z; 
  } 
            
     public void setMPerimetro(double a, double b, double c){ 
            s=(a+b+c)/2; 
        } 
      public double getMPerimetro(){ 
          return s; 
 } 
      public double area(){ 
          return Math.sqrt(s*(s-a)*(s-b)*(s-c)); 
      } 
}

Boa Sorte!!!

M

Caro Luis,

eu fiz essa modificaçao: chegou a compilar. Mas será que fiz correto mesmo? Poderia checar pra mim?

class Triangulo extends ObjGeom{
    private double x,y,z,s;
    public double Area;
    
    Triangulo(double a, double b, double c){
        super(a,b);
            c=z;
  }
            
     public void setMPerimetro(double a, double b, double c){
            s=(a+b+c)/2;
        }
      public double getMPerimetro(){
          return s;
 }
 
     public void setAre(double a, double b, double c){
              Area=Math.sqrt(s*(s-a)*(s-b)*(s-c));
          }
     
      public double getArea(){
          return Area;
          
      }
}

MigMax

M

bem, referente a sintaxe do código, pude perceber q a variável Area esta em letra maiuscula, ..por convenção, só use letras maiusculas em nomes de classes, prefira "area" ...... outra, no construtor de Triangulo, tem o seguinte:

Triangulo(double a, double b, double c) { 
  
  super(a,b); 
  c=z; 
}

preste atençao na atribuição q estas fazendo, c = z , .... a variavel c é aquela q vem do parametro do construtor, e z é a variavel de instancia de Triangulo q vc deveria configurar com o valor de c, logo, mude para:

Triangulo(double a, double b, double c) { 
  
  super(a,b); 
  z = c; 
}
M

Grande Dica Mateus.

Valeu Mesmo. Eu sabia que tava mostrando alguma coisa esquisita na tela.

MigMax

M

Agora pessoal, tem um detalhe. O Aplicativo que fiz até roda, só q os valores de MPerimetro e Area do Triangulo estao dando 0.0.

Alguem sabe dizer o pq?

Cod. Triangulo

class Triangulo extends ObjGeom{
    private double x,y,w,s;
    public double Area;
    
    Triangulo(double a, double b, double c){
        super(a,b);
            w=c;
  }
  
     public double getC(){
         return w;
     }
            
     public void setMPerimetro(double a, double b, double c){
            s=(a+b+c)/2;
        }
      public double getMPerimetro(){
          return s;
 }
 
     public void setAre(double a, double b, double c){
              Area=Math.sqrt(s*(s-a)*(s-b)*(s-c));
          }
     
      public double getArea(){
          return Area;
          
      }
}

Resultado na Tela.

O ponto X do Objeto Geometrico é:1.0
O ponto Y do Objeto Geometrico é:2.0

O ponto X do Circulo é:3.0
O ponto Y do Circulo é:4.0
O Raio do Circulo é:5.0
A area do Circulo é:78.53981633974483
O Perimetro do Circulo é:31.41592653589793

O ponto X do Retangulo é:6.0
O ponto Y do Retangulo é:7.0
A base do Retangulo é:8.0
A area do Retangulo é:72.0
A Altura do Retangulo é:9.0

O Lado A do Triangulo é:1.0
O Lado B do Triangulo é:2.0
O Lado c do Triangulo é:3.0
A Metade do Perimetro do Triangulo é:0.0
A Área do Triangulo é:0.0

MigMax

M

Pessoal, eu consegui descobrir com um amigo pq só tava retornando zero.

Eu nao tinha inicializado os metodos.

Agora ela faz mas ainda acontece algo estranho… eu nunca vi isso antes… será que alguem aqui sabe explicar pq na Area mostra NaN?

Cod.

class Triangulo extends ObjGeom{
    private double x,y,w,s;
    public double Area;
    
    Triangulo(double a, double b, double c){
        super(a,b);
            w=c;
        setMPerimetro(a,b,c);
        setArea(a,b,c);
  }
  
     public double getC(){
         return w;
     }
            
     public void setMPerimetro(double a, double b, double c){
            s=(a+b+c)/2;
        }
      public double getMPerimetro(){
          return s;
 }
 
     public void setArea(double a, double b, double c){
              Area=Math.sqrt(s*(s-a)*(s-b)*(s-c));
          }
     
      public double getArea(){
          return Area;
          
      }
}

Aplicativo:

O ponto X do Objeto Geometrico é:1.0
O ponto Y do Objeto Geometrico é:9.0

O ponto X do Circulo é:3.0
O ponto Y do Circulo é:5.0
O Raio do Circulo é:7.0
A area do Circulo é:153.93804002589985
O Perimetro do Circulo é:43.982297150257104

O ponto X do Retangulo é:2.0
O ponto Y do Retangulo é:6.0
A base do Retangulo é:2.0
A area do Retangulo é:10.0
A Altura do Retangulo é:5.0

O Lado A do Triangulo é:8.0
O Lado B do Triangulo é:2.0
O Lado c do Triangulo é:4.0
A Metade do Perimetro do Triangulo é:7.0
A Área do Triangulo é:NaN

MigMax

M

o NaN é uma constante da classe Double, q significa Not a Number… acontece q essa expreção

Math.sqrt( s * ( s - a ) * ( s - b ) * ( s - c ) );

…q tu ta usando pra calcular a área, ta fazendo algum cálculo q retorne a constante NaN, q é um resultado q pode ocorrer qnd os limites da classe Mat são excedidos… ou são executadas funções matemáticas como dividir numeros de ponto flutuante por zero… por ex:

Math.sqrt( -16d )

…isso vai retornar um NaN, pq esta tentando fazer a raiz quadrada de um numero negativo!! … lembre-se das aulas de cálculo diferencial e integral… heheahe :smiley:

M

Valeu Mateus,

Eu entendi o recado, só q tem uma coisa… Nem vc me pagando muito dinheio eu quero lembrar dessas materias… Cara elas foram um pesadelo na minha vida. Prefiro mil vezes pedir ajuda de colegas como vc.

MiGMax

M

haehe, é… sorte q eu li sobre essa parte de NaN, e outras constantes da classe Double q representam situações impossíveis na matemática… creio q caia alguma coisa disso no exame de certificação, pelo menos foi no livro de estudos pro exame q li sobre isto… 8O

Criado 1 de maio de 2004
Ultima resposta 2 de mai. de 2004
Respostas 9
Participantes 3