Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Proiect_IEP_2.cpp : This file contains the 'main' function. Program execution begins and ends there.
- //
- #include <iostream>
- #include <string>
- #include <list>
- #include <iterator>
- #include <assert.h>
- using namespace std;
- #define NR_MAX_GAINI 30
- bool one_instance_strut = false;
- class Pasare
- {
- public:
- virtual void zboara() = 0;
- virtual void afisare_sunet() = 0;
- virtual void afisare_toti_parametrii() = 0;
- virtual string get_sunet() = 0;
- };
- class Papagal:public Pasare
- {
- private:
- std::list<string> lista_cuvinte;
- string sunet;
- int distanta = 0;
- public:
- Papagal(list<string> lista_cuvinte_papagal, string sunet, int distanta_zboara)
- {
- list<string>::iterator it;
- for (it = lista_cuvinte_papagal.begin(); it!= lista_cuvinte_papagal.end(); it++)
- {
- lista_cuvinte.push_back(*it);
- }
- this->sunet = sunet;
- this->distanta = distanta_zboara;
- }
- void zboara()
- {
- std::cout << "Papagalul poate zbura la distanta de: " << this->distanta << endl;
- }
- void afisare_sunet()
- {
- std::cout << "Sunetul papagalului este: " << this->sunet << endl;
- }
- string get_sunet()
- {
- return this->sunet;
- }
- void afisare_lista_cuvinte()
- {
- list<string>::iterator it;
- for (it = lista_cuvinte.begin(); it != lista_cuvinte.end(); it++)
- {
- std::cout << *it << endl;
- }
- }
- void afisare_toti_parametrii()
- {
- std::cout << "\nPAPAGAL\nCuvintele stiute de catre papagal sunt: \n";
- afisare_lista_cuvinte();
- afisare_sunet();
- zboara();
- }
- };
- class Gaina :public Pasare
- {
- private:
- int distanta = 0;
- static int nr_instante_gaini;
- bool vandut = false;
- string sunet;
- public:
- Gaina(int distanta, string sunet)
- {
- this->distanta = distanta;
- this->sunet = sunet;
- Gaina::incrementare_nr_instante_gaini();
- }
- ~Gaina()
- {
- std::cout << "Obiect gaina distrus";
- }
- void zboara()
- {
- std::cout << "Gaina poate zbura la distanta de: " << this->distanta << endl;
- }
- void afisare_sunet()
- {
- std::cout << "Sunetul gainii este: " << this->sunet << endl;
- }
- string get_sunet()
- {
- return this->sunet;
- }
- void afisare_toti_parametrii()
- {
- std::cout << "\nGAINA\n";
- afisare_sunet();
- zboara();
- afisare_vandut();
- std::cout << "Nr instante gaini: " << get_instante() << "\n";
- }
- void vand_gaina()
- {
- vandut=true;
- scadere_nr_instante_gaini();
- }
- void afisare_vandut()
- {
- if (vandut == true)
- {
- cout << "Gaina vanduta" << endl;
- }
- else
- {
- cout << "Gaina nevanduta" << endl;
- }
- }
- static void scadere_nr_instante_gaini()
- {
- nr_instante_gaini--;
- }
- static void incrementare_nr_instante_gaini()
- {
- nr_instante_gaini++;
- }
- static int get_instante()
- {
- return nr_instante_gaini;
- }
- };
- class Strut :public Pasare
- {
- private:
- static Strut* instance;
- int distanta=-1;
- string sunet;
- int nr_gaini;
- public:
- static Strut* getInstance()
- {
- if (!instance)
- instance = new Strut();
- else
- return instance;
- }
- int get_nr_gaini_ale_strutului()
- {
- return this->nr_gaini;
- }
- void set_distanta(int distanta)
- {
- this->distanta = distanta;
- }
- void set_sunet(string sunet)
- {
- this->sunet = sunet;
- }
- string get_sunet()
- {
- return this->sunet;
- }
- int get_distanta()
- {
- return this->distanta;
- }
- void zboara()
- {
- std::cout << "Strutul poate zbura la distanta de: " << this->distanta << endl;
- }
- void afisare_sunet()
- {
- std::cout << "Sunetul strutului este: " << this->sunet << endl;
- }
- void afisare_toti_parametrii()
- {
- std::cout << "\STRUT\n";
- afisare_sunet();
- zboara();
- std::cout << "Nr gaini continute de strut: " << get_nr_gaini_ale_strutului() << "\n";
- }
- void operator+(Gaina* gaina)
- {
- this->nr_gaini++;
- Gaina::scadere_nr_instante_gaini();
- //gaina->~Gaina();
- }
- };
- void afisare_meniu()
- {
- std::cout << "\n\n1. Adaugare papagal in lista";
- std::cout << "\n2. Adaugare gaina in lista";
- std::cout << "\n3. Setare parametrii obiectului strut";
- std::cout << "\n4. Afisare pasari";
- std::cout << "\n5. Vanzare gaina";
- std::cout << "\n6. Adunare gaina cu strut\n";
- }
- void do_action(int optiune, list<Pasare*> *lista_pasari)
- {
- switch (optiune)
- {
- case 1:
- {
- int nr_elemente_lista;
- int distanta;
- string cuvant;
- string sunet;
- list<string> lista;
- std::cout << "Cate cuvinte stie papagalul? ";
- cin >> nr_elemente_lista;
- std::cout << "\nIntroduceti pe rand, cu enter intre ele, cuvintele stiute de papagal:\n";
- for (int i = 0; i < nr_elemente_lista; i++)
- {
- cin >> cuvant;
- lista.push_back(cuvant);
- }
- std::cout << "\nIntroduceti sunetul caracteristic papagalului: ";
- std::cin >> sunet;
- std::cout << "\nIntroduceti distanta la care poate sa zboare papagalul: ";
- std::cin >> distanta;
- lista_pasari->push_back(new Papagal(lista, sunet, distanta));
- break;
- }
- case 2:
- {
- int distanta;
- string sunet;
- if (Gaina::get_instante() == NR_MAX_GAINI)
- {
- std::cout << "S-a ajuns la nr maxim de gaini! NU se mai poate crea nicio gaina\n";
- return;
- }
- std::cout << "\nIntroduceti sunetul caracteristic gainii: ";
- std::cin >> sunet;
- std::cout << "\nIntroduceti distanta la care poate sa zboare gaina, MAI MICA DE 10 METRI: ";
- std::cin >> distanta;
- if (distanta > 10)
- {
- std::cout << "Ati introdus o distanta > 10m => Nu s-a putut crea obiectul gaina.\n";
- return;
- }
- lista_pasari->push_back(new Gaina(distanta, sunet));
- break;
- }
- case 3:
- {
- int distanta;
- string sunet;
- Strut* strut = strut->getInstance();
- std::cout << "\nIntroduceti sunetul caracteristic strutului: ";
- std::cin >> sunet;
- std::cout << "\nIntroduceti distanta la care poate sa zboare strutul: ";
- std::cin >> distanta;
- strut->set_distanta(distanta);
- strut->set_sunet(sunet);
- if (one_instance_strut == false)
- {
- lista_pasari->push_back(strut);
- one_instance_strut = true;
- }
- break;
- }
- case 4:
- {
- if (lista_pasari->empty())
- {
- std::cout << "\nLista de pasari este goala!\n";
- break;
- }
- std::cout << "\nPasarile sunt:\n";
- std::list<Pasare*>::iterator it;
- for (it = lista_pasari->begin(); it != lista_pasari->end(); it++)
- {
- (*it)->afisare_toti_parametrii();
- }
- break;
- }
- case 5:
- {
- string sunet;
- if (Gaina::get_instante()==0)
- {
- cout << "\nLista de gaini este goala!\n";
- break;
- }
- std::list<Pasare*>::iterator it;
- for (it = lista_pasari->begin(); it != lista_pasari->end(); it++)
- {
- cout << "Introduceti sunetul al carei gaini vreti sa o vindeti: ";
- cin >> sunet;
- if((*it)->get_sunet()==sunet)
- {
- /* do a cast to Gaina class to be able to access its functions */
- Gaina* gainaPtr2 = dynamic_cast<Gaina*>(*it);
- gainaPtr2->vand_gaina();
- std::cout << "\nGaina vanduta!\n";
- }
- }
- break;
- }
- case 6:
- {
- string sunet;
- bool found = false;
- std::list<Pasare*>::iterator it;
- if (lista_pasari->empty())
- {
- cout << "\nLista de pasari este goala!\n";
- break;
- }
- if (Gaina::get_instante() == 0)
- {
- cout << "\nLista de gaini este goala!\n";
- break;
- }
- Strut* strut = strut->getInstance();
- if (strut->get_distanta() == -1)
- {
- cout << "\nSetati parametri strutului mai intai!\n";
- break;
- }
- cout << "Introduceti sunetul al carei gaini vreti sa o vindeti: ";
- cin >> sunet;
- Gaina* gainaPtr2=NULL;
- for (it = lista_pasari->begin(); it != lista_pasari->end(); it++)
- {
- if ((*it)->get_sunet() == sunet)
- {
- /* do a cast to Gaina class to be able to access its functions */
- gainaPtr2 = dynamic_cast<Gaina*>(*it);
- found = true;
- }
- }
- if (found == false)
- {
- cout << "Nu s-a gasit gaina cu acest sunet" << endl;
- }
- else
- {
- lista_pasari->remove(gainaPtr2);
- strut->operator+(gainaPtr2);
- gainaPtr2->~Gaina();
- }
- break;
- }
- }
- }
- void citire_optiune(list<Pasare*> *lista_pasari)
- {
- int optiune;
- std::cout << "Introduceti optiunea: ";
- std::cin >> optiune;
- do_action(optiune,lista_pasari);
- }
- Strut *Strut::instance = NULL;
- int Gaina::nr_instante_gaini = 0;
- int main()
- {
- std::list<Pasare*> lista_pasari;
- while (1)
- {
- afisare_meniu();
- citire_optiune(&lista_pasari);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement