LDG2875

12 years of slavery in OOP

Apr 18th, 2022
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.61 KB | None | 0 0
  1. //include try-catch in constructori!!!!
  2. //sa respecte dimensiunea, tipul de date, etc.
  3.  
  4. /*
  5. Tema 7. Se dau clasele:
  6. -Locuință (string numeClient, int suprafataUtila, float discount)
  7. -Apartament (int etaj) : Locuinta
  8. -Casa (int suprafataCurte) : Locuinta
  9.  
  10. La clasa Locuinta se va adauga metoda virtuala pura CalculChirie (X,Y)
  11. cu X = valoare standard chirie/mp(intreg), Y=1 daca se ia in considerare discountul
  12. si 0 daca nu se ia in considerare.
  13. Metoda va fi adaugata in clasa Apartament dupa formula X*suprafataUtila*(1-Y*discount/100.0),
  14. respectiv in clasa Casa dupa formula X*(suprafataUtila + 0.2*suprafataCurte) * (1-Y*discount/100.0).
  15. Metodele vor fi testate prin parcurgerea unui vector de pointeri la Locuinta *, incarcat
  16. cu obiecte de tip Apartament si Casa.
  17.  
  18. Se defineste clasa AgentieImobiliara continand un vector de pointeri la obiecte de tip
  19. Locuinta alocat dinamic. Se va supraincarca operatorul >> pentru a citi locuintele agentiei si
  20. operatorul << pentru afisarea lor.
  21.  
  22.     CUM SE DAU DATELE?
  23. -cate locuinte sunt disponibile in ag. im.
  24. -pentru fiecare in parte:
  25.     -nume client, suprafata utila, discount
  26.     -ce tip de locuinta este: apartament/casa
  27.     -(in fct. de tip: etaj, respectiv suprafata curte)
  28.     -se aplica discount: da/nu !!!
  29.  
  30.     CE AI FACUT?
  31. -supraincarcarea operatorului de citire (AgIm)
  32. -supraincarcarea operatorului de afisare (AgIm)
  33. -CalculChirie()
  34. -destructori
  35. -operatorii ">>"
  36. -operatorii "<<"
  37. -Clasele derivate sa aiba destructori
  38. -Locuinta:
  39.     -constructori de inițializare
  40.     -parametrizați
  41.     -și de copiere
  42.     -operator ==
  43. -Clasele derivate trebuie sa contina constructori parametrizati
  44. (prin care sa se evidentieze transmiterea parametrilor catre constructorul
  45. din clasa de baza)
  46. -moșteniri & encapsulare (date private)
  47. -constructori de inițializare
  48. -parametrizați
  49. -și de copiere
  50. -funcții virtuale (este goala) [CalculChirie]
  51. -operatorii „=”
  52. -upcasting v
  53. -downcasting v
  54. -Utilizarea de variabile și de funcții statice
  55.  
  56.     CE MAI AI DE FACUT?
  57. -exceptiile try-catch (faci si tu 2/3 exceptii)
  58. -meniul !!!!!!
  59. -AgentieImobiliara toate functiile !!
  60.  
  61.     CE NU E NEVOIE?
  62. -smart pointers = shared_ptr //nu e nevoi
  63. */
  64.  
  65.  
  66. #include <iostream>
  67. #include <cstring>
  68. #include <vector>
  69. #include <typeinfo>
  70. #define N 10001
  71.  
  72. using namespace std;
  73.  
  74.  
  75. //==================== LOCUINTA ====================//
  76. //clasa abstracta --->vazuta ca interfata ---> nu poate instantia obiecte
  77. class Locuinta
  78. {
  79.     //encapsulare
  80. public:
  81.     string numeClient;
  82.     int suprafataUtila;
  83.     float discount;
  84.  
  85. public:
  86.     virtual void citire();
  87.     virtual void afisare();
  88.     friend istream& operator>> (istream&, Locuinta&);
  89.     friend ostream& operator<< (ostream&, Locuinta&);
  90.     virtual float CalculChirie(int x, int y) = 0;
  91.  
  92.     bool operator== (Locuinta& l1)
  93.     {
  94.         return numeClient == l1.numeClient && suprafataUtila == l1.suprafataUtila && discount == l1.discount;
  95.     }
  96.  
  97.     Locuinta& operator= (Locuinta& l)
  98.     {
  99.         if(this != &l)
  100.         {
  101.             this->numeClient = l.numeClient;
  102.             this->suprafataUtila = l.suprafataUtila;
  103.             this->discount = l.discount;
  104.         }
  105.         return *this;
  106.     }
  107.  
  108.     //constructori:
  109.     Locuinta()
  110.     {
  111.         numeClient = "";
  112.         suprafataUtila = 0;
  113.         discount = 0;
  114.     }
  115.  
  116.     Locuinta(string s, int sU, float d)
  117.     {
  118.         int OK = 0;
  119.         for(int i = 0; i < s.size() && OK < 2; ++i)
  120.         {
  121.             if(!isalpha(s[i]))
  122.             {
  123.                 if(!OK && isspace(s[i]))
  124.                 {
  125.                     OK = 1;
  126.                 }
  127.                 else
  128.                 {
  129.                     OK = 2;
  130.                 }
  131.             }
  132.         }
  133.         if(OK == 2)
  134.             numeClient = "-";
  135.         else
  136.             numeClient = s;
  137.         if(suprafataUtila < 0)
  138.             suprafataUtila = -1;
  139.         else
  140.             suprafataUtila = sU;
  141.         if(discount > 100)
  142.             discount = -1;
  143.         else
  144.             discount = d;
  145.         //numeClient = s;         //sa fie string valid
  146.         //suprafataUtila = sU;    //daca su este < 0 -> eroare
  147.         //discount = d;           //nu poate fi > 100%
  148.     }
  149.  
  150.     Locuinta(const Locuinta& l)
  151.     {
  152.         numeClient = l.numeClient;
  153.         suprafataUtila = l.suprafataUtila;
  154.         discount = l.discount;
  155.     }
  156.  
  157.     ///=> memory leak ------> se rezolva prin destructor virtual:
  158.     virtual ~Locuinta()
  159.     {
  160.         cout << "~Locuinta \n";
  161.     }
  162. };
  163.  
  164. void Locuinta::citire()
  165. {
  166.     cout << "Nume client: ";
  167.     cin >> numeClient;
  168.     cout << "Suprafata utila: ";
  169.     cin >> suprafataUtila;
  170.     cout << "Discount: ";
  171.     cin >> discount;
  172. }
  173.  
  174. void Locuinta::afisare()
  175. {
  176.     cout << "Nume client: ";
  177.     cout << numeClient << "\n";
  178.     cout << "Suprafata utila: ";
  179.     cout << suprafataUtila << "\n";
  180.     cout << "Discount: ";
  181.     cout << discount << "\n";
  182. }
  183.  
  184. istream& operator>> (istream& in, Locuinta& l)
  185. {
  186.     cout << "Nume client: ";
  187.     in >> l.numeClient;
  188.     cout << "Suprafata utila: ";
  189.     in >> l.suprafataUtila;
  190.     cout << "Discount: ";
  191.     in >> l.discount;
  192.     return in;
  193. }
  194.  
  195. ostream& operator<< (ostream& out, Locuinta& l)
  196. {
  197.     cout << "Nume client: ";
  198.     out << l.numeClient << "\n";
  199.     cout << "Suprafata utila: ";
  200.     out << l.suprafataUtila << "\n";
  201.     cout << "Discount: ";
  202.     out << l.discount << "\n";
  203.     return out;
  204. }
  205.  
  206. //================== APARTAMENT ===================//
  207. class Apartament: public Locuinta
  208. {
  209. public:
  210.     int etaj;
  211. public:
  212.     void citire();
  213.     void afisare();
  214.     friend istream& operator>> (istream&, Apartament&);
  215.     friend ostream& operator<< (ostream&, Apartament&);
  216.     float CalculChirie(int x, int y);
  217.  
  218.     Apartament& operator= (Apartament& a)
  219.     {
  220.         if(this != &a)
  221.         {
  222.             this->Locuinta::operator=(a);
  223.             this->etaj = a.etaj;
  224.         }
  225.         return *this;
  226.     }
  227.  
  228.     bool operator== (Apartament& a)
  229.     {
  230.         return Locuinta::operator==(a) && etaj == a.etaj;
  231.     }
  232.  
  233.     //constructori:
  234.     Apartament():Locuinta()
  235.     {
  236.         etaj = 0;
  237.     }
  238.     Apartament(string s, int sU, float d, int e);
  239.  
  240.     ///destructor:
  241.     ~Apartament()
  242.     {
  243.         cout << "~Apartament \n";
  244.     }
  245. };
  246.  
  247. Apartament:: Apartament(string s, int sU = 0, float d = 0, int e = 0): Locuinta(s, sU, d)
  248. {
  249.     if(etaj < 0)
  250.         etaj = -1;
  251.     else
  252.         etaj = e;
  253. }
  254.  
  255. void Apartament::citire()
  256. {
  257.     Locuinta::citire();
  258.     cout << "Etaj: ";
  259.     cin >> etaj;
  260. }
  261.  
  262. void Apartament::afisare()
  263. {
  264.     cout << "Locuinta de tip: Apartament \n";
  265.     Locuinta::afisare();
  266.     cout << "Etaj: ";
  267.     cout << etaj << "\n";
  268. }
  269.  
  270. istream& operator>> (istream& in, Apartament& a)
  271. {
  272.     in >> dynamic_cast<Locuinta&> (a);
  273.     cout << "Etaj: ";
  274.     in >> a.etaj;
  275.     return in;
  276. }
  277.  
  278. ostream& operator<< (ostream& out, Apartament& a)
  279. {
  280.     out << "Locuinta de tip: Apartament \n";
  281.     out << dynamic_cast<Locuinta&> (a);
  282.     out << "Etaj: ";
  283.     out << a.etaj << "\n";
  284.     return out;
  285. }
  286.  
  287.  
  288. float Apartament::CalculChirie(int x, int y)
  289. {
  290.     float chirie;
  291.     chirie = x * suprafataUtila * (1 - y * discount / 100.0);
  292.     return chirie;
  293. }
  294.  
  295. //===================== CASA =====================//
  296. class Casa: public Locuinta
  297. {
  298.     int suprafataCurte;
  299.  
  300. public:
  301.     void citire();
  302.     void afisare();
  303.     friend istream& operator>> (istream&, Casa&);
  304.     friend ostream& operator<< (ostream&, Casa&);
  305.     float CalculChirie(int x, int y);
  306.  
  307.     Casa& operator= (Casa& c)
  308.     {
  309.         if(this != &c)
  310.         {
  311.             this->Locuinta::operator=(c);
  312.             this->suprafataCurte = c.suprafataCurte;
  313.         }
  314.         return *this;
  315.     }
  316.  
  317.     //constructori:
  318.     Casa():Locuinta()
  319.     {
  320.         suprafataCurte = 0;
  321.     }
  322.  
  323.     Casa(string s, int sU, float d, int sC);
  324.  
  325.     ///destructor:
  326.     ~Casa()
  327.     {
  328.         cout << "~Casa \n";
  329.     }
  330. };
  331.  
  332. Casa:: Casa(string s, int sU = 0, float d = 0, int sC = 0): Locuinta(s, sU, d)
  333. {
  334.     try
  335.     {
  336.         if(sU >= 0)
  337.             suprafataCurte = sC; //throw 2;
  338.         else
  339.             throw 2;//suprafataCurte = sC;
  340.     }
  341.     catch(int x)
  342.     {
  343.         if(x == 2)
  344.             cout <<"Valoarea introdusa pentru suprafata de curte este invalida! Aceasta nu poate fi un nr. negativ. \n";
  345.     }
  346.  
  347.     //suprafataCurte = sC;
  348. }
  349.  
  350. void Casa::citire()
  351. {
  352.     Locuinta::citire();
  353.     cout << "Suprafata curte: ";
  354.     cin >> suprafataCurte;
  355. }
  356.  
  357. void Casa::afisare()
  358. {
  359.     cout << "Locuinta de tip: Casa \n";
  360.     Locuinta::afisare();
  361.     cout << "Suprafata curte: ";
  362.     cout << suprafataCurte << "\n";
  363. }
  364.  
  365. istream& operator>> (istream& in, Casa& c)
  366. {
  367.     in >> dynamic_cast<Locuinta&> (c);
  368.     cout << "Suprafata curte: ";
  369.     in >> c.suprafataCurte;
  370.     return in;
  371. }
  372.  
  373. ostream& operator<< (ostream& out, Casa& c)
  374. {
  375.     out << "Locuinta de tip: Casa \n";
  376.     out << dynamic_cast<Locuinta&> (c);
  377.     out << "Suprafata curte: ";
  378.     out << c.suprafataCurte << "\n";
  379.     return out;
  380. }
  381.  
  382. float Casa::CalculChirie(int x, int y)
  383. {
  384.     float chirie;
  385.     chirie = x * (suprafataUtila + 0.2 * suprafataCurte) * (1 - y * discount / 100.0);
  386.     return chirie;
  387. }
  388.  
  389.  
  390. //=============== AGENTIE IMOBILIARA ===============//
  391. class AgentieImobiliara
  392. {
  393.     vector<Locuinta*> L;      ///vector de pointeri la obiecte de tip Locuinta alocat dinamic
  394.     int NR;
  395.  
  396.     //date statice:
  397.     static int nrCase;
  398.     static int nrApartamente;
  399.  
  400. public:
  401.     void afisareChirie();
  402.     friend istream& operator>>(istream&, AgentieImobiliara&);
  403.     friend ostream& operator<<(ostream&, AgentieImobiliara&);
  404.  
  405.     //constructori:
  406.     AgentieImobiliara()
  407.     {
  408.         NR = 0;
  409.     }
  410.  
  411.     AgentieImobiliara(const AgentieImobiliara& ai)
  412.     {
  413.         NR = ai.NR;
  414.         L = ai.L;
  415.     }
  416.  
  417.     //destructor:
  418.     ~AgentieImobiliara()
  419.     {
  420.         cout << "~AgentieImobiliara \n";
  421.     }
  422.  
  423.     void addApartament()
  424.     {
  425.         L.push_back(new Apartament(""));
  426.         L[NR]->citire();
  427.         NR++;
  428.         AgentieImobiliara::nrApartamente++;
  429.     }
  430.  
  431.     void addCasa()
  432.     {
  433.         L.push_back(new Casa(""));
  434.         L[NR]->citire();
  435.         NR++;
  436.         AgentieImobiliara::nrCase++;
  437.     }
  438.  
  439.     //functii statice:
  440.     static void afisNrCase()
  441.     {
  442.         cout << "In aceasta agentie imobiliara sunt " << nrCase << " case. \n";
  443.     }
  444.     static void afisNrApartamente()
  445.     {
  446.         cout << "in aceasta agentie imobiliara sunt " << nrApartamente << " apartamente. \n";
  447.     }
  448. };
  449.  
  450. int AgentieImobiliara::nrCase;
  451. int AgentieImobiliara::nrApartamente;
  452.  
  453. istream& operator>> (istream& in, AgentieImobiliara& a)
  454. {
  455.     cout << "Cate locuinte sunt? \n";
  456.     in >> a.NR;
  457.  
  458.     cout << "Care sunt acestea? \n";
  459.     for(int i = 0; i < a.NR; i++)
  460.     {
  461.         int op;
  462.         cout << "Tip de locuinta: 1-Apartament 2-Casa \n";
  463.         in >> op;   //sa fie valid operatorul
  464.         switch(op)
  465.         {
  466.         //upcasting
  467.         case 1:
  468.         {
  469.             a.L.push_back(new Apartament(""));    //faci incrementare la nrApartamente
  470.             a.L[i]->citire();
  471.             AgentieImobiliara::nrApartamente++;
  472.             break;
  473.         }
  474.         case 2:
  475.         {
  476.             a.L.push_back(new Casa(""));    //faci incrementare la nrCase
  477.             a.L[i]->citire();
  478.             AgentieImobiliara::nrCase++;
  479.             break;
  480.         }
  481.         }
  482.     }
  483.     return in;
  484. }
  485.  
  486. ostream& operator<< (ostream& out, AgentieImobiliara& a)
  487. {
  488.     int i = 1;
  489.     out << "\n";
  490.     out << "Agentia imobiliara are " << a.NR  << " locuinte: \n";
  491.     for(auto p = a.L.begin(); p != a.L.end(); p++,i++)
  492.     {
  493.         out << i << ". ";
  494.         if(typeid(**p) == typeid(Apartament))   //downcasting
  495.         {
  496.             out << * dynamic_cast<Apartament*>(*p) << "\n";
  497.             //out << (* dynamic_cast<Apartament*>(*p)).CalculChirie(3, 1) << "\n";
  498.         }
  499.  
  500.         else if(typeid(**p) == typeid(Casa))
  501.         {
  502.             out << * dynamic_cast<Casa*>(*p) << "\n";
  503.             //out << (* dynamic_cast<Casa*>(*p)).CalculChirie(4, 1) << "\n";
  504.         }
  505.     }
  506.     return out;
  507. }
  508.  
  509. void AgentieImobiliara::afisareChirie()
  510. {
  511.     int i = 1;
  512.     cout << "\n";
  513.     cout << "Agentia imobiliara are " << NR  << " locuinte: \n";
  514.     for(auto p = L.begin(); p != L.end(); p++,i++)
  515.     {
  516.         cout << i << ". ";
  517.         if(typeid(**p) == typeid(Apartament))   //downcasting
  518.         {
  519.             //out << * dynamic_cast<Apartament*>(*p) << "\n";
  520.             cout << (* dynamic_cast<Apartament*>(*p)).CalculChirie(3, 1) << "\n";
  521.         }
  522.  
  523.         else if(typeid(**p) == typeid(Casa))
  524.         {
  525.             //out << * dynamic_cast<Casa*>(*p) << "\n";
  526.             cout << (* dynamic_cast<Casa*>(*p)).CalculChirie(4, 1) << "\n";
  527.         }
  528.     }
  529. }
  530.  
  531. //===================== MENIU =====================//
  532. void AfisareMeniu()
  533. {
  534.     cout << "\n";
  535.     cout << "Acesta este meniul aplicatiei. \n" << "Pentru a executa o anumita comanda apasati tasta corespunzatoare nr. din fata fiecarei operatii din lista de mai jos: \n";
  536.     cout << "0. Opriti acest proces acum. \n"; //v
  537.     cout << "1. Introduceti primele date in agentia imobiliara. \n"; //v
  538.     cout << "2. Adaugati locuinte in agentie. \n"; //v
  539.     cout << "3. Eliminati locuinte din agentie. \n";
  540.     cout << "4. As vrea sa stiu cate case/apartamente sunt in agentia imobiliara. \n"; //v
  541.     cout << "5. As vrea sa aflu de cate locuinte este interesat un anumit client. \n";
  542.     cout << "6. Cautati optiunea ideala de locuinta. \n";
  543.     cout << "7. Calculati pretul pentru fiecare locuinta in functie de pretul actual de pe piata. \n"; //trebuie facuta mai frumos!!
  544.     cout << "8. Care este cea mai ieftina locuinta pusa la dispozitie? Dar cea mai scumpa? \n";
  545.     cout << "9. Afisati toate locuintele din agentia imobiliara. \n"; //v
  546.     cout << "10. --- \n";
  547.     cout << "\n";
  548. }
  549.  
  550.  
  551. //===================== MAIN =====================//
  552. int main()
  553. {
  554.     int OK;
  555.     string S;
  556.     float d;
  557.     int etaj, sU;
  558.     do
  559.     {
  560.         OK = 1;
  561.         cin >> S >> sU >> d >> etaj;
  562.         Apartament A(S, sU, d, etaj);
  563.         try
  564.         {
  565.             if(A.numeClient == "-" || A.suprafataUtila == -1 || A.discount == -1 || A.etaj == -1)
  566.             {
  567.                 throw 1;
  568.             }
  569.         }
  570.         catch(int x)
  571.         {
  572.             cout << "Introduceti datele corect!\n";
  573.             OK = 0;
  574.         }
  575.         if(!OK)
  576.             A.~Apartament();
  577.         else
  578.             cout << A;
  579.     }
  580.     while(!OK);
  581.  
  582.     /*AfisareMeniu();
  583.     cout << "Ce comanda doriti sa executati? \n";
  584.     cin >> op;
  585.     while(op)
  586.     {
  587.         try
  588.         {
  589.             if(op < 0 || op > 10)
  590.                 throw -1;
  591.             else
  592.             {
  593.                 //cout << "hai ca mere \n";
  594.                 if(op == 1)
  595.                     cin >> A;
  596.                 if(op == 2)
  597.                 {
  598.                     try
  599.                     {
  600.                         cout << "Ce tip de locuinta adaugati? 1-Apartament 2-Casa \n";
  601.                         int tip;
  602.                         cin >> tip;
  603.                         if(tip == 1)
  604.                             A.addApartament();
  605.                         else if(tip == 2)
  606.                             A.addCasa();
  607.                         else
  608.                             throw 10;
  609.                     }
  610.                     catch(int x)
  611.                     {
  612.                         if(x == 10)
  613.                             cout << "Ne pare rau...Nu exista acest tip de locuinte. \n";
  614.                     }
  615.                 }
  616.                 if(op == 4)
  617.                 {
  618.                     try
  619.                     {
  620.                         cout << "Pentru ce tip de locuinta doriti sa aflati numarul? 1-Apartament 2-Casa \n";
  621.                         int tip;
  622.                         cin >> tip;
  623.                         if(tip == 1)
  624.                             A.afisNrApartamente();
  625.                         else if(tip == 2)
  626.                             A.afisNrCase();
  627.                         else
  628.                             throw 11;
  629.                     }
  630.                     catch(int x)
  631.                     {
  632.                         if(x == 11)
  633.                             cout << "Ne pare rau...Nu exista acest tip de locuinte. \n";
  634.                     }
  635.                 }
  636.  
  637.                 if(op == 7)
  638.                 {
  639.                     try
  640.                     {
  641.                         int pret;
  642.                         cout << "Care este tariful actual pentru chirie /mp? (nr. intreg) \n";
  643.                         cin >> pret;
  644.                         if(pret > 0)
  645.                             A.afisareChirie();
  646.                         else
  647.                             throw 23;
  648.                     }
  649.                     catch(int x)
  650.                     {
  651.                         if(x == 23)
  652.                             cout << "Ne pare rau...Valoarea chiriei pe mp nu poate fi mai mica decat 0. \n";
  653.                     }
  654.  
  655.                 }
  656.  
  657.                 if(op == 9)
  658.                     cout << A;
  659.             }
  660.         }
  661.         catch(int x)
  662.         {
  663.             if(x == -1)
  664.             {
  665.                 cout << "Aceasta optiune nu este una valida. Mai incercati o data va rugam! \n";
  666.             }
  667.         }
  668.  
  669.         cout << "Ce comanda doriti sa executati? \n";
  670.         cin >> op;
  671.     }
  672.  
  673.     */
  674.     return 0;
  675. }
  676.  
  677.  
  678.  
  679. /*
  680. try {
  681.   // Block of code to try
  682.   throw exception; // Throw an exception when a problem arise
  683.  
  684.   if(---ceva ce nu e bun---)
  685.         throw 2; //de ex
  686. }
  687. catch (int x) {
  688.   // Block of code to handle errors
  689.   if(x == 2) //afiseaza eroarea;
  690. }
  691. */
  692.  
Add Comment
Please, Sign In to add comment