Sunteți pe pagina 1din 21

Ministerul Educaiei al Republicii Moldova Universitatea Tehnic a Moldovei Facultatea Calculatoare, Informatic i Microelectronic Catedra Automatic i Tehnologii Informaionale

RAPORT

Disciplina: Analiza, proiectarea i programarea orientat pe obiecte Lucrare de laborator Nr. 1 Tema: Biblioteca standard de abloane (STL)
Varianta 3

A efectuat : A verificat:

studentul grupei TI-102 Lazari Mihai lector superior Duca Ludmila

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. i primul container.

5. S se creeze un al doilea container de aceei clas i s fie completat cu date de acelai tip ca
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. S fie afiat al doilea container.

6.

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. condiie. 3 Realizarea sarcinii

12. S se determine dac n al treilea container exist un element care satisface o anumit

Codul surs al programului 1


#include <iostream> #include <conio.h> #include <ctype.h> #include <algorithm> #include <deque> #include <stack> #include <vector> using namespace std; // Functie-predicat ce reprezinta conditia pe care trebuie sa o indeplineasca elementele ce vor fi inlocuite bool esteNegativ(float elem) { return elem < 0; } // Functie ce muta elementele dintr-un stack intr-un vector void muta_vs(vector<float> &v, stack<float> &s) { v.resize(s.size()); // Setam marimea vectorului egala cu numarul de elemente din stiva vector<float>::reverse_iterator rit; for(rit=v.rbegin(); rit!=v.rend(); rit++) { // Vetorul e parcurs de la sfarsit spre inceput *rit = s.top(); // Copie in vector elementul din varful stivei s.pop(); // scoate elementul din stiva, pentru a putea avea acces la urmatorul } } // Functie ce copie elementele dintr-un vector intr-un stack void copie_sv(stack<float> &s, vector<float> &v) { // Golim stiva while(!s.empty()) { s.pop(); } // Copiem elementele din vector in stiva for(vector<float>::iterator it=v.begin(); it!=v.end(); ++it) { 3

