• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

saramgsilva

[C++] Classes Par e Ponto

1 mensagem neste tópico

Recentemente frequentei a cadeira de programação orientada a objectos, tendo realizado alguns exercícios, simples...

Vou apresentar o exemplo de classes, usando a classe Par, e criando uma sua subclasse Ponto: tenho varias versões, para as quais exponho o código ... :D

Comecei por criar a classe Par:

Parv1.cpp:

#include <iostream>

using namespace std;


class Par1v{
     // declaracao de variaveis
private:
     double left;
     double right;

public:

     Par1v(){ left=0; right=0;}       
     Par1v(double n, double m){left=n; right=m;}

     virtual double get_left()  const { return left; }
     virtual double get_right() const { return right;}

     virtual void set_left (double n) { left=n; }
     virtual void set_right(double m) { right=m; }

     virtual void swap1()
     {
          double tmp;
          tmp=left;
          left=right;
          right=tmp;
     }

     virtual void swap2()
     {     
         double tmp;
         tmp=get_left(); // podia fazer tmp=this.get_left();
         set_left( get_right() );
         set_right( tmp );
     }


     virtual Par1v soma1(Par1v o )
     {  Par1v r;
        r.set_left( get_left()+o.get_left() );
        r.set_right( get_right() + o.get_right() );
         return r;
     }

     virtual Par1v soma2(Par1v o) const{ return Par1v( get_left()+o.get_left(), get_right()+o.get_right() ); } 

}; // fim da class Par

int main(){
   Par1v p;
   Par1v q(1.0,1.0);
   Par1v r, s;

   cout<<"\to ponto p=(" << p.get_left() << "," << p.get_right()<< ")" <<endl;
   cout<<"\to ponto q=("<<q.get_left()<<","<<q.get_right()<<")"<<endl<<endl;

   p.set_left(1);
   p.set_right(2);

   cout<<"\tMudar os valores do par p=(1,2) :"<<endl;

   r=q.soma1(p);
   s=p.soma2(q);

   cout<<"\tMudar s:=q+p e r:=p+q"<<endl<<endl;

   cout<<"\tRESULTADOS:"<<endl;

   cout<<"\to ponto p=("<<p.get_left()<<","<<p.get_right()<<")"<<endl;
   cout<<"\to ponto q=("<<q.get_left()<<","<<q.get_right()<<")"<<endl;
   cout<<"\to ponto r=("<<r.get_left()<<","<<r.get_right()<<")"<<endl;
   cout<<"\to ponto s=("<<s.get_left()<<","<<s.get_right()<<")"<<endl<<endl;

   cout<<"\tTrocar as coordenadas no par s e no par r"<<endl<<endl;

   s.swap1();
   r.swap2();

   cout<<"\to ponto r=("<<r.get_left()<<","<<r.get_right()<<")"<<endl;
   cout<<"\to ponto s=("<<s.get_left()<<","<<s.get_right()<<")"<<endl<<endl;


   cout<<"\n\n\tPrima um numero inteiro para sair->";
   int sair; cin>>sair;
   return 0;
}// fim do main

Para criar um subclasse da classe Par, criei um ficheiro novo (igual ao Parv1 so que não tem a parte do main...):

Par.cpp:

#include <iostream>
#include <cmath>
using namespace std;


class Par{
     // declaracao de variaveis
private:
     double left;
     double right;

public:

     Par(){ left=0; right=0;}       
     Par(double n, double m){left=n; right=m;}

     virtual double get_left()  const { return left; }
     virtual double get_right() const { return right;}

     virtual void set_left (double n) { left=n; }
     virtual void set_right(double m) { right=m; }

     virtual void swap1()
     {
          double tmp;
          tmp=left;
          left=right;
          right=tmp;
     }

     virtual void swap2()
     {     
         double tmp;
         tmp=get_left(); // podia fazer tmp=this.get_left();
         set_left( get_right() );
         set_right( tmp );
     }


     virtual Par soma1(Par o )
     {  Par r;
        r.set_left( get_left()+o.get_left() );
        r.set_right( get_right() + o.get_right() );
         return r;
     }

