Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- #include <string.h>
- using namespace std;
- class Data {
- private:
- int zi;
- int luna;
- int an;
- public:
- Data(int zi=1, int luna=1, int an=1600);
- Data(long timestamp);//Ii dau numarul de zile trecute de la data de referinta 1.1.1600 si calculeaza data corespunzatoare.
- Data(const Data &d);
- ~Data();
- void setZi(int zi);
- int getZi();
- void setLuna(int luna);
- int getLuna();
- void setAn(int an);
- int getAn();
- void citire();
- void afisare();
- void afisare(char *format);
- long getTimeStamp();//Calculeaza cate zile au trecut de la o data de referinta (1.1.1600) pana la data memorata in obiectul curent
- static int nrZileLuna[];
- static int esteBisect( int an);
- static int getNrZileAn(int an);
- static int getNrZileLuna(int luna, int an);
- static int esteValid(int zi, int luna, int an);
- static Data ziuaUrmatoare(Data d);
- };
- Data::Data(int zi, int luna, int an) {
- this->zi=zi;
- this->luna=luna;
- this->an=an;
- //cout<<"Apelam constructor cu parametri"<<endl;
- }
- Data::Data(const Data &d) {
- this->zi=d.zi;
- this->luna=d.luna;
- this->an=d.an;
- //cout<<"Apelam constructorul de copiere"<<endl;
- }
- Data::Data(long timestamp){ //construieste un obiect de tip data calendaristica dand un numar de zile trecute de la 1.1.1600
- //plec de la anul 1600
- for(an=1600;timestamp-getNrZileAn(an)>0;an++)
- timestamp=timestamp-getNrZileAn(an);
- //cand se termina forul anterior am termit de calculat anul
- //calculez luna
- for(luna=1;timestamp-getNrZileLuna(luna, an)>0;luna++)
- timestamp=timestamp-getNrZileLuna(luna, an);
- // ce ramane e ziua
- zi = timestamp;
- }
- Data::~Data() {
- // cout<<"Apel destructor";
- }
- void Data::setZi(int zi) {
- int ziCorecta=getNrZileLuna(luna,an);
- if(zi==ziCorecta)
- this->zi=zi;
- }
- int Data::getZi() {
- return zi;
- }
- void Data::setLuna(int luna) {
- if(luna>0 && luna<=12) {
- this->luna=luna;
- } else {
- cout<<"Dati luna intre 1 si 12"<<endl;
- }
- }
- int Data::getLuna() {
- return luna;
- }
- void Data::setAn(int an) {
- if(an>=0 && an<=2050) {
- this->an=an;
- } else {
- cout<<"Dati an intre 0 si 2050"<<endl;
- }
- }
- int Data::getAn() {
- return an;
- }
- void Data::citire() {
- cout<<"Introduceti ziua ";
- cin>>zi;
- cout<<"Introduceti luna ";
- cin>>luna;
- cout<<"Introduceti anul ";
- cin>>an;
- }
- void Data::afisare() {
- cout<<zi<<"."<<luna<<"."<<an;
- }
- int Data:: nrZileLuna[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
- int Data:: esteBisect( int an) {
- return (an%4 ==0 && an%100!=0)|| (an%400 ==0);
- }
- int Data:: getNrZileAn(int an){
- return 365 + esteBisect(an);
- }
- int Data::getNrZileLuna(int luna, int an) {
- return nrZileLuna[luna]+(luna==2?esteBisect(an):0);
- }
- int Data:: esteValid(int zi, int luna, int an) { //fuctia returneaza 1 daca data este valida, 0 altfel
- if(luna>=1 && luna<=12 && an>=0 && an <2050 && zi>=1 && zi<=getNrZileLuna(luna,an)) {
- return 1;
- } else {
- return 0;
- }
- }
- Data Data::ziuaUrmatoare(Data d){
- long zileTrecute = d.getTimeStamp();
- zileTrecute++;
- Data d2(zileTrecute);
- return d2;
- }
- void Data::afisare(char format[]) {
- if (strcmp(format,"zz/ll/aaaa")==0) {
- cout<<zi<<"/"<<luna<<"/"<<an;
- } else if (strcmp(format,"ll/zz/aaaa")==0) {
- cout<<luna<<"/"<<zi<<"/"<<an;
- } else if (strcmp(format,"aaaa/ll/zz")==0) {
- cout<<an<<"/"<<luna<<"/"<<zi;
- } else {
- cout<<"Format invalid";
- }
- }
- long Data::getTimeStamp(){
- int i;
- long zile=0;
- //Adun cate zile au anii precedenti incepand de la 1600
- for(i=1600;i<an;i++){
- zile+=getNrZileAn(i);
- }
- //Adun zilele din lunile anului curent pana la luna in curs
- for(i=1;i<luna;i++){
- zile+=getNrZileLuna(i,an);
- }
- zile+=zi;
- return zile;
- }
- int main() {
- if(Data::esteValid(31,4,1900)) {
- cout<<"Data valida"<<endl;
- } else {
- cout<<"Data invalida"<<endl;
- }
- Data d(28,2,2020);
- d.afisare("aaaa/ll/zz");
- cout<<endl;
- d.afisare("zz/ll/aaaa");
- cout<<endl;
- d.afisare("ll/zz/aaaa");
- cout<<endl;
- cout<<"Time stamp (zile trecute de la 1600):" <<d.getTimeStamp()<<endl;
- Data d2 = Data::ziuaUrmatoare(d);
- cout<<"Ziua urmatoare: ";
- d2.afisare();
- cout<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment