Alx09

Untitled

Dec 2nd, 2020
1,148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.54 KB | None | 0 0
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<list>
  5. #include<iterator>
  6. #include<string>
  7. #include<fstream>
  8. #define _CRT_SECURE_NO_WARNING
  9.  
  10. using namespace std;
  11. int id = 1; // folosim pentru a stii la ce id am ajuns
  12. class Bibloteca { // clasa de baza
  13. private:
  14.     static Bibloteca* head; // declaam pointerul static de tip bilioteca care retine  adresa primului element
  15.     Bibloteca* next; // adresa elementului rumator
  16.     int id;
  17.     static int nrObiecte; // pentru a afla cate obiecte sunt in lista declarcam static ca toate obiectele sa imparta aceasi zona de memorie
  18. public:
  19.     Bibloteca() { // constructorl clasei
  20.         this->id = ::id; // luam valoare globala
  21.         id++; // aici am gresit trebuia ::id++ trebuie valoarea globala incrementata
  22.         nrObiecte++;// crestem numarul de obiecte
  23.         this->next = NULL;
  24.         if (head == NULL) {// verificam daca capul listeie ste null
  25.             head = this; // atunci capul listei devine elemtnul curent
  26.             return; // inchidem executia functiei
  27.         }
  28.         if (head->id > this->id) { // verificam daca id din cap este mai mare decat cel curent
  29.             this->next = head; // atunci elmentul curend tinde catre head
  30.             head = this; // si capatul listei devine lemetnul curent
  31.             return;
  32.         }// desi implementari curente nu este necesar acest cas l-am pus ca sa respect metoda ordonari sortate
  33.         Bibloteca* q = head; // initialiam pe q cu cpaul listei
  34.         while (q->next && q->next->id < this->id) q = q->next; // verificam cât timp q->id e mai mic decat head trecem la urmatorul element din lista
  35.         this->next = q->next;
  36.         q->next = this;// desi nici aceasta medota nu era necesara nu am avut timp sa o gandesc bine, puteam pune un pointer care sa retina ultimul element
  37.         // al listei si adugarea era mai rapida
  38.     }
  39.  
  40.     virtual void afisare() {// functie virtuala de afisare
  41.         cout << id << " ";
  42.     }
  43.     static void AfisareLista() { // ca sa afisam toata lista ptrin-trun singur apel si sa pastram principul incapsulari
  44.         Bibloteca* q = head;     // am folosit functii statice deoarce nu ne este necesar un obiect pentru a le apela
  45.         while (q) {// cat timp exista elemente in lista
  46.             q->afisare();// afiseaza elemetnul curent
  47.             q = q->next; // treci la urmatorul element
  48.         }
  49.     }
  50.     static void CautObiect(int id) {
  51.         system("cls");
  52.         if (head == NULL) {
  53.             cout << "\nLista este goala!\n";
  54.             return;
  55.         }
  56.         Bibloteca* q = head;
  57.         while (q && q->id != id) q = q->next; // verificam cat timp id este diferit de ce-l cautat trecem la urmatorul
  58.         if (q) // daca q este null inseamna ca nu xista sau a fost sters
  59.             q->afisare(); // afisam in caz ca este
  60.         else cout << "\nObiectul nu se afla in baza de date!\n";
  61.     }
  62.     static void StergeOb(int id) { // la fel nu este necesar sa folosim un obiect deci o lasamc a functie statica ne este necesar doar id
  63.         system("cls");// stergem consola ca sa nu fie prea plina
  64.         if (head == NULL) { // verificam daca lista este nula in caz advarat orprim functia
  65.             cout << "\nLista este goala!\n";
  66.             return;// oprim functia
  67.         }
  68.         Bibloteca* q = head; // atribuim lui q  adresa capului listei
  69.         if (head->id == id) { // verificam daca id care trebuie sters este cumva primul element
  70.             cout << "\nObiectul: ";
  71.             head->afisare(); // afiisam obiectul pentru o mai buna interfata cu utilizaotrul
  72.             cout << "\nA fost stearsa sdn baza de date!\n";
  73.             head = head->next;// se schimba capul listei cu urmatorul element
  74.             nrObiecte--;// scadem numarul de obiecte curente
  75.             delete q; // stergem obiectul q
  76.             return; // oprim functia
  77.         }
  78.         while (q->next && q->next->id != id) q = q->next;// cat timp q->id este diferit de id-ul cuatat trecem la urmatorul elment din lista
  79.         if (q) { // in caz ca nu am ajuns la sfarsitul listei inseamna ca q->next este ce-l cautat
  80.             Bibloteca* p = q->next;
  81.             q->next = q->next->next;
  82.             cout << "\nObiectul: \n";
  83.             q->afisare();// mica eroare trebuia q->next
  84.             nrObiecte--;// scadem numarul de obiecte
  85.             cout << "\nAfost stearsa din baza de datn";
  86.             delete p;
  87.         }
  88.         else  cout << "\na a fost sters nu se afla in baza de date\n";
  89.  
  90.     }
  91.     static void AfisareNr() {// functie statica pentru a afisa numarul de obiecte curente
  92.         cout << "\nSunt in total " << nrObiecte;
  93.     }
  94. };
  95. Bibloteca* Bibloteca::head = NULL; // intitializam capul listei
  96. int Bibloteca::nrObiecte = 0; // initializam numarul de obiecte
  97.  
  98. class Carte : public Bibloteca { // clasa derivata
  99. private:
  100.     string nume, autor;
  101. public:
  102.     Carte(string nume, string autor) :Bibloteca() {// constructor
  103.         this->nume = nume;
  104.         this->autor = autor;
  105.     }
  106.     void afisare() { // functia de afisare
  107.         Bibloteca::afisare(); // apelam functia de afisare din clasa de baza pentru elmentul curent
  108.         cout << nume << " " << autor << "\n\n";
  109.     }
  110. };
  111. class Revista : public Bibloteca {// clasa derivata 2
  112. private:
  113.     string editura;
  114. public:
  115.     Revista(string editura) :Bibloteca() { // construcotr 2
  116.         this->editura = editura;
  117.     }
  118.     void afisare() { // functia virtuala de afisare 2
  119.         Bibloteca::afisare(); // apelam functia de afisare din clasa de baza pentru elmentul curent
  120.         cout << editura << " " << "\n\n";
  121.     }
  122. };
  123. ostream& operator<<(ostream& iesire, Revista* R) // supra incarcam operatorul de iesire pentru clasa Revista
  124. {
  125.     Bibloteca::AfisareLista(); // folosim functia de afisare
  126.     return iesire;
  127. }
  128. istream& operator >> (istream& intrare, Revista* R) // supra incarcam operatorul de intrare pentru clasa Revista
  129. {
  130.     cout << "Introducerea Revista: " << endl; // facem citirea de la tastaura
  131.  
  132.     string editura;// variabila declara
  133.     cout << "Introduceti editura  "; getline(intrare, editura);// citim editura cu getline sa luam toata linia
  134.     new Revista(editura); // apelam constructorul care va aduga elemntul in lista conform constructorul casei de baza
  135.     return intrare;
  136. }
  137.  
  138. ostream& operator<<(ostream& iesire, Carte *C)// la fel ca si pentru revista
  139. {
  140.     Bibloteca::AfisareLista();
  141.     return iesire;
  142. }
  143. istream& operator >> (istream& intrare, Carte *C)// la fel ca si pentru revista
  144. {
  145.     cout << "Introducerea Cartea: " << endl;
  146.  
  147.     string nume, autor;
  148.     cout << "Introduceti nume  "; getline(intrare, nume);
  149.     cout << "Introduceti autor  "; getline(intrare, autor);
  150.  
  151.     new Carte(nume, autor);
  152.     return intrare;
  153. }
  154.  
  155. int main() {
  156.     Carte* carte = NULL; // pentru a indica citirea care se poate face si din fiser numai ca nu am vazut eu bine
  157.     Revista* revista = NULL; // trebuie doar declarat fiserul si folosit pointerul fiser in loc de cin datoria supra incarcari opertaroului
  158.     int opt, id;
  159.     char c;
  160.     do {
  161.  
  162.         cout << "\n1. Adaugare Obiect";// meniu pentru interfata cu utikizaotrul
  163.         cout << "\n2. Afisare Obiecte";
  164.         cout << "\n3. Cautare Obiect";
  165.         cout << "\n4. Stergere Obiect";
  166.         cout << "\n5. Afisare nr carti";
  167.         cout << "\n0. Iesire";
  168.         cout << "\nIntroduceti optiunea dorita: "; cin >> opt; // citim optiunea utlizotrului
  169.         getchar();// ramane \n in buffer si trebuie scapat de el
  170.         system("cls"); // sterem feasrta ca sa nu fie prea mult scris
  171.  
  172.  
  173.         switch (opt) { // in functie de optiuena utilizaotrului ne ducem pe ramura necesra operatiuni
  174.         case 0: return 0; break;
  175.         case 1:
  176.             cout << "\nEste  C - Carte,  R- Revista: "; cin >> c;
  177.             getchar();// din nou ramane \n in buffer
  178.             if (c == 'C') cin >> carte;
  179.             else cin >> revista;
  180.             break;
  181.         case 2:
  182.             cout << revista;
  183.             break;
  184.         case 3:
  185.             cout << "\nIntroduceti id obiect: "; cin >> id;
  186.             Bibloteca::CautObiect(id); // am lucat cu functii statice
  187.             break;
  188.         case 4:
  189.             cout << "\nIntroduceti id obiect: "; cin >> id;
  190.             Bibloteca::StergeOb(id);// stergem obicetul cu id dat de utilizator
  191.             break;
  192.         case 5:
  193.             Bibloteca::AfisareNr();//afisam
  194.  
  195.         }
  196.     } while (1);
  197.  
  198. }
Advertisement
Add Comment
Please, Sign In to add comment