s.push(*it); } } int main() { // *** 1. Crearea deque-ului si completarea lui cu date *** unsigned int n; // Numarul de elemente din deque cout << "Dati numarul de elemente din deque: "; cin >> n; deque<float> d1(n); // Cream un deque cu n elemente deque<float>::iterator it; // Random access iterator pentru acces la elementele deque-ului cout << "Dati elementele deque-ului:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cin >> *it; // Citim elementul din deque accesat cu ajutorul iteratorului } cout << endl; // *** 2. Afisarea deque-ului *** cout << "Elementele din deque:" << endl; for(unsigned int i=0; i<d1.size(); ++i) { cout << d1[i] << " "; } cout << endl << endl; // *** 3. Stergerea/inlocuirea elementelor din deque *** char key; // tasta apasata unsigned int i1, i2; // Indicii ce indica intervalul in care elementele vor fi sterse/inlocuite float val; // Valoarea noua cu care se va face inlocuirea do { cout << "Doriti sa Stergeti elemente sau sa Inlocuiti elemente negative? (S/I) "; do { key = toupper(getch()); } while(key != 'S' && key != 'I'); cout << key << endl; cout << "Dati indicele primului element: "; cin >> i1; cout << "Dati indicele ultimului element: "; cin >> i2;

if(i1>i2 || i1>=d1.size()-1 || i2>=d1.size()-1) { // Daca indicii nu sunt dati corect cout << "Ati introdus incorect indicii." << endl; continue; } if(key == 'S') { // A fost aleasa optiunea de stergere d1.erase(d1.begin()+i1, intervalul specificat } else { // A fost aleasa optiunea de inlocuire cout << "Dati valoarea noua a elementului (elementelor): "; cin >> val; replace_if(d1.begin()+i1, d1.begin()+i2+1, esteNegativ, val); } cout << "Elementele deque-ului in urma operatiei:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; // Afisam elementul din deque accesat cu ajutorul iteratorului } cout << endl << "Doriti sa mai efectuati operatii de stergere/inlocuire? (D/N) "; do { key = toupper(getch()); } while(key != 'D' && key != 'N'); cout << key << endl << endl; } while(key == 'D'); cout << endl; // *** 4. Afisarea deque-ului cu utilizarea iteratorilor pentru accesul la elemente *** cout << "Elementele deque-ului:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; // Afisam elementul din deque accesat cu ajutorul iteratorului } cout << endl << endl; // *** 5. Crearea unui al doilea container - stack si completarea lui cu date *** cout << "Dati numarul de elemente din al doilea container (stack): "; cin >> n; stack<float> s2; // Cream un stack cu n elemente cout << "Dati elementele stack-ului:" << endl; 5 d1.begin()+i2+1); // Sterge elementele din

float f; // Variabila pentru citirea elementelor din stack for(unsigned int i=0; i<n; ++i) { cin >> f; // Citim elementul s2.push(f); // Il adaugam in stiva } cout << endl; // *** 6. Stergerea din deque a n elemente incepand cu un element dat, apoi adaugarea // in el a elementelor stack-ului *** vector<float> v; // Vector in care se vor copia elementele din stack; cout << "Dati indicele primului element din deque care va fi sters: "; cin >> i1; if(i1 < d1.size()) { // Daca indicele este corect cout << "Dati numarul de elemente care vor fi sterse: "; cin >> n; if(i1+n > d1.size()) { cout << "Prea multe elemente vrei sa stergi... Vom sterge numai pana la sfarsitul deque-ului :)" << endl; n = d1.size()-i1; } d1.erase(d1.begin()+i1, d1.begin()+i1+n); cout << "Adaugam elementele din stack in deque." << endl; muta_vs(v, s2); d1.insert(d1.end(), v.begin(), v.end()); copie_sv(s2, v); // Copiem inapoi in stiva elementele din vector } else { cout << "Ati introdus un indice incorect." << endl; } cout << endl; // *** Afisarea elementelor deque-ului si a celor din stack ** cout << "Elementele deque-ului:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; // Afisam elementul din deque accesat cu ajutorul iteratorului } cout << endl << "Elementele stivei:" << endl; for(vector<float>::iterator itv = v.begin(); itv!=v.end(); ++itv) { cout << *itv << " "; // Afisam elementul din deque accesat cu ajutorul iteratorului }

getch(); return 0; }

Codul surs al programului 2 Fiierul p2_2.cpp


#include <iostream> #include <conio.h> #include <ctype.h> #include <algorithm> #include <deque> #include <stack> #include <vector> #include "utilizator.h" using namespace std; // Functie-predicat ce reprezinta conditia pe care trebuie sa o indeplineasca elementele ce vor fi inlocuite bool areScorNul(Utilizator elem) { return elem.areScorNul(); } // Functie ce muta elementele dintr-un stack intr-un vector void muta_vs(vector<Utilizator> &v, stack<Utilizator> &s) { v.resize(s.size()); // Setam marimea vectorului egala cu numarul de elemente din stiva vector<Utilizator>::reverse_iterator rit; for(rit=v.rbegin(); rit!=v.rend(); rit++) { // Vetorul e parcurs de la sfarsit spre inceput *rit = s.top(); // Copie in vector elementul din varful stivei s.pop(); // scoate elementul din stiva, pentru a putea avea acces la urmatorul } } // Functie ce copie elementele dintr-un vector intr-un stack void copie_sv(stack<Utilizator> &s, vector<Utilizator> &v) { // Golim stiva while(!s.empty()) { s.pop(); } // Copiem elementele din vector in stiva for(vector<Utilizator>::iterator it=v.begin(); it!=v.end(); ++it) { s.push(*it); 7

} } int main() { // *** 1. Crearea deque-ului si completarea lui cu date *** unsigned int n; // Numarul de elemente din deque cout << "Dati numarul de elemente din deque: "; cin >> n; deque<Utilizator> d1(n); // Cream un deque cu n elemente deque<Utilizator>::iterator elementele deque-ului cout << "Dati elementele deque-ului:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cin >> *it; // Citim elementul din deque accesat cu ajutorul iteratorului } cout << endl; // *** 2. Afisarea deque-ului *** cout << "Elementele din deque:" << endl; for(unsigned int i=0; i<d1.size(); ++i) { cout << d1[i] << " "; } cout << endl << endl; // *** 3. Stergerea/inlocuirea elementelor din deque *** char key; // tasta apasata unsigned int i1, i2; // Indicii ce indica intervalul in care elementele vor fi sterse/inlocuite Utilizator val; // Valoarea noua cu care se va face inlocuirea do { cout << "Doriti sa Stergeti elemente sau sa Inlocuiti elemente negative? (S/I) "; do { key = toupper(getch()); } while(key != 'S' && key != 'I'); cout << key << endl; cout << "Dati indicele primului element: "; cin >> i1; cout << "Dati indicele ultimului element: "; cin >> i2; if(i1>i2 || i1>=d1.size()-1 || i2>=d1.size()-1) { // Daca indicii nu sunt dati corect 8 it; // Random access iterator pentru acces la

cout << "Ati introdus incorect indicii." << endl; continue; } if(key == 'S') { // A fost aleasa optiunea de stergere d1.erase(d1.begin()+i1, intervalul specificat } else { // A fost aleasa optiunea de inlocuire cout << "Dati valoarea noua a elementului (elementelor): " << endl; cin >> val; replace_if(d1.begin()+i1, d1.begin()+i2+1, areScorNul, val); } cout << "Elementele deque-ului in urma operatiei:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; // Afisam elementul din deque accesat cu ajutorul iteratorului } cout << endl << "Doriti sa mai efectuati operatii de stergere/inlocuire? (D/N) "; do { key = toupper(getch()); } while(key != 'D' && key != 'N'); cout << key << endl << endl; } while(key == 'D'); cout << endl; // *** 4. Afisarea deque-ului cu utilizarea iteratorilor pentru accesul la elemente *** cout << "Elementele deque-ului:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; // Afisam elementul din deque accesat cu ajutorul iteratorului } cout << endl << endl; // *** 5. Crearea unui al doilea container - stack si completarea lui cu date *** cout << "Dati numarul de elemente din al doilea container (stack): "; cin >> n; stack<Utilizator> s2; // Cream un stack cu n elemente cout << "Dati elementele stack-ului:" << endl; Utilizator f; // Variabila pentru citirea elementelor din stack for(unsigned int i=0; i<n; ++i) { 9 d1.begin()+i2+1); // Sterge elementele din

cin >> f; // Citim elementul s2.push(f); // Il adaugam in stiva } cout << endl; // *** 6. Stergerea din deque a n elemente incepand cu un element dat, apoi adaugarea // in el a elementelor stack-ului *** vector<Utilizator> v; // Vector in care se vor copia elementele din stack; cout << "Dati indicele primului element din deque care va fi sters: "; cin >> i1; if(i1 < d1.size()) { // Daca indicele este corect cout << "Dati numarul de elemente care vor fi sterse: "; cin >> n; if(i1+n > d1.size()) { cout << "Prea multe elemente vrei sa stergi... Vom sterge numai pana la sfarsitul deque-ului :)" << endl; n = d1.size()-i1; } d1.erase(d1.begin()+i1, d1.begin()+i1+n); cout << "Adaugam elementele din stack in deque." << endl; muta_vs(v, s2); d1.insert(d1.end(), v.begin(), v.end()); copie_sv(s2, v); // Copiem inapoi in stiva elementele din vector } else { cout << "Ati introdus un indice incorect." << endl; } cout << endl; // *** Afisarea elementelor deque-ului si a celor din stack ** cout << "Elementele deque-ului:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; // Afisam elementul din deque accesat cu ajutorul iteratorului } cout << endl << "Elementele stivei:" << endl; for(vector<Utilizator>::iterator itv = v.begin(); itv!=v.end(); ++itv) { cout << *itv << " "; // Afisam elementul din deque accesat cu ajutorul iteratorului } getch(); return 0; 10

Fiierul Utilizator.h
#ifndef UTILIZATOR_H #define UTILIZATOR_H #include <string> using namespace std; class Utilizator { private: string nume, prenume; int scor; public: Utilizator(); // Constructorul bool areScorNul(); int getScor() const; bool operator < (const Utilizator &) const; friend istream& operator >> (istream &, Utilizator &); friend ostream& operator << (ostream &, Utilizator &); }; #endif

Fiierul Utilizator.cpp
#include "utilizator.h" #include <iostream> Utilizator::Utilizator() { nume = ""; prenume = ""; scor = 0; } bool Utilizator::areScorNul() { return scor == 0; } int Utilizator::getScor() const { return scor; } bool Utilizator::operator < (const Utilizator &u) const { return scor < u.scor; 11

} istream& operator >> (istream &input, Utilizator &u) { cout << "Nume: "; input >> u.nume; cout << "Prenume: "; input >> u.prenume; cout << "Scor: "; input >> u.scor; cout << endl; return input; } ostream& operator << (ostream &output, Utilizator &u) { output << "(" << u.nume << " " << u.prenume << ", scor: " << u.scor << ")"; return output; }

