Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<stdio.h>
- #include<stdlib.h>
- #include<list>
- #include<iterator>
- #include<string>
- #include<fstream>
- #define _CRT_SECURE_NO_WARNING
- using namespace std;
- int id = 1; // folosim pentru a stii la ce id am ajuns
- class Bibloteca { // clasa de baza
- private:
- static Bibloteca* head; // declaam pointerul static de tip bilioteca care retine adresa primului element
- Bibloteca* next; // adresa elementului rumator
- int id;
- static int nrObiecte; // pentru a afla cate obiecte sunt in lista declarcam static ca toate obiectele sa imparta aceasi zona de memorie
- public:
- Bibloteca() { // constructorl clasei
- this->id = ::id; // luam valoare globala
- id++; // aici am gresit trebuia ::id++ trebuie valoarea globala incrementata
- nrObiecte++;// crestem numarul de obiecte
- this->next = NULL;
- if (head == NULL) {// verificam daca capul listeie ste null
- head = this; // atunci capul listei devine elemtnul curent
- return; // inchidem executia functiei
- }
- if (head->id > this->id) { // verificam daca id din cap este mai mare decat cel curent
- this->next = head; // atunci elmentul curend tinde catre head
- head = this; // si capatul listei devine lemetnul curent
- return;
- }// desi implementari curente nu este necesar acest cas l-am pus ca sa respect metoda ordonari sortate
- Bibloteca* q = head; // initialiam pe q cu cpaul listei
- 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
- this->next = q->next;
- 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
- // al listei si adugarea era mai rapida
- }
- virtual void afisare() {// functie virtuala de afisare
- cout << id << " ";
- }
- static void AfisareLista() { // ca sa afisam toata lista ptrin-trun singur apel si sa pastram principul incapsulari
- Bibloteca* q = head; // am folosit functii statice deoarce nu ne este necesar un obiect pentru a le apela
- while (q) {// cat timp exista elemente in lista
- q->afisare();// afiseaza elemetnul curent
- q = q->next; // treci la urmatorul element
- }
- }
- static void CautObiect(int id) {
- system("cls");
- if (head == NULL) {
- cout << "\nLista este goala!\n";
- return;
- }
- Bibloteca* q = head;
- while (q && q->id != id) q = q->next; // verificam cat timp id este diferit de ce-l cautat trecem la urmatorul
- if (q) // daca q este null inseamna ca nu xista sau a fost sters
- q->afisare(); // afisam in caz ca este
- else cout << "\nObiectul nu se afla in baza de date!\n";
- }
- 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
- system("cls");// stergem consola ca sa nu fie prea plina
- if (head == NULL) { // verificam daca lista este nula in caz advarat orprim functia
- cout << "\nLista este goala!\n";
- return;// oprim functia
- }
- Bibloteca* q = head; // atribuim lui q adresa capului listei
- if (head->id == id) { // verificam daca id care trebuie sters este cumva primul element
- cout << "\nObiectul: ";
- head->afisare(); // afiisam obiectul pentru o mai buna interfata cu utilizaotrul
- cout << "\nA fost stearsa sdn baza de date!\n";
- head = head->next;// se schimba capul listei cu urmatorul element
- nrObiecte--;// scadem numarul de obiecte curente
- delete q; // stergem obiectul q
- return; // oprim functia
- }
- 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
- if (q) { // in caz ca nu am ajuns la sfarsitul listei inseamna ca q->next este ce-l cautat
- Bibloteca* p = q->next;
- q->next = q->next->next;
- cout << "\nObiectul: \n";
- q->afisare();// mica eroare trebuia q->next
- nrObiecte--;// scadem numarul de obiecte
- cout << "\nAfost stearsa din baza de datn";
- delete p;
- }
- else cout << "\na a fost sters nu se afla in baza de date\n";
- }
- static void AfisareNr() {// functie statica pentru a afisa numarul de obiecte curente
- cout << "\nSunt in total " << nrObiecte;
- }
- };
- Bibloteca* Bibloteca::head = NULL; // intitializam capul listei
- int Bibloteca::nrObiecte = 0; // initializam numarul de obiecte
- class Carte : public Bibloteca { // clasa derivata
- private:
- string nume, autor;
- public:
- Carte(string nume, string autor) :Bibloteca() {// constructor
- this->nume = nume;
- this->autor = autor;
- }
- void afisare() { // functia de afisare
- Bibloteca::afisare(); // apelam functia de afisare din clasa de baza pentru elmentul curent
- cout << nume << " " << autor << "\n\n";
- }
- };
- class Revista : public Bibloteca {// clasa derivata 2
- private:
- string editura;
- public:
- Revista(string editura) :Bibloteca() { // construcotr 2
- this->editura = editura;
- }
- void afisare() { // functia virtuala de afisare 2
- Bibloteca::afisare(); // apelam functia de afisare din clasa de baza pentru elmentul curent
- cout << editura << " " << "\n\n";
- }
- };
- ostream& operator<<(ostream& iesire, Revista* R) // supra incarcam operatorul de iesire pentru clasa Revista
- {
- Bibloteca::AfisareLista(); // folosim functia de afisare
- return iesire;
- }
- istream& operator >> (istream& intrare, Revista* R) // supra incarcam operatorul de intrare pentru clasa Revista
- {
- cout << "Introducerea Revista: " << endl; // facem citirea de la tastaura
- string editura;// variabila declara
- cout << "Introduceti editura "; getline(intrare, editura);// citim editura cu getline sa luam toata linia
- new Revista(editura); // apelam constructorul care va aduga elemntul in lista conform constructorul casei de baza
- return intrare;
- }
- ostream& operator<<(ostream& iesire, Carte *C)// la fel ca si pentru revista
- {
- Bibloteca::AfisareLista();
- return iesire;
- }
- istream& operator >> (istream& intrare, Carte *C)// la fel ca si pentru revista
- {
- cout << "Introducerea Cartea: " << endl;
- string nume, autor;
- cout << "Introduceti nume "; getline(intrare, nume);
- cout << "Introduceti autor "; getline(intrare, autor);
- new Carte(nume, autor);
- return intrare;
- }
- int main() {
- Carte* carte = NULL; // pentru a indica citirea care se poate face si din fiser numai ca nu am vazut eu bine
- Revista* revista = NULL; // trebuie doar declarat fiserul si folosit pointerul fiser in loc de cin datoria supra incarcari opertaroului
- int opt, id;
- char c;
- do {
- cout << "\n1. Adaugare Obiect";// meniu pentru interfata cu utikizaotrul
- cout << "\n2. Afisare Obiecte";
- cout << "\n3. Cautare Obiect";
- cout << "\n4. Stergere Obiect";
- cout << "\n5. Afisare nr carti";
- cout << "\n0. Iesire";
- cout << "\nIntroduceti optiunea dorita: "; cin >> opt; // citim optiunea utlizotrului
- getchar();// ramane \n in buffer si trebuie scapat de el
- system("cls"); // sterem feasrta ca sa nu fie prea mult scris
- switch (opt) { // in functie de optiuena utilizaotrului ne ducem pe ramura necesra operatiuni
- case 0: return 0; break;
- case 1:
- cout << "\nEste C - Carte, R- Revista: "; cin >> c;
- getchar();// din nou ramane \n in buffer
- if (c == 'C') cin >> carte;
- else cin >> revista;
- break;
- case 2:
- cout << revista;
- break;
- case 3:
- cout << "\nIntroduceti id obiect: "; cin >> id;
- Bibloteca::CautObiect(id); // am lucat cu functii statice
- break;
- case 4:
- cout << "\nIntroduceti id obiect: "; cin >> id;
- Bibloteca::StergeOb(id);// stergem obicetul cu id dat de utilizator
- break;
- case 5:
- Bibloteca::AfisareNr();//afisam
- }
- } while (1);
- }
Advertisement
Add Comment
Please, Sign In to add comment