You are on page 1of 10

Ministerul Educaiei i Tineretului al Republicii Moldova

Universitatea Tehnic a Moldovei


Catedra: Automatic i Tehnologii Informaionale.

Raport
Lucrare de laborator Nr. 1
la Analiza Proiectarea i Programarea Obiect Orientat
Tema: Standard Template Library

A elaborat:

st.gr. SI-121
Ciudin Sergiu

A verificat:

lect. sup.
Balan Mihaela

Chiinu 2015

Scopul lucrrii:
nsuirea tehnologiei de programare generic cu ajutorul Standard Template Library
(STL), n limbajul C + +.
Sarcina:
Varianta: 3

Primul container: deque

Al doilea container: stack

Tipul de date primitiv: float

Listingul programului:
Lab1.cpp
#include <cstdlib>

#include <iostream>

program2::p2();

#include <iomanip>

}break;

#include <deque>

case 3:

#include <stack>

#include <vector>

program3::p3();

#include <algorithm>

}break;

#include "a.h"

case 0:

#include "b.h"

#include "c.h"

exit(1);
}

using namespace std;

default:

int main(int argc, char *argv[])

break;

}
int c;

while (true)

{
system("cls");
cout << "\n[1] Program 1"
<< "\n[2] Program 2"
<< "\n[3] Program 3"
<< "\n[0] Exit"
<< "\n\n>> ";
cin >> c;
switch (c)
{
case 1:
{
program1::p1();
}break;
case 2:

a.h

using namespace std;


namespace program1
{
void show(deque <float> deck)
{
cout << "\n";
for (auto i = 0; i < deck.size(); i++)
{
cout << setprecision(2) << fixed << deck[i] << endl;
}
system("pause");
}
void p1()
{
system("cls");
int n, i; float r;
// 1. Creaza deck1 si pune in el numere float
cout << "\nCreaza deck1 si-l umple cu elemente float\n";
deque <float> deck1;
deck1.push_back(0.1f);
cout << "n=";
cin >> n;
for (i = 1; i <= n; i++)
{
r = i*100.0f;
deck1.push_back(r);
deck1.push_front(r);
}
// 2. Listeaza deck1
show(deck1);
int m = 2;
// 3_1. Elimina din deck1 elementul de pe pozitia (m+1)
cout << "\nEliminam din deck1 elementul de pe pozitia " << (m + 1) << endl;
deck1.erase(deck1.begin() + m);
show(deck1);
cout << "\nEliminam din deck1 elementul de pe pozitia " << (m) << " de la sfarsit\n";
deck1.erase(deck1.end() - m);
show(deck1);
// 3_3. Arunca un element anume
r = 500.00f;
cout << "\nStergem din deck1 elementul " << r << endl;
for (int i = 0; i < deck1.size(); i++)
{
if (deck1[i] == r)
{
deck1.erase(deck1.begin() + i);
}
}
show(deck1);
// 3_4. Schimbam elementul de pe pozitia t cu valoarea r
int t = 3;
r = 123456.00f;
cout << "\nSchimbam in deck1 valoarea elementului din pozitia " << t << " cu valoarea " << r << endl;
deck1[t - 1] = r;
show(deck1);
// 3_5. Schimbam semnul la elementele de la pozitia k pana la pozia d inclusiv
int k = 2, d = 3;
cout << "\nSchimbam in deck1 semnele elementelor din pozitia " << k << " pana in pozitia " << d << "
inclusiv\n";
for (i = k - 1; i < d; i++)
deck1[i] = -deck1[i];
show(deck1);

// 4. Listeaza deck1 folosind iteratori


cout << "\nAfisam deck1 folosind iteratori\n";
for (auto p = deck1.begin(); p < deck1.end(); p++)
cout << *p << endl;
// 5. Creaza deck2 si pune in el tot numere float
cout << "\nCreaza deck2 si-l umple tot cu elemente float\n";
deque <float> deck2;
int w;
cout << "w="; cin >> w;
for (i = 1; i <= w; i++)
{
r = -i / 100.0f;
deck2.push_front(r);
deck2.push_back(r);
}
show(deck2);
// 6_1. Elimina din deck1 s elemente consecutive ce urmeaza dupa pozitia z
int s = 3, z = 2;
cout << "\nElimina din deck1 " << s << " elemente consecutive ce urmeaza dupa pozitia " << z;
deck1.erase(deck1.begin() + z, deck1.begin() + z + s);
show(deck1);
// 6_2. Adauga in deck1 dupa elementul din pozitia v toate elementele din deck2
int v = 3;
cout << "\nAdauga in deck1 dupa elementul din pozitia " << v << " toate elementele din deck2";
auto g = deck1.begin();
advance(g, v);
deck1.insert(g, deck2.begin(), deck2.end());
// 7. Listeaza deck1 si deck2
show(deck1);
show(deck2);
}
}

b.h
using namespace std;
namespace program2
{
void stack_show(stack <float> st)
{
while (!st.empty())
{
cout << setprecision(2) << fixed << st.top() << endl;
st.pop();
}
}
// listeaza un deck ce contine stack-uri
void show(deque < stack <float> > deck)
{
for (int i = 0; i < deck.size(); i++) // deck.size() returneaza nr. de elemente din deck
{
cout << "\nContinutul stack-ului " << i << endl;
stack_show(deck[i]);
}
system("pause");
}
void p2()
{
system("cls");
int n, i; float r;
// 1. Creaza deck1 si pune in el 5 stack-uri
cout << "Creaza deck1 si pune in el 5 stack-uri float\n";
deque < stack <float> > deck1; // defineste deck1 gol p/u date de tip stack<float>

stack <float> st[5]; // am creat 5 stack-uri goale


for (int i = 0; i < 5; i++)
{
// punem cate 4 numere in fiecare stack
for (int j = 0; j < 4; j++)
st[i].push((i + 1)*float(j));
// punem stak-ul st[i] in deck1
deck1.push_back(st[i]);
}
// 2. Listeaza deck1
show(deck1);
int m = 2;
// 3_1. Elimina din deck1 elementul de pe pozitia (m+1)
cout << "\nEliminam din deck1 elementul de pe pozitia " << (m + 1) << endl;
deck1.erase(deck1.begin() + m);
// begin() este iterator, care arata la primul element din deck
show(deck1);
// 3_2. Elimina din deck1 elementul de pe pozitia (m) de la sfarsit
cout << "\nEliminam din deck1 elementul de pe pozitia " << (m) << " de la sfarsit\n";
deck1.erase(deck1.end() - m);
// end() este iterator care arata la ultimul element din deck
show(deck1);
// 4. Listeaza deck1 folosind iteratori
cout << "\nListam deck1 umplut cu stack-uri folosind iteratori\n";
deque < stack <float> >::iterator p;
for (i = 0, p = deck1.begin(); p < deck1.end(); p++, i++)
{
cout << "\nContinutul stack-ului " << i << endl;
stack_show(*p);
}
// 5. Creaza deck2 si pune in el 5 stack-uri
cout << "\nCreaza deck2 si pune in el 5 stack-uri float\n";
deque < stack <float> > deck2; // defineste deck2 gol p/u date de tip stack<float>
stack <float> st2[5]; // am creat alte 5 stack-uri goale
for (int i = 0; i < 5; i++)
{
// punem cate 4 numere in fiecare stack
for (int j = 0; j < 4; j++)
st2[i].push(-i*float(j));
// punem stak-ul st[i] in deck2
deck2.push_front(st2[i]);
}
show(deck2);
// 6_1. Elimina din deck1 s elemente consecutive ce urmeaza dupa pozitia z
int s = 2, z = 1;
cout << "\nElimina din deck1 " << s << "elemente consecutive ce pozitia " << z;
deck1.erase(deck1.begin() + z, deck1.begin() + z + s);
show(deck1);
// 6_2. Adaoga in deck1 dupa elementul din pozitia v toate elementele din deck2
int v = 1;
cout << "Adauga in deck1 dupa elementul" << v << "toate elementele din deck2";
deque < stack <float> >::iterator g;
g = deck1.begin();
advance(g, v);
deck1.insert(g, deck2.begin(), deck2.end());
// 7. Listeaza deck1 si deck2
show(deck1);
show(deck2);
}}

c.h
using namespace std;

namespace program3
{
// listeaza un stack
void stack_show(stack <float> st)
{
while (!st.empty())
{
cout << setprecision(2) << fixed << st.top() << endl;
st.pop();
}
}
// listeaza un vector
void vector_show(vector <float> v)
{
int i = 0;
while (i < v.size())
{
cout << setprecision(2) << fixed << v[i++] << endl;
}
cout << endl;
system("pause");
}
// listeaza un deck ce contine stack-uri
void show(deque < stack <float> > deck)
{
for (int i = 0; i < deck.size(); i++) // deck.size() returneaza nr. de elemente din deck
{
cout << "\nContinutul stack-ului " << i << endl;
stack_show(deck[i]);
}
system("pause");
}
int nr = -1, ind = -1, inm;
void ds(stack <float> st)
{
int n = st.size();
++ind;
if (n > nr)
{
nr = n;
inm = ind;
}
}
bool gr5(stack <float> st)
{
return (st.size() < 5);
}
bool operator <=(stack <float> st, stack <float> st1)
{
return (st.size() < st1.size());
}
void sort_deck(deque < stack <float> >& deck)
{
int i, j, n;
n = deck.size();
if (n < 2) return;
deque < stack <float> > deckr;
deque < stack <float> >::iterator p;
while (deck.size())
{
p = deck.begin();
for (i = 0; i < deck.size(); i++)
{
if (deck[i] <= *p) p = deck.begin() + i; /// aici e eroare
}

// am gasit cel mai mic stack


// si il punem in deckr
deckr.push_back(*p);
deck.erase(p);
}
deck.swap(deckr);
}
void p3()
{
int n, m, i, j, d, nes[] = { 3, 6, 5, 4, 3, 7, 3 }; float r;
// 1. Creaza deck1 si pune in el 5 stack-uri
cout << "1. Creaza deck1 si pune in el 5 stack-uri float\n";
deque < stack <float> > deck1; // defineste deck1 gol p/u date de tip stack<float>
stack <float> st[4]; // am creat 5 stack-uri goale
for (int i = 0; i < 4; i++)
{
// punem cate nes[i] numere in stack-ul i
for (int j = nes[i]; j > 0; j--)
st[i].push(i*float(j));
// punem stak-ul st[i] in deck1
deck1.push_back(st[i]);
}
show(deck1);
// 2. Sorteaza crescator fiecare stack din container
// scoatem din container un stack;
// punem elementele din stack intr-un vector;
// sortam vectorul;
// caram elementele din vectorul sortat in stack;
// in acest mod procedam cu fiecare stack din container !
cout << "\n2. Sortarea";
vector <float> v;
n = deck1.size();
cout << "\nContainerul are " << n << " elemente" << endl;
for (i = 0; i < n; i++)
{
m = deck1[i].size();
cout << "\nstack-ul are " << m << " elemente" << endl;
for (j = 0; j < m; j++)
{
v.push_back(deck1[i].top());
deck1[i].pop();
}
// sortam CRESCATOR vectorul
sort(v.begin(), v.end());
// punem vectorul sortat inapoi in stack
for (j = 0; j < m; j++)
{
deck1[i].push(v[j]);
}
//stack_show(deck1[i]);
v.clear();
}
// 3. Listam deck1 dupa sortarea stack-urilor din el
cout << "3";
show(deck1);
// 4. Cautam in deck1 stack-ul cu numarul maximal de elemente
for_each(deck1.begin(), deck1.end(), ds);
cout << "\n\n4. stack-ul cu numarul maximal de elemente are nr. de ordine " << inm + 1 <<
"\nsi contine " << nr << " elemente\n\n";
// 5. Creaza deck2 si transfera in el din deck1 toate stack-urile
// care contin 5 sau mai multe elemente....
// mai intai cream deck2 gol
cout << "\n5. Creaza deck2 si transfera in el din deck1 toate stack-urile\n";
deque < stack <float> > deck2; // defineste deck2 gol p/u date de tip stack<float>

deck2.resize(deck1.size());
remove_copy_if(deck1.begin(), deck1.end(), deck2.begin(), gr5);
for (i = 0; i < deck1.size(); i++)
{
if (!gr5(deck1[i]))
{
deck1.erase(deck1.begin() + i); i--;
}
}
for (i = 0; i < deck2.size(); i++)
{
if (deck2[i].size() == 0)
{
deck2.erase(deck2.begin() + i); i--;
}
}
// 6. Listam deck2
cout << "\n6. Continutul lui deck2\n";
show(deck2);
// 7. Sortam deck1 si deck2 in ordine crescatoare (dupa nr. de elemente in stack-uri)
cout << "\nSortam deck1 si deck2 in ordine crescatoare (dupa nr. de elemente in stack-uri)";
sort_deck(deck1);
sort_deck(deck2);
// 8. Listam deck1 si deck2 dupa sortare
cout << "\nListam deck1 si deck2 dupa sortare";
cout << "\ndeck1";
show(deck1);
cout << "\ndeck2";
show(deck2);
// 9. Cream deck3 prin concatenarea deck1 si deck2
cout << "\nCream deck3 prin concatenarea deck1 si deck2";
deque < stack <float> > deck3;
//deck3.resize(deck1.size() + deck2.size());
//merge(deck1.begin(), deck1.end(), deck2.begin(), deck2.end(), deck3.begin());
deck3.insert(deck3.begin(), deck1.begin(), deck1.end());
deck3.insert(deck3.end(), deck2.begin(), deck2.end());
// 10. Listam deck3
cout << "\nListam deck3";
show(deck3);
// 11. Numaram cate stack-uri cu nr. de elemente mai mic decat 5 sunt in deck3
cout << "\nNumaram cate stack-uri cu nr. de elemente mai mic decat 5 sunt in deck3";
int nr5 = 0;
for (i = 0; i < deck3.size(); i++)
{
if (gr5(deck3[i])) nr5++;
}
cout << "\ndeck3 contine " << nr5 << " stack-uri cu nr. elemente mai mic decat 5\n";
// 12. Determinam daca in deck3 este vreun stack cu 6 elelmente
cout << "\nDeterminam daca in deck3 este vreun stack cu 6 elelmente ";
bool zc = false;
for (i = 0; i < deck3.size(); i++)
{
if (deck3[i].size() == 6) { zc = true; break; }
}
cout << "\ndeck3 ";
if (!zc) cout << " nu ";
cout << "contine stack cu 6 elemente\n\n";
system("PAUSE");
}
}

Concluzie:

n cadrul laboratorului dat am studiat biblioteca de abloane standarde a limbajului


C++. Aceste abloane au fost create pentru a uura scrierea codului, acestea ntrunesc cele
mai des utilizate mecanisme i instrumente n programare. Pe lng instrumente aceste
biblioteci de abloane ne ofer i civa algoritmi care ne ajut s executm cele mai des
utilizate operaii.
Astfel am studiat aceste biblioteci standarde i am creat 3 aplicaii pentru
implementarea cunotinelor teoretice i am simit cu ct uurin se pot crea aplica ii
complexe cu cod sigur i foarte simplu. Deci ne-am convins i noi de avantajele bibliotecii
STL din cadrul limbajului C++.