Professional Documents
Culture Documents
RAPORT
Disciplina: Analiza, proiectarea i programarea orientat pe obiecte Lucrare de laborator Nr. 2 Tema: Biblioteca standard de abloane (STL)
Varianta 8
Chiinu 2013
1 Scopurile lucrrii nsuirea tehnologiei programrii generice cu utilizarea bibliotecii standarde de abloane (Standard Template Library STL) din C++. 2 Sarcina lucrrii Programul 1 1. S se creeze un obiect-container corespunztor variantei i s fie completat cu date al cror tip este indicat n variant. 2. S fie afiat containerul. 3. S fie modificat containerul, tergndu-se unele elemente i nlocuind altele. 4. S fie afiat containerul, utiliznd pentru accesul la elementele sale iteratori. 5. S se creeze un al doilea container de aceei clas i s fie completat cu date de acela i tip ca i primul container. 6. S fie modificat primul container, tergndu-se din el n elemente dup un element dat i apoi adugndu-se n el toate elementele containerului al doilea. 7. S fie afiat primul i al doilea container. Programul 2 S se ndeplineasc aceleai sarcini ca la primul program, dar pentru date de un tip definit de utilizator. Programul 3 1. S se creeze un container ce conine obiecte de un tip definit de utilizator. Tipul containerului se alege n conformitate cu varianta. 2. S se sorteze containerul descrescator. 3. S se afieze containerul. 4. Utiliznd un algoritm corespunztor, s se gseasc n container un element care satisface o anumit condiie. 5. S se mute elementele care satisfac o anumit condiie n alt container (care nainte de asta este vid). Tipul containerului al doilea se determin din variant. 6. S fie afiat al doilea container. 7. S se sorteze cresctor primul i al doilea container. 8. S fie afiate containerele. 9. S se obin un al treilea container prin interclasarea primelor 2.
2
10. S fie afiat al treilea container. 11. S se numere cte elemente care satisfac o anumit condiie sunt n al treilea container. 12. S se determine dac n al treilea container exist un element care satisface o anumit condiie. 3 Realizarea sarcinii Codul surs al programului 1
#include <iostream> #include <list> using namespace std; list<long> l1, l2; list<long>::iterator it; long element; int n; int main() { // 1. Adaugarea elementelor in lista cout << "Cate elemente doriti sa introduceti in lista 1? "; cin >> n; cout << "Introduceti elementele listei 1:" << endl; for (int i=0; i<n; ++i) { cin >> element; l1.push_back(element); } cout << endl; // 2. Afisarea elementelor listei cout << "Elementele listei 1 sunt:" << endl; for (it=l1.begin(); it!=l1.end(); ++it) { cout << *it << " "; } cout << endl << endl; // 3. Stergerea unor elemente si inlocuirea altora cout << "Stergem primul element din lista 1..." << endl; l1.erase(l1.begin()); cout << "Stergem ultimul element din lista 1..." << endl; l1.pop_back(); cout << "Adaugam 10 la primul element din lista 1..." << endl; it = l1.begin(); *it += 10; 3
cout << "Adaugam 20 la al doilea element din lista 1..." << endl; advance(it, 1); *it += 20; cout << endl; // 4. Afisarea elementelor listei cout << "Elementele listei 1 sunt:" << endl; for (it=l1.begin(); it!=l1.end(); ++it) { cout << *it << " "; } cout << endl << endl; // 5. Adaugam elemente in lista 2 cout << "Cate elemente doriti sa introduceti in lista 2? "; cin >> n; cout << "Introduceti elementele listei 2:" << endl; for (int i=0; i<n; ++i) { cin >> element; l2.push_back(element); } cout << endl; // 6. Stergem elementele din lista 1 dupa un element dat si le adaugam pe cele din lista 2 cout << "Dupa al catelea element din lista 1 doriti sa stergeti? "; cin >> n; it = l1.begin(); advance(it, n); l1.insert(l1.erase(it, l1.end()), l2.begin(), l2.end()); cout << endl; // 7. Afisam lista 1 si lista 2 cout << "Elementele listei 1 sunt:" << endl; for (it=l1.begin(); it!=l1.end(); ++it) { cout << *it << " "; } cout << endl << endl; cout << "Elementele listei 2 sunt:" << endl; for (it=l2.begin(); it!=l2.end(); ++it) { cout << *it << " "; } return 0; 4
// 2. Afisarea elementelor listei cout << "Elementele listei 1 sunt:" << endl; for (it=l1.begin(); it!=l1.end(); ++it) { cout << *it << " "; } cout << endl << endl; // 3. Stergerea unor elemente si inlocuirea altora cout << "Stergem primul element din lista 1..." << endl; l1.erase(l1.begin()); cout << "Stergem ultimul element din lista 1..." << endl; l1.pop_back(); cout << "Adaugam 10 la raza primului element din lista 1..." << endl; it = l1.begin(); it->r += 10; cout << "Adaugam 20 la raza elementului al doilea din lista 1..." << endl; advance(it, 1); it->r += 20; cout << endl; // 4. Afisarea elementelor listei cout << "Elementele listei 1 sunt:" << endl; for (it=l1.begin(); it!=l1.end(); ++it) { cout << *it << " "; } cout << endl << endl; // 5. Adaugam elemente in lista 2 cout << "Cate elemente doriti sa introduceti in lista 2? "; cin >> n; cout << "Introduceti elementele listei 2:" << endl; for (int i=0; i<n; ++i) { cin >> element; l2.push_back(element); } cout << endl; // 6. Stergem elementele din lista 1 dupa un element dat si le adaugam pe cele din lista 2 cout << "Dupa al catelea element din lista 1 doriti sa stergeti? "; cin >> n; it = l1.begin(); advance(it, n); l1.insert(l1.erase(it, l1.end()), l2.begin(), l2.end()); 6
cout << endl; // 7. Afisam lista 1 si lista 2 cout << "Elementele listei 1 sunt:" << endl; for (it=l1.begin(); it!=l1.end(); ++it) { cout << *it << " "; } cout << endl << endl; cout << "Elementele listei 2 sunt:" << endl; for (it=l2.begin(); it!=l2.end(); ++it) { cout << *it << " "; } return 0; }
return input >> c.r; } ostream& operator << (ostream &output, Cerc &c) { return output << "{ x: " << c.x << ", y: " << c.y << ", raza: " << c.r << " }"; } bool maiMare(const Cerc &c1, const Cerc &c2) { return c1.r > c2.r; } bool maiMic(const Cerc &c1, const Cerc &c2) { return c1.r < c2.r; } bool areRaza1(const Cerc &c) { return c.r == 1; } bool coincideXY(const Cerc &c) { return c.x == c.y; } list<Cerc> l; list<Cerc>::iterator lit; deque<Cerc>::iterator dit; vector<Cerc>::iterator vit; Cerc element; int n; int main() { // 1. Adaugarea elementelor in lista cout << "Cate elemente doriti sa introduceti in lista? "; cin >> n; cout << "Introduceti elementele listei 1:" << endl; for (int i=0; i<n; ++i) { cin >> element; l.push_back(element); } cout << endl; // 2. Sortarea descrescatoare a elementelor din lista cout << "Sortam descrescator elementele din lista..." << endl << endl; l.sort(maiMare); 8
// 3. Afisarea listei cout << "Elementele listei sunt:" << endl; for(lit=l.begin(); lit!=l.end(); ++lit) { cout << *lit << " "; } cout << endl << endl; // 4. Cautarea in lista a unui cerc cu raza 1 cout << "Cautam in lista un cerc cu raza 1..." << endl; lit = find_if(l.begin(), l.end(), areRaza1); if (lit != l.end()) { cout << "Cercul cu raza 1 gasit este: " << *lit; } else { cout << "N-am gasit in lista nici un cerc cu raza 1."; } cout << endl << endl; // 5. Mutarea cercurilor cu raza 1 in deque cout << "Mutam cercurile cu x=y din lista in deque..." << endl << endl; deque<Cerc> d(count_if(l.begin(), l.end(), coincideXY)); copy_if(l.begin(), l.end(), d.begin(), coincideXY); l.remove_if(coincideXY); // 6. Afisarea elementelor din deque cout << "Elementele din deque sunt:" << endl; for (dit=d.begin(); dit!=d.end(); ++dit) { cout << *dit << " "; } cout << endl << endl; // 7. Sortarea crescatoare a listei si a deque-ului cout << "Sortam crescator lista si deque-ul..." << endl << endl; l.sort(maiMic); sort(d.begin(), d.end(), maiMic); // 8. Afisam lista si deque-ul cout << "Elementele din lista sunt:" << endl; for (lit = l.begin(); lit!=l.end(); ++lit) { cout << *lit << " "; } cout << endl << endl; cout << "Elementele din deque sunt:" << endl; 9
for (dit = d.begin(); dit!=d.end(); ++dit) { cout << *dit << " "; } cout << endl << endl; // 9. Obtinerea unui al treilea container prin interclasarea primelor 2 vector<Cerc> v(l.size() + d.size()); cout << "Interclasam lista cu deque-ul intr-un al treilea container..." << endl << endl; merge(l.begin(), l.end(), d.begin(), d.end(), v.begin()); // 10. Afisarea celui de-al treilea container cout << "Elementele containerului al treilea:" << endl; for (vit=v.begin(); vit!=v.end(); ++vit) { cout << *vit << " "; } cout << endl << endl; // 11. Numara cate cercuri cu raza 1 sunt in al treilea container cout << "In al treilea container exista " << count_if(v.begin(), v.end(), areRaza1) << " cercuri cu raza 1." << endl << endl; // 12. Verificarea daca in al treilea container exista cercuri cu raza 1 vit = find_if(v.begin(), v.end(), areRaza1); if (vit!=v.end()) { cout << "In al treilea container exista cercuri cu raza 1." << endl; } else { cout << "In al treilea container nu exista cercuri cu raza 1." << endl; } return 0; }
10
11
Programul 2
12
Programul 3
13
Concluzii La aceast lucrare de laborator am studiat biblioteca standard de abloane STL din C++. Aceast bibliotec conine un set de diferite tipuri de containere utile, iteratori pentru accesul la elementele acestora i algoritmi pentru prelucrarea lor. Datorit faptului c aceste containere sunt de fapt nite abloane de clase, ele sunt foarte comode i pot fi utilizate cu elemente de diferite tipuri, chiar i cu tipuri de date definite de utilizatori. Algoritmii, de asemenea, sunt utili, deoarece scutesc programatorul de implementarea celor mai comune prelucrri asupra containerelor, cum sunt sortrile, cutrile .a.
14