Alx09

Ex 23 POOO bun

Feb 19th, 2021
675
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <list>
  3. #include <iterator>
  4. #include <conio.h>
  5. #include <string>
  6. #include <exception>
  7. #include <fstream>
  8. #define _CRT_SECURE_NO_WARNING
  9. using namespace std;
  10.  
  11. class MyException : public exception {
  12. private:
  13.     string mesajEroare;
  14. public:
  15.  
  16.     MyException(string mesajEroare) {
  17.  
  18.         this->mesajEroare = mesajEroare;
  19.     }
  20.     const char* what() const throw() {
  21.         if (mesajEroare == "out_limit") return "Valoarea este inafara intervalului";
  22.         if (mesajEroare == "lista_goala") return "lista este goala";
  23.         return "Eroare neprevazuta";
  24.     }
  25. };
  26. ostream & linie(ostream &out) {
  27.     out << "------------------------\n";
  28.     return out;
  29. }
  30. class Pachet;
  31. class Cazare {
  32.     int tipDerivat;
  33.     string nume;
  34.     string adresa;
  35.     double pret;
  36. public:
  37.     Cazare(int tipDerivat, string nume, string adresa, double pret)
  38.     {
  39.         this->tipDerivat = tipDerivat;
  40.         this->nume = nume;
  41.         this->adresa = adresa;
  42.         this->pret = pret;
  43.     }
  44.     int getTip() { return tipDerivat; }
  45.     virtual int getStele() = 0;
  46.     virtual void afisare_cazare()
  47.     {
  48.         cout << tipDerivat << "| " << nume << " " << adresa << " " << pret << " ";
  49.     }
  50.     virtual void SalvareFiser(fstream &out) {
  51.         out << nume << endl;
  52.         out << adresa << endl;
  53.         out << pret << endl;
  54.         out << tipDerivat << endl;
  55.     }
  56.     void setNume(string nume) {
  57.         this->nume = nume;
  58.     }
  59.     virtual Cazare & operator++() = 0;
  60.     virtual Cazare & operator--() = 0;
  61.     void modificare_nume(string denumire)
  62.     {
  63.         nume = denumire;
  64.     }
  65.     string getNume() { return nume; }
  66.     string getAdressa() { return adresa; }
  67.  
  68. };
  69.  
  70.  
  71. class Hotel : public Cazare
  72. {
  73.     int nrStele;
  74.     string personalPremium;
  75.     static int stele[8];
  76. public:
  77.     Hotel(int tipDerivat, string nume, string adresa, double pret, int nrStele) : Cazare(tipDerivat, nume, adresa, pret)
  78.     {
  79.         this->nrStele = nrStele;
  80.         if (this->nrStele <= 3)  personalPremium = "NU";
  81.         else personalPremium = "DA";
  82.         stele[nrStele]++;
  83.  
  84.     }
  85.     static void AfisareStele() { for (int i = 7; i > 0; i--)cout << i << " stele " << stele[i] << " unitati" << endl; }
  86.     void setPersonal(string text) {
  87.         personalPremium = text;
  88.     }
  89.     int getStele() { return nrStele; };
  90.     void afisare_cazare()
  91.     {
  92.         Cazare::afisare_cazare();
  93.         cout << nrStele << " " << personalPremium << endl;
  94.     }
  95.     void SalvareFiser(fstream &out) {
  96.         Cazare::SalvareFiser(out);
  97.         out << nrStele << endl;
  98.     }
  99.  
  100.     Cazare & operator++()
  101.     {
  102.         if (nrStele == 7) {
  103.             cout << "Nu se poate da mai mult de 7 stele" << endl;
  104.             return *this;
  105.         }
  106.         if (nrStele > 3) setPersonal("DA");
  107.         stele[nrStele]--;
  108.         nrStele++;
  109.         stele[nrStele]++;
  110.         return *this;
  111.     }
  112.  
  113.     Cazare& operator--()
  114.     {
  115.         if (nrStele == 1) {
  116.             cout << "Nu se poate da mai putin de  o stea" << endl;
  117.             return *this;
  118.         }
  119.         stele[nrStele]--;
  120.         nrStele--;
  121.         stele[nrStele]++;
  122.         if (nrStele > 3) setPersonal("NU");
  123.  
  124.         return *this;
  125.     }
  126.  
  127. };
  128. int Hotel::stele[8] = {};
  129. istream & operator>>(istream &in, Hotel *&h) {
  130.     string nume;
  131.     string adresa;
  132.     double pret;
  133.     int nrStele;
  134.     bool ok;
  135.     cout << "Nume: "; in >> nume;
  136.     cout << "Adresa: "; in >> adresa;
  137.     cout << "Pret: "; in >> pret;
  138.     do {
  139.         try {
  140.             cout << "Numar de stele: "; in >> nrStele;
  141.             if (nrStele < 1 || nrStele > 7) throw MyException("out_limit");
  142.             ok = true;
  143.         }
  144.         catch (MyException &e) {
  145.             cerr << e.what() << endl;
  146.             ok = false;
  147.         }
  148.     } while (ok == false);
  149.     h = new Hotel(0, nume, adresa, pret, nrStele);
  150.     return in;
  151. }
  152.  
  153.  
  154. class Pensiune : public Cazare {
  155.     int nrMargarete;
  156.     string tipPensiune;
  157.     static int margarete[4];
  158. public:
  159.     Pensiune(int tipDerivat, string nume, string adresa, double pret, int nrMargarete, string tipPensiune) :Cazare(tipDerivat, nume, adresa, pret) {
  160.         this->nrMargarete = nrMargarete;
  161.         this->tipPensiune = tipPensiune;
  162.         margarete[nrMargarete]++;
  163.     }
  164.     static void AfisareStele() { for (int i = 3; i > 0; i--)cout << i << " margarete " << margarete[i] << " unitati" << endl; }
  165.     void afisare_cazare()
  166.     {
  167.         Cazare::afisare_cazare();
  168.         cout << nrMargarete << " " << tipPensiune << endl;
  169.     }
  170.     int getStele() { return nrMargarete; }
  171.     void SalvareFiser(fstream &out) {
  172.         Cazare::SalvareFiser(out);
  173.         out << nrMargarete << endl;
  174.         out << tipPensiune << endl;
  175.     }
  176.  
  177.     Cazare& operator++()
  178.     {
  179.         if (nrMargarete == 3) {
  180.             cout << "Nu se poate da mai multe de 3 margarte" << endl;
  181.             return *this;
  182.         }
  183.         nrMargarete++;
  184.         return *this;
  185.     }
  186.  
  187.     Cazare& operator--()
  188.     {
  189.         if (nrMargarete == 1) {
  190.             cout << "Nu se poate da mai  putin de o margareta" << endl;
  191.             return *this;
  192.         }
  193.         nrMargarete--;
  194.         return *this;
  195.     }
  196. };
  197. int Pensiune::margarete[4] = {};
  198.  
  199. istream & operator>>(istream &in, Pensiune *&p) {
  200.     string nume;
  201.     string adresa;
  202.     double pret;
  203.     int nrMargarete;
  204.     string tipPensiune;
  205.     bool ok;
  206.     cout << "Nume: "; in >> nume;
  207.     cout << "Adresa: "; in >> adresa;
  208.     cout << "Pret: "; in >> pret;
  209.     do {
  210.         try {
  211.             cout << "Numar de margarete: "; in >> nrMargarete;
  212.             if (nrMargarete < 1 || nrMargarete > 3) throw MyException("out_limit");
  213.             ok = true;
  214.         }
  215.         catch (MyException &e) {
  216.             cerr << e.what();
  217.             ok = false;
  218.         }
  219.     } while (ok == false);
  220.     cout << "Tip de pensiune: "; in >> tipPensiune;
  221.  
  222.     p = new Pensiune(1, nume, adresa, pret, nrMargarete, tipPensiune);
  223.     return in;
  224. }
  225.  
  226.  
  227. class Pachet {
  228.     string denumire;
  229.     string zona;
  230.     string tipOferta;
  231.     list <Cazare*> listaCazare;
  232. public:
  233.     Pachet(string denumire, string zona, string tipOferta)
  234.     {
  235.         this->denumire = denumire;
  236.         this->zona = zona;
  237.         this->tipOferta = tipOferta;
  238.     }
  239.     void Afisare() {
  240.         cout << "Nume: " << denumire << endl;
  241.         cout << "Zona: " << zona << endl;
  242.         cout << "Tip de oferta: " << tipOferta << endl;
  243.         for (auto it = listaCazare.begin(); it != listaCazare.end(); it++)(*it)->afisare_cazare();
  244.     }
  245.     bool Cautare(string adresa) {
  246.         for (auto it = listaCazare.begin(); it != listaCazare.end(); it++)
  247.             if ((*it)->getAdressa() == adresa) {
  248.                 (*it)->afisare_cazare();
  249.                 return true;
  250.             }
  251.         return false;
  252.     }
  253.     bool Schimbare(string nume) {
  254.         for (auto it = listaCazare.begin(); it != listaCazare.end(); it++)
  255.             if ((*it)->getNume() == nume) {
  256.                 string nume2;
  257.                 cout << "Nume nou: "; cin >> nume2;
  258.                 (*it)->setNume(nume2);
  259.                 (*it)->afisare_cazare();
  260.                 return true;
  261.             }
  262.         return false;
  263.     }
  264.     void adaugare_cazare() {
  265.         int tip;
  266.         Hotel *h = NULL;
  267.         Pensiune *p = NULL;
  268.         Cazare *c = NULL;
  269.         cout << "Tip de cazare [Hotel- 0 , Pensiune - 1]: "; cin >> tip;
  270.         if (tip) {
  271.             cin >> p;
  272.             c = p;
  273.         }
  274.         else
  275.         {
  276.             cin >> h;
  277.             c = h;
  278.         }
  279.  
  280.         list<Cazare *>::iterator it = listaCazare.begin();
  281.         while (it != listaCazare.end() && (*it)->getStele() > c->getStele()) it++;
  282.         listaCazare.emplace(it, c);
  283.     }
  284.  
  285.     void Sterge(int tip, int nrstele) {
  286.         if (listaCazare.empty()) return;
  287.         for (auto it = listaCazare.begin(); it != listaCazare.end(); it++) {
  288.             if ((*it)->getTip() == tip && (*it)->getStele() == nrstele) {
  289.                 listaCazare.erase(it);
  290.                 it = listaCazare.begin();
  291.             }
  292.  
  293.  
  294.         }
  295.     }
  296.     bool modificareNumarStele(string nume, int mod) {
  297.         for (auto it = listaCazare.begin(); it != listaCazare.end(); it++)
  298.             if ((*it)->getTip() == 0 && (*it)->getNume() == nume) {
  299.                 if (mod == 0)
  300.                     cout << "Inainte de incrementare " << endl;
  301.                 else
  302.                     cout << "Inainte de decrementare" << endl;
  303.  
  304.                 (*it)->afisare_cazare();
  305.                 if (mod == 0)(*it)->operator++();
  306.                 else (*it)->operator--();
  307.                 cout << "Dupa " << endl;
  308.                 (*it)->afisare_cazare();
  309.  
  310.                 return true;
  311.             }
  312.         return false;
  313.     }
  314.     string getNume() { return denumire; }
  315.     friend fstream &operator<<(fstream &out, Pachet *&p);
  316.     friend fstream &operator>>(fstream &in, Pachet *&p);
  317. };
  318. istream &operator>>(istream &in, Pachet *&p) {
  319.     string denumire;
  320.     string zona;
  321.     string tipOferta;
  322.     cout << "Denumire: "; in >> denumire;
  323.     cout << "Zona: "; in >> zona;
  324.     cout << "Tip Oferta: "; in >> tipOferta;
  325.     p = new Pachet(denumire, zona, tipOferta);
  326.     return in;
  327. }
  328. ostream &operator<<(ostream &out, Pachet *&p) {
  329.     out << linie;
  330.     p->Afisare();
  331.     return out;
  332. }
  333. fstream &operator<<(fstream &out, Pachet *&p) {
  334.     out << p->denumire << endl;
  335.     out << p->zona << endl;
  336.     out << p->tipOferta << endl;
  337.     for (auto it = p->listaCazare.begin(); it != p->listaCazare.end(); it++) (*it)->SalvareFiser(out);
  338.     out << endl;
  339.  
  340.     return out;
  341. }
  342. fstream &operator>>(fstream &in, Pachet *&p) {
  343.     string denumire;
  344.     string zona;
  345.     string tipOferta;
  346.     in >> denumire;
  347.     in >> zona;
  348.     in >> tipOferta;
  349.     p = new Pachet(denumire, zona, tipOferta);
  350.     string nume;
  351.     string adresa;
  352.     double pret;
  353.     int tipDerivat;
  354.     Cazare *c = NULL;
  355.     if (in.eof()) return in;
  356.     while (getline(in, nume))
  357.     {
  358.         getline(in, nume);
  359.         if (in.eof() || nume == "\n" || nume == "") return in;
  360.  
  361.         in >> adresa;
  362.         in >> pret;
  363.         in >> tipDerivat;
  364.         if (tipDerivat) {
  365.             int nrMargarete;
  366.             string tipPensiune;
  367.             in >> nrMargarete >> tipPensiune;
  368.             c = new Pensiune(tipDerivat, nume, adresa, pret, nrMargarete, tipPensiune);
  369.         }
  370.         else
  371.         {
  372.             int nrStele;
  373.             in >> nrStele;
  374.             c = new Hotel(tipDerivat, nume, adresa, pret, nrStele);
  375.         }
  376.         list<Cazare *>::iterator it = p->listaCazare.begin();
  377.         while (it != p->listaCazare.end() && (*it)->getNume() < c->getNume()) it++;
  378.         p->listaCazare.emplace(it, c);
  379.  
  380.     }
  381.     return in;
  382. }
  383.  
  384. int main() {
  385.     int opt, nrCazari;
  386.     list<Pachet *> listaPachet;
  387.     list<Pachet *>::iterator it;
  388.     Pachet *p = NULL;
  389.     fstream f;
  390.     string adresa, nume;
  391.     bool gasit = 0;
  392.     int nrStele;
  393.     do {
  394.         cout << "0. Iesire\n";
  395.         cout << "1. Adaugare tastatura \n";
  396.         cout << "2. Afisare Tastatura \n";
  397.         cout << "3. Citire Fiser \n";
  398.         cout << "4. Cautare dupa Adresa \n";
  399.         cout << "5. Stergere\n";
  400.         cout << "6. Incrementare \n";
  401.         cout << "7. Decrementare\n";
  402.         cout << "8. Schimbare nume\n";
  403.         cout << "9. Afisare numar stele \n";
  404.         cout << "Optiunea Aleasa "; cin >> opt;
  405.         system("cls");
  406.         switch (opt)
  407.         {
  408.         case 0: exit(0);
  409.         case 1:
  410.             cin >> p;
  411.             cout << "Numar de cazari: "; cin >> nrCazari;
  412.             for (int i = 1; i <= nrCazari; i++) {
  413.                 cout << "Cazarea " << i << endl;
  414.                 p->adaugare_cazare();
  415.                 system("cls");
  416.             }
  417.             it = listaPachet.begin();
  418.             while (it != listaPachet.end() && (*it)->getNume() < p->getNume()) it++;
  419.             listaPachet.emplace(it, p);
  420.             break;
  421.         case 2:
  422.             for (it = listaPachet.begin(); it != listaPachet.end(); it++)cout << (*it);
  423.             cout << linie;
  424.             break;
  425.         case 3:
  426.             f.open("in.txt", ios::in);
  427.             if (f.is_open() == false) break;
  428.             cout << "Datele citie din fiserul in.txt sunt: " << endl;
  429.             while (!f.eof()) {
  430.                 f >> p;
  431.                 cout << endl;
  432.                 if (p->getNume() == "") {
  433.                     delete p;
  434.                     break;
  435.                 }
  436.                 it = listaPachet.begin();
  437.                 while (it != listaPachet.end() && (*it)->getNume() < p->getNume()) it++;
  438.                 listaPachet.emplace(it, p);
  439.                 p->Afisare();
  440.             }
  441.             f.close();
  442.             break;
  443.  
  444.         case 4:
  445.  
  446.             cout << "Adresa: "; cin >> adresa;
  447.             for (it = listaPachet.begin(); it != listaPachet.end(); it++)
  448.                 if ((*it)->Cautare(adresa)) {
  449.                     gasit = 1;
  450.                     break;
  451.                 }
  452.             if (gasit == false)cout << "Nu a fost gasit in lista" << endl;
  453.             gasit = 0;
  454.             break;
  455.         case 5:
  456.             cout << "Stergere dupa numarul de [stele - 0, margarte -1]: "; cin >> gasit;
  457.  
  458.             if (gasit) {
  459.                 cout << "Numar de margarete: "; cin >> nrStele;
  460.                 for (it = listaPachet.begin(); it != listaPachet.end(); it++) (*it)->Sterge(1, nrStele);
  461.             }
  462.             else {
  463.                 cout << "Numar de stele: "; cin >> nrStele;
  464.                 for (it = listaPachet.begin(); it != listaPachet.end(); it++) (*it)->Sterge(0, nrStele);
  465.             }
  466.             gasit = 0;
  467.             break;
  468.         case 6:
  469.             cout << "nume: "; cin >> nume;
  470.             for (it = listaPachet.begin(); it != listaPachet.end(); it++)
  471.                 if ((*it)->modificareNumarStele(nume, 0)) {
  472.                     gasit = 1;
  473.                     break;
  474.                 }
  475.             if (gasit == false)cout << "Nu a fost gasit in lista" << endl;
  476.             gasit = 0;
  477.             break;
  478.         case 7:
  479.             cout << "nume: "; cin >> nume;
  480.             for (it = listaPachet.begin(); it != listaPachet.end(); it++)
  481.                 if ((*it)->modificareNumarStele(nume, 1)) {
  482.                     gasit = 1;
  483.                     break;
  484.                 }
  485.             if (gasit == false)cout << "Nu a fost gasit in lista" << endl;
  486.             gasit = 0;
  487.             break;
  488.         case 8:
  489.             cout << "nume: "; cin >> nume;
  490.             for (it = listaPachet.begin(); it != listaPachet.end(); it++)
  491.                 if ((*it)->Schimbare(nume)) {
  492.                     gasit = 1;
  493.                     break;
  494.                 }
  495.             if (gasit == false)cout << "Nu a fost gasit in lista" << endl;
  496.             gasit = 0;
  497.             break;
  498.         case 9:
  499.             Hotel::AfisareStele();
  500.             Pensiune::AfisareStele();
  501.             break;
  502.         default:
  503.             break;
  504.         }
  505.  
  506.  
  507.     } while (1);
  508.     return 0;
  509. }
RAW Paste Data