// clasa DATA.cpp //operatii privind data calendaristica #include "stdafx.h" #include #include #include class data { int zi; int luna; int an; static int nrzile[12]; static char *denluna[12]; static char *zisapt[7]; public: data (int,int,int); //constructor pornind de la trei intregi data() //constructor pornind de la data furnizata de sistem { time_t ltime; time( <ime ); zi=localtime(<ime)->tm_mday; luna=localtime(<ime)->tm_mon+1; an=localtime(<ime)->tm_year+1900; } void zile_data(long); int isAnBisect() //functie test daca un an este sau nu bisect { if (an%400==0||an%100!=0 &&an%4==0) return 1; return 0; }; long data_zile(); int retzi(); int retluna(); int retan(); char* ziua_din_sapt(); int zi_din_an(); int isSfarsitLuna () //functie test daca o zi este sau nu ultima din luna { if(zi==(nrzile[luna-1]+(luna==2&&isAnBisect()))) return 1; else return 0; } int isInceputLuna () //functie test daca o zi este sau nu prima din luna { if(zi==1) return 1; else return 0; } int isSarbatoare () //functie test de sarbatoare legala (sambata, duminica, //1 mai, 1, 25, 26 decembrie) { int z=zi_din_an(); if( z==121||z==335||z==359||z==360||(ziua_din_sapt()==zisapt[0]) ||(ziua_din_sapt()==zisapt[6])) return 1; else return 0; } void afisare (); int validare(int,int,int); void afisare (char); data & operator + (int ); data & operator - (int ); data & operator ++ (); data & operator ++ (int); data & operator -- (); data & operator -- (int); long operator - (data); friend ostream & operator << (ostream &,data ); friend istream & operator >> (istream &,data&); }; int data::nrzile[12]={31,28,31,30,31,30, 31,31,30,31,30,31}; //vector ce contine numarul zilelor lunilor din an char *data::denluna[12]={ "ianuarie","februarie","martie", "aprilie","mai","iunie","iulie", "august","septembrie","octombrie", "noiembrie","decembrie" }; //vector ce contine denumirile lunilor din an char *data::zisapt[7]={ "duminica","luni","marti", "miercuri","joi","vineri", "sambata" }; //vector ce contine denumirile zolelor din saptamana data::data (int z, int l, int a) //constructor pornind de la 3 intregi,validand incadrarea //in intervale posibile (1-28/29/30/31 pentru zi, //1-12 pentru luna, 1900-2100 pentru an) { if(validare(z,l,a)) { zi=z; luna=l; an=a; } else { zi=1; luna=1; an=1900; } }; int data ::validare(int z,int l,int a) //functie ce valideaza incadrarea in intervale posibile { int b=data::isAnBisect(); if (a<1900 || a>2100) return 0; if (l<1 || l>12) return 0; if (z<1 || z>nrzile[l-1]+(l==2&&b)) return 0; return 1; } long data::data_zile () //functie ce transforma data curenta in numar de zile // fata de 1 ianuarie 1900 { int b=data::isAnBisect(); long totzile=0; totzile=(an-1900)*365 + (int)((an-1900-1)/4) + 1; for (int l=1;l365+b;an++) { b=data::isAnBisect(); z-=(365+b); } b=data::isAnBisect(); for (luna=1;z>data::nrzile[luna-1]+(((luna==2)&&b)?1:0);luna++) z-=(data::nrzile[luna-1]+(((luna==2)&&b)?1:0)); zi=z; } int data::zi_din_an() //functie ce determina a cata zi din an este data curenta { int b=data::isAnBisect(); int z=zi; int l=luna; int zile=0; for (l=1;l>(istream &intr,data &d) { cout<<"Ziua:"; intr>>d.zi; cout<<"Luna:"; intr>>d.luna; cout<<"Anul:"; intr>>d.an; while (!d.validare(d.zi,d.luna,d.an)) { cout<<"Eroare!!!"<>d.zi; cout<<"Luna:"; intr>>d.luna; cout<<"Anul:"; intr>>d.an; } return intr; } data &data:: operator + (int t) { long z; data d1(zi,luna,an); z=d1.data_zile(); z+=t; d1.zile_data(z); return d1; } data& data :: operator - (int t) { long z; data d1(zi,luna,an); z=d1.data_zile(); z-=t; d1.zile_data(z); return d1; } data & data :: operator ++ () //++d, pentru preincrementare //operatia de preincrementare determina marirea datei //cu o zi { long z; z=data_zile(); z++; zile_data(z); return *this; } data & data :: operator ++ (int a) //d++ pentru postincrementare //primeste un parametru intreg ce nu va fi utilizat //in functie //operatia de postincrementare determina marirea datei //cu o saptamana { long z=data_zile(); z+=7; zile_data(z); return *this; } data & data :: operator -- () //--d, pentru predecrementare { long z; z=data_zile(); z--; zile_data(z); return *this; } data & data :: operator -- (int a) //d--, pentru postdecrementare { long z=data_zile(); z-=7; zile_data(z); return *this; } long data ::operator -(data d) //d1-d2 , pentru determinarea numarului de zile cuprinse //intre doua date { return (data_zile()-d.data_zile()>0)?data_zile()-d.data_zile():0; } ///end clasa data //functii externe pentru testarea clasei: data & concediu(data &d,int zile_conc) //functie pentru aflarea datei de intoarcere din concediu //( dat in zile lucratoare) { data d1(d.retzi(),d.retluna(),d.retan()); data d2(d.retzi(),d.retluna(),d.retan()); int zile=0; while (zile_conc>0) { d2=(d1+zile); if (d2.isSarbatoare()==0) { zile_conc--;} zile++; } d2=d1+zile; return d2; } int prima_zi(int l,int a) //functie pentru aflarea datei bonificarii lunare //a unei dobanzi - prima zi lucratoare dupa trecerea lunii { data d1(1,l,a); int i=0; int sw=0; while (!sw) { if (d1.isSarbatoare()==0) { sw=1; } else ++d1; } return (d1.retzi()); } int main(int argc, char* argv[]) { /*data d(14,1,2002); cout<>d; cout<