Sunteți pe pagina 1din 10

Ministerul Educaiei i tiinei al Republicii Moldova

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

Pasul 3. Calculai f (x1) i f (x2)


Etapa 4. Compara f (x1) i f (x2)
(a.) Dac f (x1) <f (x2), atunci noul interval este [x1, b]:
un devine x1 precedent b nu se schimb
x1 devine x2 anterioar
n = n-1
Gsiti noul x2 folosind formula de la pasul 2.
(b). Dac f (x1)> f (x2), atunci noul interval este [a, x2]:
a nu se schimb
b devine x2 anterioar
x2 devine x1 precedent
n = n-1
Gsi noul x1 folosind formula de la pasul 2.
Etapa 5. Dac lungimea noului interval de la pasul 4 este mai mic dect tolerana specificat,
opritorul. n caz contrar , du - te napoi la Pasul 3.
Pasul 6. Estimarea x * ca punctul de mijloc al intervalului final i mainei, f (x *), maximul estimat al
funciei.
Codul Programului :
#include
#include
#include
#include
#include
#include
#include
#include
#include

<fstream>
<vector>
<string>
<algorithm>
<iostream>
<time.h>
<math.h>
<iomanip>
"windows.h"

using namespace std;


class elem {
public:
virtual void afisare()=0;
virtual void introducere(ifstream& f)=0;
int operator > (elem &) {
cout<<("Error should overide
int operator < (elem &) {
cout<<("Error should overide
int operator >= (elem &) {
cout<<("Error should overide
int operator <= (elem &) {
cout<<("Error should overide
int operator == (elem &) {
cout<<("Error should overide
int operator != (elem &) {
cout<<("Error should overide
};
class lucrator:public elem
{
protected:
int id;
std::string nume;
std::string prenume;

operator \">\"!\n")<<endl; return 0; }


operator \">\"!\n")<<endl; return 0; }
operator \">\"!\n")<<endl; return 0; }
operator \">\"!\n")<<endl; return 0; }
operator \">\"!\n")<<endl; return 0; }
operator \">\"!\n")<<endl; return 0; }

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;

template <class T>


class tabel
{
protected:
T tab[100];
int n;
public:
tabel();
tabel (string f);
void afisare_tab();
void cautare_secv(int);
void sortarea();
void cautare_bin(int);
void cautare_fib(int);
void search_f(int);
void tree_table();
void tree_afisare();
void cautare_tree(int);
};
template <class T>
tabel<T>::tabel()
{
n=0;
}
template <class T>
tabel<T>::tabel(string f)
{
ifstream fin (f);
T m;
n=0;
while(!fin.eof())
{
m.introducere(fin);
tab[n]=m;
n++;
}
n--;
fin.close();
}
template <class T>
void tabel<T>::afisare_tab()
{
cout<<"---------------------------------------------------------------"<<endl;
cout<<setiosflags(ios::left)<<setw(5)<<"ID"<<setw(15)<<"Nume";
cout<<setw(15)<<"Prenume"<<setw(15)<<"Oras"<<setw(15)<<"salariu"<<endl;
cout<<"---------------------------------------------------------------"<<endl;
for(int i=0;i<n;i++)
{
cout<<tab[i]<<endl;
}
cout<<endl;
}
template <class T>
void tabel<T>::cautare_secv(int a)
{
float f;
int pozitia=-1,c;
for(int i=0;(pozitia==-1)&&(i<n);i++)
{
c=tab[i].getId(); Sleep(100);
if(a==c) {pozitia=i; cout<<tab[i]<<endl;}
}
if(pozitia==-1){cout<<"Nu exista astfel de inregistrare!!!"<<endl;}
else {
cout<<"Numarul de inregistrari a tabelului : "<<n<<endl;
cout<<"Lungimea practica de cautare este: "<<pozitia+1<<endl;
cout<<"Lungimea teoretica de cautare este: "<< n / 2.0 <<endl;}
}
template
<class T>
void tabel<T>::sortarea()
{
int j,count=0;
T aux;
for(int i=0;i<n-1;i++)
for(j=i;j<n;j++)
{

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;
}

template <class T>


void tabel<T>::cautare_fib(int e)
{
int p = 1, q = 1, i = 1, k = 2, a, b = 1, l = 0;
clock_t t1, t2;
t1 = clock();
while (i<n)
{
q = p;
p = i;
i = p + q;
}
do {
if (i>n) { i -= q; a = q; q = p - q; p = a; k = 2; };
switch (k)
{
case 2:if (e<tab[i - 1].getId())k = 3; else if (e>tab[i - 1].getId())k = 4; break;
case 3:if (q != 0) { i -= q; a = q; q = p - q; p = a; k = 2; }
else { b = 0; cout << "Nu s-a gasit iregistrarea data\n"; }break;
case 4:if (p != 1) { i += q; p -= q; q -= p; k = 2; }
else { b = 0; cout << "Nu s-a gasit iregistrarea data\n"; }break;
}
if (e == tab[i - 1].getId()) cout<<tab[i - 1]<<endl;
l++;
//delay(100);
} while (!(e == tab[i - 1].getId()) && b);
if (b) {
cout << "Cautare Fibonaci\nLungimea teoretica este:" << log(n) << endl;
cout << "lungime practica " << l << endl;
}
}
template
<class T>
void tabel<T>::tree_table()
{
for(int i=1;i<n;i++)

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<<"!!! Alegeti Optiunea dorita :"<<endl<<endl;

cout<<"1.
cout<<"2.
cout<<"3.
cout<<"4.
cout<<"5.
cout<<"6.
cout<<"7.

Afisarea tabelului !"<<endl;


Metoda secventiala de cautare !"<<endl;
Sortarea tabelului !"<<endl;
Metoda binara de cautare !"<<endl;
Metoda Fibonacci de cautare !"<<endl;
Crearea tabelului neordonat stricturat arborescent !"<<endl;
Metoda de cautare in tabel neordonat structurat arborescent "<<endl;

cout<<"0. Iesire !!!"<<endl;


cout<<" Alegerea dumnevoastra ==> ";
cin>>aleg;
cout<<endl<<endl;
switch(aleg)
{
case 1:
{
t.afisare_tab();
system("PAUSE"); system("cls"); goto l1;
}
case 2:
{
int x;
cout<<endl<<"Introduceti id-ul cautat : ";
cin>>x;
cout<<endl;
t.cautare_secv(x);
system("PAUSE"); system("cls"); goto l1;
}
case 3:
{
t.sortarea();
system("PAUSE"); system("cls"); goto l1;
}
case 4:
{
int x;
cout<<endl<<"Introduceti id-ul cautat : ";
cin>>x;
cout<<endl;
t.cautare_bin(x);
system("PAUSE"); system("cls"); goto l1;
}
case 5:
{
int x;
cout<<endl<<"Introduceti id-ul cautat : ";
cin>>x;
cout<<endl;
t.cautare_fib(x);
system("PAUSE"); system("cls"); goto l1;
}
case 6:
{
t.tree_table();
t.tree_afisare();
system("PAUSE"); system("cls"); goto l1;
}
case 7:
{
int idi;
cout<<"Introduceti id-ul cautat : ";
cin>>idi;
t.cautare_tree(idi);
system("PAUSE"); system("cls"); goto l1;
}
case 0:
{
goto l2;
}
default:
{
cout<<"Optiunea introdusa nu exista !!!"<<endl;
Sleep(1500); system("cls"); goto l1;
}
}

l2: return 0;
}

Rezultatele Rularii programului :

Metoda binara de cautare

Metoda Fibonacci de cautare :

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.

S-ar putea să vă placă și