     virtual Par soma2(Par o) const{ return Par( get_left()+o.get_left(), get_right()+o.get_right() ); } 

     virtual void read()
     {
       cout<<"\n\tcoordenada x->";
       cin>>left;
       cout<<"\n\tcoordenada y->";
       cin>>right;

     }       

     virtual int iguais(Par o)const{
       if(get_left()==o.get_left() && get_right()==o.get_right() )
        return 1;
       else
         return 0;       

     }
   virtual double ro()const{
        if(get_left()==0 && get_right()==0 )
          return 0;
        else
          return  sqrt( pow(get_left(),2)+ pow(get_right(),2)  );
 }

 virtual double phi()const{
        if(get_left()==0 && get_right()==0 )
          return 0;
        else
        return asin( get_right()/ro() );
 }


     virtual void print()
     {  cout<<"\to ponto tem as coordenadas ("<<get_left()<<","<<get_right()<<")"<<endl;
  }       
}; // fim da class Par

Ponto.cpp:

#include <iostream>
#include <cmath>
#include "Par.cpp"
using namespace std;

class Ponto: public Par{
private:
public:
 // construtores
 Ponto():Par(){};
 Ponto(double x,double y):Par(x, y){};

 // metodos

 virtual void set_abc(double x){set_left(x);}
 virtual void set_ord(double y){set_right(y);}

 virtual double get_abc()const{ return get_left();};
 virtual double get_ord()const{ return get_right();};


 virtual double distance1(Ponto o){
   double d;
   if(iguais(o)==0)
    d=sqrt( (get_left()-o.get_left())*(get_left()-o.get_left())+ (get_right()-o.get_right())*(get_right()-o.get_right()) );
   else
    if(iguais(o)==1)
     d=0;
   return d; 
 }             


 virtual double distance2(Ponto o){
   double d;
   if(iguais(o)==0)
     d=sqrt( (get_abc()-o.get_abc())*(get_abc()-o.get_abc())+ (get_ord()-o.get_ord())*(get_ord()-o.get_ord()) );
   else
    if(iguais(o)==1)
     d=0;
   return d; 
 } 

 virtual double ro()const{
        if(get_abc()==0 && get_ord()==0 )
          return 0;
        else
          return  sqrt( pow(get_abc(),2)+ pow(get_ord(),2)  );
 }

 virtual double phi()const{
        if(get_abc()==0 && get_ord()==0 )
          return 0;
        else
        return asin( get_ord()/ro() );
 }


}; // fim da class Ponto

UsarPonto1.cpp:

#include <iostream>
#include <cmath>
#include "Ponto.cpp"
using namespace std;



int main(){

   Ponto p;
   Ponto q(2,2);
   Par r;
   Ponto s, t;
   double d1,d2;

   p.set_abc(1);
   p.set_right(2);

   cout<<"Estou a usar os metodos do Par, para escreve o seguinte"<<endl;
   cout<<"\to ponto p=(" << p.get_left() << "," << p.get_right()<< ")" <<endl;
   cout<<"\to ponto q=("<<q.get_left()<<","<<q.get_right()<<")"<<endl<<endl;

   cout<<"Estou a usar os metodos do Ponto, para escreve o seguinte"<<endl;
   cout<<"\to ponto p=(" << p.get_abc() << "," << p.get_ord()<< ")" <<endl;
   cout<<"\to ponto q=("<<q.get_abc()<<","<<q.get_ord()<<")"<<endl<<endl;

   d1=p.distance1(q);
   d2=p.distance2(q);

   cout<<"O valor da distancia entre p e q e' : d1="<<d1<<" d2="<<d2<<endl;


   p.swap1();
   cout<<"\tTrocar as coordenadas...o ponto p=(" << p.get_abc() << "," << p.get_ord()<< ")" <<endl;


   r=q.soma1(p);
   cout<<"\to ponto r=("<<r.get_left()<<","<<r.get_right()<<")"<<endl<<endl;


   q.swap1();
   cout<<"\tTrocar as coordenadas...o ponto q=(" << q.get_abc() << "," << q.get_ord()<< ")" <<endl;



   s.set_left(5);
   s.set_right(6);
   cout<<"Estou a usar os metodos do Par, para  o ponto s=(5,6)"<<endl;
   cout<<"\to ponto s=(" << s.get_left() << "," << s.get_right()<< ")" <<endl;

   t.set_abc(5);
   t.set_ord(6);   

   cout<<"Estou a usar os metodos do Ponto, para o ponto t=(5,6)"<<endl;
    cout<<"\to ponto t=("<<t.get_abc()<<","<<t.get_ord()<<")"<<endl<<endl;

   cout<<"\n\n\tPrima um numero inteiro para sair->";
   int sair; cin>>sair;


   }// fim do main

