Post on 14-Apr-2018
transcript
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 1/14
Ministerul Educa iei al Republicii Moldovaț
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică i Microelectronicăș
Catedra Automatică i Tehnologii Informa ionaleș ț
RAPORT
Disciplina: Analiza, proiectarea i programarea orientată pe obiecteș
Lucrare de laborator Nr. 2
Tema: Biblioteca standardă de abloane (STL)ș
Varianta 8
A efectuat :
A verificat: lector superior Duca Ludmila
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 2/14
Chi inău 2013ș
1 Scopurile lucrării
Însu irea tehnologiei programării generice cu utilizarea bibliotecii standarde de abloaneș ș
(Standard Template Library – STL) din C++.
2 Sarcina lucrării
Programul 1
1. Să se creeze un obiect-container corespunzător variantei i să fie completat cu date al căror ș
tip este indicat în variantă.
2. Să fie afi at containerul.ș
3. Să fie modificat containerul, tergându-se unele elemente i înlocuind altele.ș ș
4. Să fie afi at containerul, utilizând pentru accesul la elementele sale iteratori.ș
5. Să se creeze un al doilea container de acee i clasă i să fie completat cu date de acela i tip caș ș ș
i primul container.ș
6. Să fie modificat primul container, tergându-se din elș n elemente după un element dat i apoiș
adăugându-se în el toate elementele containerului al doilea.
7. Să fie afi at primul i al doilea container.ș ș
Programul 2
Să se îndeplinească acelea i sarcini ca la primul program, dar pentru date de un tip definit deș
utilizator.
Programul 3
1. Să se creeze un container ce con ine obiecte de un tip definit de utilizator. Tipul containeruluiț
se alege în conformitate cu varianta.
2. Să se sorteze containerul descrescator.3. Să se afi eze containerul.ș
4. Utilizând un algoritm corespunzător, să se găsească în container un element care satisface o
anumită condi ie.ț
5. Să se mute elementele care satisfac o anumită condi ie în alt container (care înainte de astaț
este vid). Tipul containerului al doilea se determină din variantă.
6. Să fie afi at al doilea container.ș
7. Să se sorteze crescător primul i al doilea container.ș
8. Să fie afi ate containerele.ș
9. Să se ob ină un al treilea container prin interclasarea primelor 2.ț
2
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 3/14
10. Să fie afi at al treilea container.ș
11. Să se numere câte elemente care satisfac o anumită condi ie sunt în al treilea container.ț
12. Să se determine dacă în al treilea container există un element care satisface o anumită
condi ie.ț
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
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 4/14
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
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 5/14
}
Codul sursă al programului 2
#include <iostream>
#include <list>
using namespace std;
class Cerc {
public:
double x, y, r;
friend istream& operator >> (istream &, Cerc &);
friend ostream& operator << (ostream &, Cerc &);
};
istream& operator >> (istream &input, Cerc &c) {
cout << "x: ";
input >> c.x;
cout << "y: ";
input >> c.y;
cout << "raza: ";
return input >> c.r;
}
ostream& operator << (ostream &output, Cerc &c) {
return output << "{ x: " << c.x << ", y: " << c.y << ", raza: " << c.r << " }";
}
list<Cerc> l1, l2;
list<Cerc>::iterator it;
Cerc 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;
5
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 6/14
// 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
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 7/14
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;
}
Codul sursă al programului 3
#include <iostream>
#include <list>
#include <deque>
#include <vector>
#include <algorithm>
using namespace std;
class Cerc {
public:
double x, y, r;
bool operator < (Cerc &);
friend istream& operator >> (istream &, Cerc &);
friend ostream& operator << (ostream &, Cerc &);
};
bool Cerc::operator < (Cerc &c) {
return this->r < c.r;
}
istream& operator >> (istream &input, Cerc &c) {
cout << "x: ";
input >> c.x;
cout << "y: ";
input >> c.y;
cout << "raza: ";
7
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 8/14
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
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 9/14
// 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
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 10/14
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
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 11/14
Screenshot-uri cu rezultatele execu ieiț
Programul 1
11
7/27/2019 APPOO 2.doc
http://slidepdf.com/reader/full/appoo-2doc 14/14
Concluzii
La această lucrare de laborator am studiat biblioteca standardă de abloane STL din C++.ș
Această bibliotecă con ine 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 ni te 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 prelucrări asupra containerelor, cum sunt sortările,
căutările .a.ș
14