Codul surs al programului 3 Fiierul p2_3.cpp


#include <iostream> #include <conio.h> #include <ctype.h> #include <algorithm> #include <deque> #include <stack> #include <vector> #include "utilizator.h" using namespace std; // Functie-predicat ce reprezinta conditia pe care trebuie sa o indeplineasca elementele ce vor fi inlocuite bool areScorNul(Utilizator &elem) { return elem.areScorNul(); } // Functia-negatie a functiei precedente bool nuAreScorNul(Utilizator &elem) { return !areScorNul(elem); } // Functie utilizata la sortarea descrescatoare bool comp(const Utilizator &u1, const Utilizator &u2) { 12

return u1.getScor() > u2.getScor(); } // Functie ce muta elementele dintr-un stack intr-un vector void muta_vs(vector<Utilizator> &v, stack<Utilizator> &s) { v.resize(s.size()); // Setam marimea vectorului egala cu numarul de elemente din stiva vector<Utilizator>::reverse_iterator rit; for(rit=v.rbegin(); rit!=v.rend(); rit++) { // Vetorul e parcurs de la sfarsit spre inceput *rit = s.top(); // Copie in vector elementul din varful stivei s.pop(); // scoate elementul din stiva, pentru a putea avea acces la urmatorul } } // Functie ce copie elementele dintr-un vector intr-un stack void copie_sv(stack<Utilizator> &s, vector<Utilizator> &v) { // Golim stiva while(!s.empty()) { s.pop(); } // Copiem elementele din vector in stiva for(vector<Utilizator>::iterator it=v.begin(); it!=v.end(); ++it) { s.push(*it); } } int main() { // *** 1. Crearea deque-ului si completarea lui cu date *** unsigned int n; // Numarul de elemente din deque cout << "Dati numarul de elemente din deque: "; cin >> n; deque<Utilizator> d1(n); // Cream un deque cu n elemente deque<Utilizator>::iterator elementele deque-ului cout << "Dati elementele deque-ului:" << endl; for(it = d1.begin(); it!=d1.end(); ++it) { cin >> *it; // Citim elementul din deque accesat cu ajutorul iteratorului } cout << endl; // Afisam elementele din deque cout << "Elementele din deque:" << endl; for(it=d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; 13 it; // Random access iterator pentru acces la

} cout << endl << endl; // *** 2. Sortarea descrescatoare a deque-ului *** cout << "Sortam elementele din deque." << endl; sort(d1.begin(), d1.end(), comp); cout << endl; // *** 3. Afisarea elementelor din deque *** cout << "Elementele din deque dupa sortarea descrescatoare:" << endl; for(it=d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; } cout << endl << endl; // *** 4. Gasirea unui utilizator in deque care are scor nul *** it = find_if(d1.begin(), d1.end(), areScorNul); if(it != d1.end()) { cout << "Primul utilizator din deque cu scor nul este: " << *it << endl; } else { cout << "Nu a fost gasit nici un utilizator cu scor nul." << endl; } cout << endl; // *** 5. Sa se mute elementele care satisfac o anumita conditie intr-un al 2lea container (stack) stack<Utilizator> s; // Al doilea container vector<Utilizator> v(d1.size()); vector<Utilizator>::iterator itv; cout << "Mutam in stack utilizatorii care au scorul diferit de 0." << endl; itv = remove_copy_if(d1.begin(), d1.end(), v.begin(), areScorNul); // Le copiem mai intai intr-un vector pe cele cu scor diferit de 0 v.resize(distance(v.begin(), itv)); // Redimensioneaza vectorul, astfel incat sa contina doar elementele copiate din primul it = remove_if(d1.begin(), d1.end(), nuAreScorNul); // Le stergem din vector pe cele copiate d1.resize(distance(d1.begin(), it)); copie_sv(s, v); // Apoi din vector le copiem in stack cout << endl; // *** 6. Afisarea elementelor din stack *** // Le afisam din vector cout << "Elementele din stack sunt:" << endl; 14

