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
.