Last active
April 5, 2026 14:20
-
-
Save thinkphp/26bb51de793774f65f2f903e2e1b54d8 to your computer and use it in GitHub Desktop.
Clase: Carte , Sala proiect1.cpp
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream>//cout,cin | |
| #include <fstream> //fstream | |
| #include <string> | |
| #include <map> | |
| //========================================================= | |
| // CLASA CARTE | |
| //========================================================= | |
| using namespace std; | |
| class Carte { | |
| private: | |
| int cod; | |
| string autor; | |
| string titlu; | |
| public: | |
| //constructorul implicit | |
| Carte(): cod(0), autor(""), titlu("") {} | |
| //constructor cu parametri | |
| Carte(int cod, const string& autor, const string& titlu) : cod(cod), autor(autor), titlu(titlu) {} //0.5 puncte | |
| //functii de access (getteri/setteri) | |
| int getCod() const { return cod; } | |
| string getAutor() const {return autor; } | |
| string getTitlu() const {return titlu; } | |
| //urmeaza setterii: | |
| void setCod(int c) {cod = c;} | |
| void setAutor(const string& a) {autor = a;} | |
| void setTitlu(const string& t) {titlu = t;} //0.5 puncte | |
| //operator << afisare in forma cod, autor si titlu | |
| friend ostream& operator<<(ostream& os, const Carte& c) { | |
| os<<c.cod<<", "<<c.titlu<<", "<<c.autor; | |
| return os; | |
| } | |
| friend fstream& operator << (fstream& fs, const Carte &c) { | |
| fs << c.cod<<", "<<c.autor<<", "<<c.titlu<<"\n"; | |
| return fs; | |
| } | |
| }; | |
| //========================================================= | |
| // CLASA SALA | |
| //========================================================= | |
| class Sala { | |
| private: | |
| int idSala; | |
| string numeSala; | |
| //colectie de perechi: adresa obiect Carte ----> numar de exemplare | |
| map<Carte*, int> fondCarti; | |
| public: | |
| //constructorul clasei | |
| Sala(int id, const string& nume): idSala( id ), numeSala( nume ) {} | |
| //functii de access:getter si setter | |
| int getIdSala() const { return idSala; } | |
| string getNumeSala() const {return numeSala; } | |
| //adaugam o carte in sala cu un anumit numar de exemplare | |
| //daca aceasta se afla deja in alta sala, se foloseste acelasi pointer | |
| //evitam multiplicarea obiectului Carte | |
| void adaugaCarte( Carte*c, int nrExemplare ) { | |
| //daca exista deja, incrementam | |
| if(fondCarti.count(c)) { | |
| fondCarti[ c ] += nrExemplare; | |
| } else { | |
| fondCarti[ c ] = nrExemplare; | |
| } | |
| } | |
| //operator [] - returneaza numarul de exemplare pentru cartea cu codul dat; | |
| int& operator[](int codCarte) { | |
| for(auto& pereche: fondCarti) { | |
| if(pereche.first->getCod() == codCarte) { | |
| return pereche.second; | |
| } | |
| } | |
| //cod negasit - aruncam o exceptie | |
| throw runtime_error("Carte cu codul " + to_string(codCarte) + " nu exista in sala"); | |
| } | |
| //operator -= scoate carte cu codul furnizat din sala | |
| Sala& operator-=( int codCarte ) { | |
| //adresa1, adresa2, adresa3....adresa; it++; it urmatoarea adresa *it; get la valoare | |
| for(auto it = fondCarti.begin(); it != fondCarti.end(); ++it) { | |
| if( it->first->getCod() == codCarte ) { | |
| fondCarti.erase( it ); | |
| return *this; | |
| } | |
| } | |
| cerr<<"Carte cu codul "<<codCarte<<" nu a fost gasita in sala. \n"; | |
| return *this; | |
| } | |
| //operator supraincarcat << afisare consola | |
| //id SALA si numele SALII pe o linie | |
| //apoi indentat cu \t fiecare carte + numar de exemplare | |
| friend ostream& operator<<(ostream& os, const Sala& s) { | |
| os << s.idSala <<" "<< s.numeSala<<"\n"; | |
| //loop fara iterator | |
| for(const auto& pereche: s.fondCarti) { | |
| os<<"\t"<<*pereche.first<<", "<<pereche.second<<"\n"; | |
| } | |
| return os; | |
| } | |
| //operator << supraincarcat fisier TEXT; | |
| friend fstream& operator <<(fstream& fs, const Sala& s) { | |
| fs << s.idSala <<" "<< s.numeSala<<"\n"; | |
| for(const auto& pereche: s.fondCarti) { | |
| fs <<"\t"; | |
| fs << pereche.first->getCod()<<"," | |
| << pereche.first->getAutor()<<"," | |
| << pereche.first->getTitlu()<<"," | |
| << pereche.second<<"\n"; | |
| } | |
| return fs; | |
| } | |
| //functie care returneaza cartea (sau cartile) cu cel mai mare numar de exemplare si afiseaza acel numar | |
| Carte* carteCuMaxExemplare() { | |
| if(fondCarti.empty()) return nullptr;//pointer null | |
| int maxEx = -1; | |
| Carte* maxCarte = nullptr; | |
| for(auto &pereche: fondCarti) { | |
| if(pereche.second > maxEx) { | |
| maxEx = pereche.second; | |
| maxCarte = pereche.first; | |
| } | |
| } | |
| cout<<"Cartea cu cele mai multe exemplare: "<< *maxCarte<<" |Exemplare: "<<maxEx<<"\n"; | |
| return maxCarte; | |
| } | |
| }; | |
| //================================================================ | |
| // Main - functia principala | |
| //================================================================ | |
| int main(int argc, char const *argv[]) | |
| { | |
| //--- Creare carti --- | |
| Carte c1(10, "Dostoievsky", "Crima si pedeapsa"); | |
| Carte c2(20, "Dostoievsky", "Idiotul"); | |
| Carte c3(30, "Dostoievsky", "Fratii Karamazov"); | |
| Carte c4(40, "Dostoievsky", "Oameni Sarmani"); | |
| // -- creare sali---- | |
| //se cream si doua sali | |
| Sala s1(101, "Sala 1"); | |
| Sala s2(110, "Sala 2"); | |
| // ---- Adaugare carti in Sala 1 ------- | |
| s1.adaugaCarte(&c1, 5);//Adaugam Crima si Pedeapsa - in 5 exemplare | |
| s1.adaugaCarte(&c2, 10); //adauga Idiotul in 10 exemplare | |
| // ----- Adaugare carti in Sala 2 ------------- | |
| s2.adaugaCarte(&c3, 4); //Fratii KAramazov in 4 exemplare | |
| s2.adaugaCarte(&c4, 7); //Oameni sarmani in 7 exemplare | |
| s2.adaugaCarte(&c1, 2); //Crima si Pedeapsa in 2 exemplare | |
| //afisare Consola | |
| cout<<s1; | |
| cout<<s2; | |
| cout << "\n==== Operator [] === \n"; | |
| cout<<"Exemplare 'Idiotul' in Sala 1: "<<s1[20]<<"\n"; | |
| cout<<s1[20]<<"\n"; | |
| s1[20] = 12; | |
| cout<<"Dupa modificare: "<<s1[20]<<"\n"; | |
| cout<<"\n ===================== Cartea cu max exemplare in Sala 1 ======== \n"; | |
| s1.carteCuMaxExemplare(); | |
| cout<<"\n ===================== Cartea cu max exemplare in Sala 2 ======== \n"; | |
| s2.carteCuMaxExemplare(); | |
| // Operator -= Scoatere CARTE ------ | |
| cout<<"\n ===== Dupa scoaterea cartii 20 din Sala 1 ==== \n"; | |
| s1 -= 20; | |
| cout<<s1; | |
| ///Serializare in fisier TEXT --- | |
| fstream fout("biblioteca.txt", ios::out); | |
| if(fout.is_open()) { | |
| fout << s1; | |
| fout << s2; | |
| fout.close(); | |
| cout<<"\n Datele au fost SALVATE in fisierul 'biblioteca.txt'.\n"; | |
| } | |
| /* | |
| int a; | |
| a = 1; | |
| int *p = &a; | |
| cout<<a<<" - "<<*p<<"-"<<&a<<" --- p="<<p; | |
| */ | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment