Documente Academic
Documente Profesional
Documente Cultură
Universitatea de Stat
din Moldova
Facultatea Matematic si Informatic
Catedra Informatic
Laboratorul NR 1
Disciplina: SDMP
A executat :
st.grupei: I-21
Surdu Constantin
A verificat :
lector Universitar
C.Opinca
Chiinu 2016
Cerinte:
S se defineasc clasa abstract elem_lucrator i clasa lucrator i clasa generic Tabel cu cmpurile:
ID,nume,prenume,oras,salariu. S se scrie un program n C++ care s conin opiunile:
- Citirea unei liste de lucratori dintr-un fiier textual scris n neordonat dup Denumire;
- Afiarea tuturor crilor din tablou la ecran;
- Cutarea secvenial a unuilucrator (dup ID) n tablou;
- Afiarea lungimii practice i teoretice;
- Sortarea dup cod;
- Cutarea binara a unui lucrator (dup ID) n tablou;
- Afiarea lungimii practice i teoretice;
);
n program neaprat se vor suprncrca operatori. Fisierul conine 50 de nregistrri. Cmpul dup
care se face cutarea este unic pentru fiecare nregistrare
Descrtiere metode:
Metoda secvenial de cutare
Cautarea secvenial este unul dintre cei mai simpli algoritmi studiai. El urmrete s verifice apartenena
unui element la un ir de elemente de aceeai natur, n spet a unui numr la un ir de numere. Pentru
aceasta se parcurge irul de la un capt la cellalt i se compar numrul de cutat cu fiecare numr din ir.
n cazul n care s-a gsit coresponden (egalitate), un indicator flag este poziionat. La sfritul parcurgerii
irului, indicatorul ne va arta dac numrul cutat aparine sau nu irului.
Metoda binar de cutare
Algoritmul de cutare binar ofer performane mai bune dect algoritmul de c utare secvenial. El
funcioneaz astfel: se compar numrul de cutat cu elementul aflat la mijlocul irului (element care se mai
numete i pivot). n cazul n care cele dou elemente coincid cutarea s-a ncheiat cu succes. Dac numrul
de cutat este mai mare dect pivotul, se continua cutarea n aceeai manier n subirul delimitat de pivot
i captul irului iniial. Dac numrul de cutat este mai mic dect pivotul se continua cutarea n aceeai
manier
n subirul delimitat de pivot i nceputul irului iniial.
Algoritmul prezentat se ncadreaz n clasa algoritmilor elaborai conform tehnicii de programare Divide et
Impera.
Unul din dezavantajele acestui algoritm este c irul n care se face cutarea trebuie sfie iniial sortat.
Metoda de cutarea n tabele neordonate structurate arborescent
Cutarea unei valori este foarte asemntoare cu operaia adunare. Algoritmul de cutare traverseaz
copacul "n profunzime", alegnd in mod adecvat parcurgerea, ca urmare a proprieti de cutare
arborescente secompar valoarea fiecrui nod vizitat cu unul, cutm. Algoritmul se oprete n dou cazuri:
-un nod cu o valoare necesar este gsit;
- algoritmul nu are nici o modalitate de a merge.
Algoritmul de cutare n detaliu:
ncepnd de la rdcin ne deplasm n direcia maximal interschimbnd elementele. Arborele binar plin,
adic, la care pn la orice nivel exist toate nodurile cu posibila excepie pentru cele mai drepte noduri ale
ultimului nivel. Astfel de arbore poate fi reprezentat sub form de vector.
Nodului cu indice i i corespunde nodurile cu indicii 2*i+1 (fiul stng, dac 2*i+1<=n-1) i 2*i+2 (fiul
drept, dac 2*i+2<=n-1).
Important de neles c nu crem un arbore aparte, folosind formulele 2*i+1 i 2*i+2, prelucrmacest
vector ca un arbore binar.
Un subarbore binar al arborelui binar care corespunde vectorului t[0]t[n-1] poate fi determinat printr-o
pereche de indici i i j care corespund condiiei (0<=i)&&(i<=j)&&(jn1), fii elementului k, unde
(i<=k)&&(k<=j), vor avea indicii 2*i+1 i 2*i+2, dac aceste valori nu ntrec j.
Metoda Fibonacci de cutare
Aceasta este gsit prin rezolvarea pentru cea mai mic valoare a lui n care face aceast inegalitate
adevrat: Fn> (ba) / toleran, unde n este numrul Fibonacci din secvena {F0, F1, F2, ...}.
Conceptul de cutare Fibonacci implic plasarea dou experimente ntre [a, b] , utiliznd raporturile de
numere Fibonacci.
Pasul 1. Initializam tolerana, t> 0.
Pasul 2. Setai Fn> (ba) t ca cel mai mic Fn i definesc punctele / ncercare
<fstream>
<vector>
<string>
<algorithm>
<iostream>
<time.h>
<math.h>
<iomanip>
"windows.h"
std::string oras;
double salariu;
int left;
int right;
public:
lucrator();
void setId(int a){id=a;}
void setNume(string a){nume=a;}
void setPrenume(string a){prenume=a;}
void setOras(string a){oras=a;}
void setSalariu(double a){salariu=a;}
int getId(){return id;}
int getLeft() {return left;}
void setLeft(int a){left=a;}
int getRight(){return right;}
void setRight(int a){right=a;}
string getNume(){return nume;}
string getPrenume(){return prenume;}
string getOras(){return oras;}
double getSalariu(){return salariu;}
friend std::istream& operator >> (std::istream& in, lucrator& m);
friend std::ostream& operator << (std::ostream& out, const lucrator& m);
virtual void afisare();
virtual void introducere(ifstream& f);
int operator >(lucrator &e2) {
return (this->id>e2.id);}
int operator < (lucrator &e2) {
return (this->id<e2.id); }
int operator <= (lucrator &e2) {
return (this->id<=e2.id); }
int operator >= (lucrator &e2){
return (this->id>=e2.
id); }
int operator == (lucrator &e2) {
return (this->id==e2.id); }
int operator != (lucrator &e2) {
return (this->id!=e2.id); }
void operator = (const lucrator& m);
};
lucrator::lucrator()
{
id=0;
nume="-";
prenume="-";
oras="-";
salariu=0.0;
left=-1;
right=-1;
}
void lucrator::operator = (const lucrator& m)
{
id=m.id;
nume=m.nume;
prenume=m.prenume;
oras=m.oras;
salariu=m.salariu;
left=m.left;
right=m.right;
}
std::istream& operator >> (std::istream& in, lucrator& m){
in >> m.id >> m.nume >> m.prenume >> m.oras >> m.salariu;
m.left=-1;
m.right=-1;
return in;
}
std::ostream& operator << (std::ostream& out, const lucrator& m){
out<<setiosflags(ios::left)<<setw(5)<<m.id<<setw(15)<<m.nume;
out<<setw(15)<<m.prenume<<setw(15)<<m.oras <<setw(15)<<m.salariu;
return out;
}
void lucrator::afisare()
{
cout<<this;
}
void lucrator::introducere(ifstream& f)
{
f>>*this;
if(tab[i].getId()>tab[j].getId())
{
aux=tab[i];
tab[i]=tab[j];
tab[j]=aux;
count++;
}
}
cout<<" Sortarea a fost indeplinita cu succes!"<<endl;
cout<<" Numarul de operatii efectuate : "<<count<<endl;
}
template
<class T>
void tabel<T>::cautare_bin(int c)
{
if(!n)
{
cout<<"ERROR! Introduceti date.";
return; }
int s=0,f=n-1,count=1,j;
int m=(s+f)/2;
while((c!=tab[m].getId())&&(s<=f))
{ count++; Sleep(100);
if(tab[m].getId()>c)
{
f=m-1; }
else
{
s=m+1;}
m=(s+f)/2; }
if(s<=f)
{
cout<<tab[m]<<endl;
cout<<"Lungimea practica de cautare este: "<<count<<endl;
cout<<"Lungimea teoretica de cautare este: "<<log(n)/log(2)<<endl;
}
else
{
cout<<"Inregistrare inexistenta!"<<endl;
}
count=0;
}
int forw=1,j=0;
while(forw)
{
if(tab[i]<tab[j])
{
if(tab[j].getLeft()==-1)
{
tab[j].setLeft(i);
forw=0;
}
else
j=tab[j].getLeft();
}
else
if(tab[i]>tab[j])
{
if(tab[j].getRight()==-1)
{
tab[j].setRight(i);
forw=0;
}
j=tab[j].getRight();
}
}
}
template <class T>
void tabel<T>::tree_afisare()
{
cout<<"-------------------------------------------------------------------------------"<<endl;
cout<<setiosflags(ios::left)<<setw(5)<<"ID"<<setw(15)<<"Nume";
cout<<setw(15)<<"Prenume"<<setw(15)<<"Oras"<<setw(15)<<"salariu";
cout<<setw(5)<<"Left"<<setw(5)<<"Right"<<endl;
cout<<"-------------------------------------------------------------------------------"<<endl;
for(int i=0;i<n;i++)
{
cout<<tab[i];
cout<<setw(5)<<tab[i].getLeft()<<setw(5)<<tab[i].getRight()<<endl;
}
cout<<endl;
}
template
<class T>
void tabel<T>::cautare_tree(int idi)
{
int i=0,count=0,forw=1;
while(forw)
{
if(idi==tab[i].getId())
{
cout<<tab[i];
cout<<setw(5)<<tab[i].getLeft()<<setw(5)<<tab[i].getRight()<<endl;
cout<<"Lungimea practica de cautare:"<<count<<endl;
cout<<"Lungimea teoretica MAX de cautare:"<<n/2<<endl;
cout<<"Lungimea teoretica MIN de cautare:"<<log(n)/log(2.0)*2.0<<endl;
forw=0;
}
else
{
if(idi<tab[i].getId())
i=tab[i].getLeft();
else
i=tab[i].getRight();
if(i==-1)
{
forw=0;
cout<<"Elementul nu a fost gasit"<<endl;
}
}
count++;
}
}
int main()
{
tabel<lucrator> t("Tabel1.txt");
int aleg;
l1:
cout<<"1.
cout<<"2.
cout<<"3.
cout<<"4.
cout<<"5.
cout<<"6.
cout<<"7.
l2: return 0;
}
Concluzii :
Dupa fectuarea lucrarii de laborator data am facut cunostinte cu metode de cautare in tabele
ordonate si neordonate , precum metoda decautare secventiala, binara,fibonacci , etc
Am examinat lungimea practica si teoretica a fiecarei metoda de cautare . Am facut cunostinta cu
metode de citire si salvare a datelor din fisier in forma de tabel ordonat si neordonat . Am creat clase
abstracte si clase sblon pentru a putea manipula cu tabele , datele carora se memoreaza in fisier .
In urma efectuarii lucrarii am observat ca cutarea binar este mai eficient n numrul mare de nregistrri ,
dar totuti nu la un numr extrem de mare. Cea mai eficient este cutarea Fibiacci n cazul tabelelor cu un numr
mare de elemente. n tabel sunt nscrise toate datele calculate la metodele de cutare.