Skip to content

Instantly share code, notes, and snippets.

@thinkphp
Last active April 5, 2026 14:20
Show Gist options
  • Select an option

  • Save thinkphp/26bb51de793774f65f2f903e2e1b54d8 to your computer and use it in GitHub Desktop.

Select an option

Save thinkphp/26bb51de793774f65f2f903e2e1b54d8 to your computer and use it in GitHub Desktop.
Clase: Carte , Sala proiect1.cpp
#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