madalinaradu

Data calendaristica

Apr 15th, 2019
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. class Data {
  8. private:
  9.     int zi;
  10.     int luna;
  11.     int an;
  12. public:
  13.     Data(int zi=1, int luna=1, int an=1600);
  14.     Data(long timestamp);//Ii dau numarul de zile trecute de la data de referinta 1.1.1600 si calculeaza data corespunzatoare.
  15.     Data(const Data &d);
  16.     ~Data();
  17.     void setZi(int zi);
  18.     int getZi();
  19.     void setLuna(int luna);
  20.     int getLuna();
  21.     void setAn(int an);
  22.     int getAn();
  23.     void citire();
  24.     void afisare();
  25.     void afisare(char *format);
  26.     long getTimeStamp();//Calculeaza cate zile au trecut de la o data de referinta (1.1.1600) pana la data memorata in obiectul curent
  27.     static int nrZileLuna[];
  28.     static int esteBisect( int an);
  29.     static int getNrZileAn(int an);
  30.     static int getNrZileLuna(int luna, int an);
  31.     static int esteValid(int zi, int luna, int an);
  32.     static Data ziuaUrmatoare(Data d);
  33. };
  34.  
  35. Data::Data(int zi, int luna, int an) {
  36.     this->zi=zi;
  37.     this->luna=luna;
  38.     this->an=an;
  39.     //cout<<"Apelam constructor cu parametri"<<endl;
  40. }
  41. Data::Data(const Data &d) {
  42.     this->zi=d.zi;
  43.     this->luna=d.luna;
  44.     this->an=d.an;
  45.     //cout<<"Apelam constructorul de copiere"<<endl;
  46. }
  47.  
  48.  
  49. Data::Data(long timestamp){ //construieste un obiect de tip data calendaristica dand un numar de zile trecute de la 1.1.1600
  50.     //plec de la anul 1600
  51.     for(an=1600;timestamp-getNrZileAn(an)>0;an++)
  52.         timestamp=timestamp-getNrZileAn(an);
  53.     //cand se termina forul anterior am termit de calculat anul
  54.  
  55.     //calculez luna
  56.     for(luna=1;timestamp-getNrZileLuna(luna, an)>0;luna++)
  57.         timestamp=timestamp-getNrZileLuna(luna, an);
  58.  
  59.     // ce ramane e ziua
  60.     zi = timestamp;
  61. }
  62.  
  63. Data::~Data() {
  64.    // cout<<"Apel destructor";
  65. }
  66.  
  67. void Data::setZi(int zi) {
  68.     int ziCorecta=getNrZileLuna(luna,an);
  69.     if(zi==ziCorecta)
  70.         this->zi=zi;
  71. }
  72.  
  73. int Data::getZi() {
  74.     return zi;
  75. }
  76. void Data::setLuna(int luna) {
  77.     if(luna>0 && luna<=12) {
  78.         this->luna=luna;
  79.     } else {
  80.         cout<<"Dati luna intre 1 si 12"<<endl;
  81.     }
  82. }
  83. int Data::getLuna() {
  84.     return luna;
  85. }
  86. void Data::setAn(int an) {
  87.     if(an>=0 && an<=2050) {
  88.         this->an=an;
  89.     } else {
  90.         cout<<"Dati an intre 0 si 2050"<<endl;
  91.     }
  92. }
  93. int Data::getAn() {
  94.     return an;
  95. }
  96. void Data::citire() {
  97.     cout<<"Introduceti ziua  ";
  98.     cin>>zi;
  99.     cout<<"Introduceti luna ";
  100.     cin>>luna;
  101.     cout<<"Introduceti anul ";
  102.     cin>>an;
  103. }
  104. void Data::afisare() {
  105.     cout<<zi<<"."<<luna<<"."<<an;
  106. }
  107.  
  108.  
  109. int Data:: nrZileLuna[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
  110.  
  111. int Data:: esteBisect( int an) {
  112.     return (an%4 ==0 && an%100!=0)|| (an%400 ==0);
  113. }
  114.  
  115. int Data:: getNrZileAn(int an){
  116.     return 365 + esteBisect(an);
  117. }
  118. int Data::getNrZileLuna(int luna, int an) {
  119.     return nrZileLuna[luna]+(luna==2?esteBisect(an):0);
  120. }
  121.  
  122. int Data:: esteValid(int zi, int luna, int an) { //fuctia returneaza 1 daca data este valida, 0 altfel
  123.     if(luna>=1 && luna<=12 && an>=0 && an <2050 && zi>=1 && zi<=getNrZileLuna(luna,an)) {
  124.         return 1;
  125.     } else {
  126.         return 0;
  127.     }
  128. }
  129.  
  130. Data Data::ziuaUrmatoare(Data d){
  131.     long zileTrecute = d.getTimeStamp();
  132.     zileTrecute++;
  133.     Data d2(zileTrecute);
  134.  
  135.     return d2;
  136. }
  137.  
  138. void Data::afisare(char format[]) {
  139.     if (strcmp(format,"zz/ll/aaaa")==0) {
  140.         cout<<zi<<"/"<<luna<<"/"<<an;
  141.     } else  if (strcmp(format,"ll/zz/aaaa")==0) {
  142.         cout<<luna<<"/"<<zi<<"/"<<an;
  143.     } else  if (strcmp(format,"aaaa/ll/zz")==0) {
  144.         cout<<an<<"/"<<luna<<"/"<<zi;
  145.     } else {
  146.         cout<<"Format invalid";
  147.     }
  148. }
  149.  
  150. long Data::getTimeStamp(){
  151.     int i;
  152.     long zile=0;
  153.  
  154.     //Adun cate zile au anii precedenti incepand de la 1600
  155.     for(i=1600;i<an;i++){
  156.         zile+=getNrZileAn(i);
  157.     }
  158.  
  159.     //Adun zilele din lunile anului curent pana la luna in curs
  160.     for(i=1;i<luna;i++){
  161.         zile+=getNrZileLuna(i,an);
  162.     }
  163.     zile+=zi;
  164.     return zile;
  165. }
  166.  
  167. int main() {
  168.     if(Data::esteValid(31,4,1900)) {
  169.         cout<<"Data valida"<<endl;
  170.     } else {
  171.         cout<<"Data invalida"<<endl;
  172.     }
  173.  
  174.     Data d(28,2,2020);
  175.  
  176.     d.afisare("aaaa/ll/zz");
  177.     cout<<endl;
  178.     d.afisare("zz/ll/aaaa");
  179.     cout<<endl;
  180.     d.afisare("ll/zz/aaaa");
  181.     cout<<endl;
  182.     cout<<"Time stamp (zile trecute de la 1600):" <<d.getTimeStamp()<<endl;
  183.  
  184.     Data d2 = Data::ziuaUrmatoare(d);
  185.     cout<<"Ziua urmatoare: ";
  186.     d2.afisare();
  187.     cout<<endl;
  188.  
  189.  
  190.     return 0;
  191.  
  192. }
Advertisement
Add Comment
Please, Sign In to add comment