Documente Academic
Documente Profesional
Documente Cultură
10LF321
Structuri de date
Tema 1
1. Se consideră doi vectori v1 cu nr1 elemente și v2 cu nr2 elemente. Vectorul v1 este sortat
crescător și vectorul v2 este sortat descrescător. Să se obțină un al treilea vector v3 care
conține atât elementele lui v1 cât și elementele lui v2 care este sortat crescător. Folosiți o
metodă eficientă. (1p)
#include <iostream>
int main()
{
int nr;
int* v;
citire(v, nr);
int numar = formare_numar(v, nr);
std::cout << numar;
delete[]v;
return 0;
}
3. Se citesc dintr-un fișier un număr de elevi. Fiecare elev are un nume, un prenume și 3
note, numere naturale. Se va folosi pentru elev un tuple cu câmpurile nume și prenume
de tip string și cu trei câmpuri de note de tip int. elevii vor fi memorați într-un obiect de
tip std::vector<std::tuple<std::string, std::string, int, int, int>>. Să se sorteze vectorul
de elevi descrescător după medie și să se afișeze frumos, punând în evidență elevii c ote
mai mici decât 5. (2p)
#include <iostream>
#include <algorithm>
#include <vector>
#include <tuple>
#include <iomanip>
#include <fstream>
//O(1)
double media(int nota1, int nota2, int nota3)
{
return (nota1 + nota2 + nota3) / 3.0;
}
bool comparator(std::tuple<std::string, std::string, int, int, int>a, \
std::tuple<std::string, std::string, int, int, int>b)
{
return media(std::get<2>(a), std::get<3>(a), std::get<4>(a)) > \
media(std::get<2>(b), std::get<3>(b), std::get<4>(b));
}
void afisare(std::vector<std::tuple<std::string, std::string, int, int, int>>date)
{
std::cout << std::setw(98);
std::cout << std::setfill('-') << ' ' << std::endl;
std::cout << "| NUME PRENUME ELEV" << std::setw(18) << std::setfill(' ') << ' ';
std::cout << "| NOTA 1 | NOTA 2 | NOTA 3 | MEDIA | MENTIUNE";
std::cout << std::setw(15) << std::setfill(' ') << '|' << std::endl;
std::cout << std::setw(98) << std::setprecision(2);
std::cout << std::setfill('-') << ' ' << std::endl;
for (auto a : date)
{
int dist1 = 0, dist2 = 0, dist3 = 0, dist4 = 0;
std::string mentiune = "";
double med = media(std::get<2>(a), std::get<3>(a), std::get<4>(a));
if (std::get<2>(a) <= 5 or std::get<3>(a) <= 5 or std::get<4>(a) <= 5)
mentiune = "Elevul are note sub 5";
if (std::get<2>(a) < 10)
dist1 = 1;
if (std::get<3>(a) < 10)
dist2 = 1;
if (std::get<4>(a) < 10)
dist3 = 1;
if (med == int(med))
if (med == 10)
dist4 = 2;
else
dist4 = 3;
std::cout << "| " << std::get<0>(a) << ' ' << std::get<1>(a);
std::cout << std::setw(36 - std::get<0>(a).size() - std::get<1>(a).size());
std::cout << std::setfill(' ');
std::cout << "| " << std::get<2>(a) << std::setw(7 + dist1) << std::setfill(' ');
std::cout << "| " << std::get<3>(a) << std::setw(7 + dist2) << std::setfill(' ');
std::cout << "| " << std::get<4>(a) << std::setw(7 + dist3) << std::setfill(' ');
std::cout << "| " << std::setprecision(3) << med << std::setw(4 + dist4);
std::cout <<std::setfill(' ');
std::cout << "| " << mentiune << std::setw(23 - mentiune.size()) << std::setfill(' ');
std::cout << '|';
std::cout << std::endl << std::setw(98);
std::cout << std::setfill('-') << ' ' << std::endl;
}
}
int main()
{
std::vector<std::tuple<std::string, std::string, int, int, int>>elev;
citire_date(elev);
//O(nlogn)
std::sort(elev.begin(), elev.end(), comparator);
afisare(elev);
return 0;
}
#include <iostream>
#include <cmath>
constexpr auto PI = 3.14159265359;
6. Cristina și George vor pleca într-o excursie și trebuie să cumpere alimente. Fiecare a
alcătuit o lista de cumpărături pe care sunt numele de produse și cantitatea din fiecare
produs, pe care o doresc. George folosește o funcție, care preia cele două liste și
returnează o a treia, ce conține toate produsele din ambele liste, împreună cu cantitățile
corespunzătoare. Produsele care apar pe ambele liste vor apărea o singură dat în lista
finală , cu cea mai mare cantitate dintre cele de pe cele două liste. Scrieți această funcție
și afișați frumos lista finală. Observație: folosiți vectori pentru memorarea listelor de
cumpărături. Produsele vor avea nume de tip std::string.(2p)
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <iomanip>
class lista
{
public:
float cantitate{};
std::string produs;
bool operator>(lista list)
{
return lista::produs > list.produs;
}
//supraîncărcare operator "==" pentru a compara componenta produs a obiectului\
cu componenta produs a variabilei rhs
bool operator==(const lista& rhs) const { return this->produs == rhs.produs; }
};
}
for (auto l2 : list2)
{
it = std::find(list1.begin(), list1.end(), l2);
if (it == list1.end())
final_list.push_back(l2);
}
return final_list;
}
void afisare_lista(std::vector<lista>list)
{
std::cout << " PRODUSE" << std::setfill(' ')<<std::setw(6)<<std::setfill(' ')<<' ' << "| CANTITATE\n";
std::cout << std::setw(27) << std::setfill('-') << '\n';
for (auto l : list)
{
std::cout << ' ' << l.produs << std::setw(15 - l.produs.size()) << std::setfill(' ');
std::cout << " | " << std::setprecision(3) << l.cantitate << std::endl;
std::cout << std::setw(27) << std::setfill('-') << '\n';
}
}
int main()
{
std::vector<lista>lista_Cristina;
std::vector<lista>lista_George;
std::vector<lista>lista_finala;
citire_lista(lista_Cristina, "lista_Cristina.in");
citire_lista(lista_George, "lista_George.in");
lista_finala = creeare_lista(lista_Cristina, lista_George);
afisare_lista(lista_finala);
return 0;
}
7. Alex are un joc cu blocuri din lemn de forma unor paralelipipede dreptunghice cu baza
pătrată de dimensiune fixă. Blocurile au înălțimi diferite. Alex aranjează aceste blocuri în
pătrate concentrice.
a) Să se verifice dacă un astfel de aranjament, reprezentat printr-o matrice, are formă
piramidală, adică: toate blocurile dintr-un pătrat sunt mai mici decât cele aflate în
regiunea din interiorul acestui pătrat. (1p)
b) Dacă pe baza fiecărui pătrat este gravat un număr pozitiv (ce reprezintă înălțimea
blocului în cm), să se scrie o funcție care calculează pentru un pătrat k înălțimea
medie a cuburilor de pe acel pătrat. (1p)
#include <iostream>
#include <fstream>