for(itv=v.begin(); itv!=v.end(); ++itv) { cout << *itv << " "; } cout << endl << endl; // *** 7. Sortarea crescatoare a primului si celui de-al doilea container *** cout << "Sortam crescator cele 2 containere." << endl; sort(d1.begin(), d1.end()); sort(v.begin(), v.end()); // Sortam elementele in vector copie_sv(s, v); // Apoi le copiem in stiva cout << endl; // *** 8. Afisarea celor 2 containere *** cout << "Deque-ul:" << endl; for(it=d1.begin(); it!=d1.end(); ++it) { cout << *it << " "; } cout << endl << endl; cout << "Stack-ul:" << endl; // Elementele stivei le afisam din vector for(itv=v.begin(); itv!=v.end(); ++itv) { cout << *itv << " "; } cout << endl << endl; // *** 9. Obtinerea unui al treilea container prin interclasarea primelor 2 *** vector<Utilizator> v3(d1.size()+s.size()); merge(d1.begin(), d1.end(), v.begin(), v.end(), v3.begin()); // *** 10. Afisarea celui de al treilea container *** cout << "Elementele din al treilea container obtinut prin interclasare:" << endl; for(itv=v3.begin(); itv!=v3.end(); ++itv) { cout << *itv << " "; } cout << endl; // *** 11. Numara cate elemente care satisfac o anumita conditie sunt in al treilea container *** cout << "In al treilea container sunt " << count_if(v3.begin(), v3.end(), areScorNul) << " utilizatori cu scor nul." << endl; cout << endl;

15

// *** 12. Verifica daca in al treilea container exista element care satisface o anumita conditie itv = find_if(v3.begin(), v3.end(), areScorNul); if(itv != v3.end()) { cout << "In al treilea container exista utilizator cu scor nul." << endl; } else { cout << "In al treilea container nu exista utilizator cu scor nul." << endl; } getch(); return 0; }

Fiierele Utilizator.h i Utilizator.cpp sunt aceleai ca la programul 2. Screenshot-uri cu rezultatele execuiei Programul 1

16

Programul 2

17

18

Programul 3

19

Concluzii La aceast lucrare de laborator am studiat bazele programrii orientate pe obiecte n limbajul
20

Pascal. Am aflat cum putem defini constructorii, destructorii i metodele unei clase, cum pot fi create obiecte ale unei clase. Programarea orientat pe obiecte n Pascal este mai incomod dect n C++ din mai multe motive: este necesar de apelat n mod explicit constructorii i destructorii, modificatorii de acces poart doar caracter informativ i nu interzic modificarea cmpurilor private din afara clasei, nu putem avea suprancrcarea funciilor i operatorilor, nu putem avea motenire multipl.

21