UsarPonto2.cpp:

#include <iostream>
#include <cmath>
#include "Ponto.cpp"
using namespace std;



int main(){

   Ponto p;
   Ponto q;
   Par r;
   int opcao=1;
   double x,y;
   double d;

   while(opcao!=0)
   { 
       cout<<"\n\n\t1- introduzir 2 pontos de coordenadas cartesianas -> p1,p2 \n ";
       cout<<"\t2- Trocar as coordenadas de p1 \n";
       cout<<"\t3- Trocar as coordenadas de p2 \n";
       cout<<"\t4- Calcular a distancia entre p1 e p2  \n"; 
       cout<<"\t5- Converter as coordenadas de p1 para coordenadas polares\n";
       cout<<"\t6- Converter as coordenadas de p2 para coordenadas polares\n";
       cout<<"\t0- Sair\n";
       cout<<"\t Opcao->";
       cin>>opcao;

       switch(opcao)
       { case 0: {cout<<"\tXAU...."; break;}
         case 1:{
                   cout<<"\tIntroduza o primeiro ponto->";
                   cin>>x>>y;
                   p.set_abc(x);
                   p.set_ord(y);
                   cout<<"\tIntroduza o segundo ponto->";
                   cin>>x>>y;
                   q.set_abc(x);
                   q.set_ord(y);
                   cout<<"\to ponto p=(" << p.get_abc() << "," << p.get_ord()<< ")" <<endl;
                   cout<<"\to ponto q=("<<q.get_abc()<<","<<q.get_ord()<<")"<<endl<<endl;
                   break;     
                }
         case 2:{p.swap1();
                  cout<<"\tTrocou as coordenadas...o ponto p=(" << p.get_abc() << "," << p.get_ord()<< ")" <<endl;
                  break;

                }
         case 3:{ q.swap1();
                  cout<<"\tTrocou as coordenadas...o ponto q=(" << q.get_abc() << "," << q.get_ord()<< ")" <<endl;
                  break;
                }
         case 4:{
                 d=q.distance1(p);
                 cout<<"\tO valor da distancia entre p e q e' : d="<<d<<endl;
                 break;
                }
         case 5:{
                  cout<<"\to ponto em coordenadas cartesianas p=(" << p.get_abc() << "," << p.get_ord()<< ")" <<endl;
                  cout<<"\to ponto em coordenadas polares p=(" << p.ro()<< "," << p.phi()<< ")" <<endl;
                  break;
                }
         case 6:{cout<<"\to ponto em coordenadas cartesianas q=(" << q.get_abc() << "," << q.get_ord()<< ")" <<endl;
                  cout<<"\to ponto em coordenadas polares q=(" << q.ro()<< "," << q.phi()<< ")" <<endl;
                  break;
                }
         default: cout<<"\tJa fizeste asneiras....algo esta errado...\n";

       };

    }             

   return 0;
}// fim do main

se tiverem alguma dúvida perguntem... ;) e espero que percebem o que apresentei:

resumo:

Par1v.cpp

Par.cpp (não tem o main...)

Ponto.cpp (não tem o main...)

2 versões diferentes para usar o Ponto, e consequentemente o Par ;)

UsarPonto1.cpp (so tem main pois vai usar o Ponto...)

UsarPonto2.cpp (so tem main pois vai usar o Ponto...)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora