Programare Orientata pe Obiecte


Supraincarcarea operatorilor

Sa se o clasa ce impliemenetaza notiunea de data calendaristica. Sa se supraincarce operatul + pentru a realiza suma dintre o data calnedaristica si un numar de zile, - pentru a realiza diferenta a dintre doua date calendaristice.

  1 #include <iostream>
    #include <conio.h>
    #include <math.h>
    
  5 using namespace std; 
    
    /** Clasa ce implementeaza notiunea de data calendaristica*/
    class DataC{
     private:
 10    int zi;
       int luna;
       int an;
       static int nrZL[]; //retine numarul de zile din fiecare luna a anului
     public:
 15    DataC(); //constructor implicit
       DataC(long timeStamp);
       DataC(int zi,int luna,int an);
    
       static int getNrZL(int luna,int an); // determina numarul de zile dintr-o luna
 20    static int isBisect(int an); //verifica daca un an este bisect.
       static int getNrZA(int an); //determina numarul de zile dintr-un an.
    
       int getNrZileInceput();
           //intoarce nr de zile de la inceputul anului pana in ziua curenta
 25    int getNrZileSfarsit();
           //intoarce nr de zile pana la sfarsitul anului de la ziua curenta
    
       DataC operator+(int); //data obtinuta prin adaugarea unui nr de zile
       friend long operator-(DataC&,DataC&); //nr de zile dintre cele doua date
 30 
       friend  ostream& operator<<(ostream&,DataC);
       friend  istream& operator>>(istream&,DataC&);
       long getTimeStamp(); // intoarce numarul de zile de la 01.01.1600
    };
 35 
    
    int DataC::nrZL[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    /**Constructor implicit*/
 40 DataC::DataC(){
      zi=1;
      luna=1;
      an=1600;
    }
 45 /** Construieste o data calendaristica pe baza numarului de zile trecute de la 01.01.1600*/
    DataC::DataC(long timeStamp){
      an=1600;
      //determin anul
      while(timeStamp>getNrZA(an)){
 50     timeStamp-=getNrZA(an);
         an++;
      }
      //determin luna
      luna=1;
 55   while(timeStamp>getNrZL(luna,an)){
        timeStamp-=getNrZL(luna,an);
        luna++;
      }
      zi=timeStamp;
 60 }
    
    DataC::DataC(int zi,int luna,int an){
      this->zi=zi;
      this->luna=luna;
 65   this->an=an;
    }
    /** Determina numarul de zile dintr-o luna*/
    int DataC::getNrZL(int luna,int an){
      if (isBisect(an) && luna==2) return (nrZL[luna])+1;
 70   else return nrZL[luna];
    }
    /**Determina daca un an este bisect*/
    int DataC::isBisect(int an){
      return an%4==0 && an%100 || an%400==0;
 75 }
    /**Determina numarul de zike dintr-un an*/
    int DataC::getNrZA(int an){
      if (isBisect(an)) return 366;
      else return 365;
 80 }
    /**intoarce nr de zile de la inceputul anului pana in ziua curenta*/
    int DataC::getNrZileInceput(){
      int zile=zi;
    
 85   for (int i=1;i<luna;i++) zile+=getNrZL(i,an);
      return zile;
    }
    /**intoarce nr de zile pana la sfarsitul anului de la ziua curenta*/
    int DataC::getNrZileSfarsit(){
 90   int zile=getNrZL(luna,an)-zi;
    
      for (int i=luna+1;i<=12;i++) zile+=getNrZL(i,an);
      return zile;
    }
 95 
    DataC DataC::operator+(int nrZile){
      return DataC(getTimeStamp()+nrZile);
    }
    
100 long operator-(DataC& d1,DataC& d2){
     return d2.getTimeStamp()-d1.getTimeStamp();
    }
    
    ostream& operator<<(ostream& stream,DataC dc){
105   stream<<dc.zi<<"-"<<dc.luna<<"-"<<dc.an;
      return stream;
    }
    
    istream& operator>>(istream& stream,DataC& dc){
110   cout<<"Zi = ";
      cin>>dc.zi;
      cout<<"Luna = ";
      stream>>dc.luna;
      cout<<"An = ";
115   stream>>dc.an;
      return stream;
    }
    //intoarce numarul de zile de la 01.01.1600
    long DataC::getTimeStamp(){
120  long nrZile=0;
     int i;
     for(i=1600;i<an;i++){
      nrZile+=getNrZA(i);
     }
125 
     for(i=1;i<luna;i++){
      nrZile+=getNrZL(i,an);
     }
    
130  nrZile+=zi;
     return nrZile;
    }
    
    
135 
    int main(){
    
      DataC a(8,1,2002),b(1,1,2001),c;
    
140   cout<<a<<"\n";
      cout<<a.getTimeStamp()<<endl;
      DataC d(a.getTimeStamp());
      cout<<d<<"\n";
      //cout<<b<<"\n\n";
145   //cin>>c;
      //cout<<c<<"\n";
      //cout<<DataC::isBisect(2000)<<"\n";
      //cout<<DataC::getNrZL(2,2000);
      //cout<<DataC::getNrZA(2000)<<"\n";
150   //cout<<a.getNrZileInceput();
      //cout<<a.getNrZileSfarsit()<<"\n";
      //cout<<(a+(365+216+365));
      cout<<(b+372);
      getch();
155   return 0;
    }
     

Implementati o clasa ce realizeaza operatii cu numere mari.

#include <iostream>
#include <conio.h>

using namespace std;

/** Implementeza notiunea de numar mare*/
class Numar{
  protected:
    int *cifre;  //retine cifrele numarului
    int nrCifre; //numarul de cifre.
  public:
    Numar(long n = 0);
    Numar(const Numar&);
    Numar(int n,int *cifre);
    ~Numar();
    Numar& operator= (const Numar&);
    Numar operator+ (Numar&);
    Numar operator ++(); //supraincarcarea pentru a permite ++n
    Numar operator ++(int n=0); //supraincarcarea pentru a permite n++;
    int operator[](int index);
    friend ostream& operator << (ostream&, const Numar&);
    friend istream& operator >> (istream&, Numar&);
};

Numar::Numar(long n){
  int c[10],nc,i;
  if(n!=0){
      for (nc=0;n>0;nc++){
          c[nc]=n%10;
          n=n/10;
      }
      this->nrCifre=nc;
      cifre=new int[nc];
      for(i=0;i<nc;i++){
            cifre[i]=c[nc-i-1];          
      }
 } else {      
      this->nrCifre=1;
      cifre=new int[1];
      cifre[0]=0;
 } 
}

Numar::Numar(const Numar &nr){
  nrCifre=nr.nrCifre;
  cifre=new int[nrCifre];
  for (int i=0;i<nrCifre;i++) cifre[i]=nr.cifre[i];
}

Numar::Numar(int n,int *cifre){
  nrCifre=n;
  this->cifre=new int[nrCifre];
  for (int i=0;i<nrCifre;i++) this->cifre[i]=cifre[i];
}

Numar::~Numar(){
 if (cifre) delete []cifre;
 cifre=0;
 nrCifre = 0;
}

Numar& Numar::operator=(const Numar& nr){
  if (this!=&nr) {
    if (cifre) delete []cifre;
    nrCifre=nr.nrCifre;
    cifre=new int[nr.nrCifre];
    for (int i=0;i<nrCifre;i++) cifre[i]=nr.cifre[i];
  }
  return *this;
}

Numar Numar::operator+(Numar& nr){
  int max=nrCifre>=nr.nrCifre?nrCifre:nr.nrCifre;
  max++;
  int *tmp=new int[max];
  int t=0,i=0;

  for (i=0;i<max;i++) tmp[i]=0;
  for (i=0;i<nrCifre;i++) tmp[max-i-1]=cifre[nrCifre-i-1];
  for (i=0;i<nr.nrCifre;i++) {
      tmp[max-i-1]+=nr.cifre[nr.nrCifre-i-1]+t;
      t=tmp[max-i-1]/10;
      tmp[max-i-1]=tmp[max-i-1]%10;
    }
  for (int j=max-i-1;j>=0;j--){
    tmp[j]+=t;
    t=tmp[j]/10;
    tmp[j]=tmp[j]%10;
  }
  if (tmp[0]== 0){
     return Numar(max-1,tmp+1);
  } else {
     return Numar(max,tmp);
  }

}

Numar Numar::operator ++ (){
      Numar unu=1;
      *this = *this + unu;
      return *this;
}
Numar Numar::operator ++ (int n){
      Numar unu=1;
      *this = *this + unu;
      return *this;
}
int Numar::operator [] (int index){
      return cifre[index];
}
ostream& operator<<(ostream& stream,const Numar &nr){
  for (int i=0;i<nr.nrCifre;i++) stream<<nr.cifre[i];
  return stream;
}

istream& operator>>(istream& stream, Numar &nr){
  cout<<"nrCifre = ";
  stream>>nr.nrCifre;
  if (nr.cifre) delete []nr.cifre;
  nr.cifre=new int[nr.nrCifre];
  for (int i=0;i<nr.nrCifre;i++) {
    cout<<"cifra["<<i+1<<"] = ";
    stream>>nr.cifre[i];
  }
  return stream;
}

int main(){
  Numar n, m, p;
  cin>>n;
  cout<<"n="<<n<<endl;
  cin>>m;
  cout<<"m="<<m<<endl;
  p = n+m;
  cout<<"p=n+m="<<p<<endl;
  p++;
  cout<<"p++ : "<<p<<endl;
  ++p;
  cout<<"++p :"<<p<<endl;
  cout<<"prima cifra a lui p="<<p[0]<<endl;
  getch();
}

Tema

  1. Suprancarcati pentru clasa Numar prezentata anterior operatorii: <,>,<=,>=, ==.

  2. Implementi clasa Polinom pentru care supraincarcati operatorii +, -,*.

  3. Implementati clasa MatriceRara (o matrice cu majoritatea elementelor nule). Supraincarcati operatorii:

    • + pentru a realiza suma dintre doua matrici

    • - pentru a realiza diferentza dintre doua matrici

    • * pentru a realiza intmultirea dintre un numar si o matrice, respectiv inmultirea dintre doua matrici

    • ~ pentru a determina inversa unei matrici

    .