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(); }
Suprancarcati pentru clasa Numar prezentata anterior operatorii: <,>,<=,>=, ==.
Implementi clasa Polinom pentru care supraincarcati operatorii +, -,*.
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
.