Documente Academic
Documente Profesional
Documente Cultură
//ALGORITM
Caracteristici algorim:
- generalitatea( un algoritm rezolva un set de probleme de acelasi tip nu doar una singura)
- unicitatea( un algoritm rezolva aceasi set de probleme indifernet de limbajul de programare
in care este implementat)
- finititudinea( solutia problemei trebuie identificata intr-un timp rezonabil cea ce presupune
ca algoritmul poseda un numar finit de pasi)
1. elaborarea algoritmului
2. exprimarea algoritmului(trebuie sa fie clar si concis exprimat intr-un limbaj de programare)
3. validarea algoritmului(este corect daca furnizeaza solutia corecta ptr orice set de date de
test)
4. testarea algoritumului care este formata din 2 etape: debugging(depanare) si
profiling(trasare)
//RECURSIVITATE:
Este o metoda de proiectare a algoritmilor care permite construirea si utilizare functiilor care se auto
apeleaza
Auto-apel = ce se intampla la un nivel al functiei are lor si in nivelele urmatoare dar pentru alte valori
ale parametrilor
Functia recursiva directa este o functie care se auto-apeleaza sau care constituie o referinta
la ea insasi
ex:
factorial(n)=n*factorial(n-1);
Fibonacci(n)=Fibonacci(n-1)+Fibonacci(n-2);
ex: Functia X contine o referinta la o functie Y iar la randul ei functia Y contine o referinta la
functia X
Daca o problema admite rezolvare recursiva atunci sigur exista cel putin o varianta de rezolvare
iterativa a problemei
Orice functie recursiva trebuie sa contina o conditie de oprire care sa permita iesirea din auto-apel
altfel functia se va auto-apela la infinit
//ALOCAREA MEMORIEI
A aloca memorie pentru o variabila inseamna a asocia o zona de memorie pentru variabila
respectiva
-alocare dinamica/indirecta
-in timpul alocarii statice asocierea dintre nume variabila si zona de memorie este constanta pe
toata durata executiei programului
-variabila alocata static ocupa spatiul de memorie chiar daca aceasta la un moment dat devine
inutila deoarece nu se pot face dealocari de memorie
Alocarea dinamica/indirecta
-in cazul alocari dinamice de memorie asocierea nume de variablia zi zona de memorie nu mai este
constanta pe toata durata executiei programului
-presupune lucrul cu pointeri ( sunt singurele tipuri de date ce permit alocari/dealocari de memorie
in momentul executiei programului)
float* v[50];
Alocarea spatiului de memorie in cazul alocarii dinamice se face utilizind functia malloc()
Eliberarea spatiului de memorie se face folosind diferite versiuni ale functiei free()
1)vectori/matrici
2)uniuni,structuri,enumerari
4)arbori(oarecare,binari,de cautare)
5)grafuri(orientate/neorientate)
//STRUCTURA
Este o colectie de date neomogena stocate intr-o zona de memorie compacta sub acelasi nume
Daca variabilele din lista de structuri sunt alocate static accesul se face folosind un punct .
nume_var . nume_camp;
Daca variabilele din lista de structuri sunt alocate dinamic accesul se face folosind o sageata ->
struct student
{struct nume[10],pren[10];
int varsta;
}stud1;
//UNIUNEA
Este un tip de date structurat in care campuri diferite utilizeaza aceasi zona de memorie la momente
diferite de timp
union struct
{char nume[10],pren[10];
int varsta;
}e;
//ENUMERAREA
enum luna_an
{ianuaria,februarie,martie,...decembrie
}luna;
1) in stdio.h avem
printf()
scanf()
gets()
puts()
2) in string.h avem
strcmp(sir1,sir2) =>compara lexicografic sir 1 cu 2
strcopy(sir1,sir2)=>copieaza sir 2 in 1
strlen(sir)=> intoarce lungime sir
strcat(sir1,sir2)=>lipeste/concanteneaza sir 1 de 2
//STIVA
Este un caz particular de lista simplu inlantuita. Operatiile de adaugare si de stergere a elementelor
se realizeaza pe la un singur cap ( varful stivei)
//Declarere Stiva :
typedef struct lista
{
int inf;
struct lista* leg;
}stiva;
//Initiere Stiva :
stiva * initiere(stiva* l)
{
l = NULL;
return l;
}
//Creare Stiva :
stiva * creare(stiva* l, int info)
{
stiva* a;
a = (stiva*)malloc(sizeof(stiva));
a->inf = info;
a->leg = l;
l = a;
return l;
}
//Afisare Stiva :
void * afisare(stiva* l)
{
stiva* aux{};
cout << aux->inf;
aux = aux->leg;
}
//Adaugare element
stiva* adaugare(stiva * l, int info1)
{
stiva* w, * aux;
w = (stiva*)malloc(sizeof(stiva));
w->inf = info1;
while (aux->leg != NULL)
{
aux = aux->leg;
aux->leg = w;
w->leg = NULL;
return l;
}
}
//COADA
Este un caz particular al unei liste simplu inlantuita.Operatia de adaugare a elementelor in coada se
face pe la un capat al cozii (finalul) iar operatia de stergere a elemntelor se realizeaza prin celalalt
capat al cozii (inceputul)
//Initializare coada :
typedef struct lista
{
int inf;
struct lista* leg;
}coada;
//Creare coada :
coada * creare()
{
coada* prim, * ultim, * a, int info;
prim = NULL;
ultim = NULL;
cout << "Info: ";
cin >> info;
while (info != 0)
{
a = (coada*)malloc(sizeof(coada));
a->inf = info;
a->leg = NULL;
if (prim == NULL)
{
prim = a;
ultim = a;
}
else
{
ultim->leg = a;
ultim = a;
}
cout <<"Info: ";
cin >> info;
}
return prim;
//Parcurgere coada :
void* parcurgere(coada* prim)
{
coada* aux;
if (prim != NULL)
{
aux = prim;
while (aux != NULL)
{
cout << aux->leg;
aux = aux->leg;
}
}
}
//Stergere prim element coada :
coada* stergere_prim(coada * prim)
{
coada* aux;
aux = prim;
prim = prim->leg;
free(aux);
return prim;
}
//ARBORI OARECARE/BINARI
Un arbore oarecare este o sturctura de date ierarhica in care ficare nod poate acea unul sau mai
multi fii. Nu exista restrictii asupra numarului de fii in cazul unui arbore oarecare
Un arbore binar este o structura de date ierarhica in care fiecare nod poate avea cel mult 2 fii: unul
stang si unul drept
Notiuni arbori:
-in latime: (se parcurg in ordine nodurile de pe fiecare nivel de la stanga la dreapta ,incepand de la
primul nivel pana la ultimul)
//Parcurgerea in preordine(RSD) :
void RSD(arb_oarecare* t)
{
if (t != NULL)
{
cout << t->int << ”, ”;
for (int i = 1; i <= t->nr_fii; i++)
{
RSD(t->adrese_fii[i];
}
//Parcurgere in postordine(SDR) :
void SDR(arb_oarecare * t)
{
if (t != NULL)
{
for (int i = 1; i <= t->nr_fii; i++)
{
SDR(t->adrese_fii[i]);
cout << t->inf << ”, ”;
}
}
}
void RSD(arbbin * t)
{
if (t != NULL)
{
cout << t->inf;
RSD(t->st);
RSD(t->dr);
}
}
void SDR(arbbin * t)
{
if (t != NULL)
{
SDR(t->st);
SDR(t->dr);
{cout << t->inf;
}
}
void SRD(arbbin * t)
{
if (t != NULL)
{
SRD(t->st)
cout << t->inf;
SRD(t->dr);
}
}
BST-ul este un arbore binar in care pentru fiecare nod toate valorile din subarborele stang sunt mai
mici decat valoarea nodului isr toate valorile din subarborele drept sun mai mari sau egale cu
valoarea nodului. Aceasta proprietate face ca operatiile de cautare inserare si stergere sa fie
eficiente
//Declarare BST
typedef struct arbore
{
int inf;
struct arbore* st, * dr;
}arbbin_cautare;
//Creare BST
void inserare_nod(Search_BTree*& a, intcheie_nod)
{
Search_BTree* nod;
if (a != NULL)
if (cheie_nod == a - →inf)
cout << "\n Nodul exista deja in BST!";
else if (a→inf < cheie_nod)
inserare_nod(a→dr, cheie_nod);
else inserare_nod(a→st, cheie_nod);
else if (a == NULL)
{
nod = (Search_BTree*)malloc(sizeof(Search_BTree));
nod→inf = cheie_nod;
nod→st = NULL;
nod→dr = NULL;
a = nod;
}
}
//Parcurgere BST :
void RSD(Search_BTree* t)
{
if (t != NULL)
{
cout << t->inf << ”, ”;
RSD(t->st);
RSD(t->dr);
}
}
void SDR(Search_BTree* t)
{
if (t != NULL)
{
SDR(t->st);
SDR(t->dr);
cout << t->inf << ”, ”;
void SRD(Search_BTree * t)
{
if (t != NULL)
SRD(t->st);
cout << t->inf << ”, ”;
SRD(t->dr);
{
}
}
//Stergere Nod BST :
void sterg_nod_terminal(Search_ BT ree * &nod, int info)
{
Search_BTree* aux;
if (nod != NULL)
{
if (nod→inf == info)
{
if ((nod→st == 0) && (nod - →dr == 0))
{
delete nod;
nod = 0;
}
}
else if (nod→inf < info)
sterg_nod_terminal(nod→dr, info);
else sterg_nod_terminal(nod→st, info);
}
}
GRAF
Este o structura matematica formata dintr-un set de noduri/varfuri si un set de muchii/arce care
conecteaza perechi de noduri.
Grafurile sunt:
-neorientate (sunt un tip de graf in care muchiile nu au o directie specifica, ele conecteaza 2 noduri si
pot fi tranversate in ambele directii)
-orientate ( sunt un tip de graf in care muchiile au o directie specifica, ele conecteaza un nod sursa la
un nod destinatie si nu pot fi traversate in directie inversa fara a schimba directia muchiei
-Un lant intr-un graf neorientat este o secventa de noduri conectate prin muchii a.i. fiecare nod este
conectat direct cu nodul urmator in secventa.Niciun nod nu apare de mai multe ori in lant
-Un ciclu intr-un graf neorientat este un lant in care primul si ultimul nod sunt identice a.i. se
formeaza o bucla in graf
-Un graf neorientat este conex daca exista un drum intre oricare pereche de noduri din graf
- Un graf complet este un graf neorientat in care fiecare pereche distincta de noduri este conectata
printr-o muchie
-Gradul unui nod intr-un graf neorientat reprezinta numarul de muchii incidente cu acel nod ( nr de
vecini ai nodului respectiv)
-Grafurile neorientate se reprez in mermoria calculatorului prin: Matricea de Adiacenta sau Lista de
Adiacenta
-Un drum intr-un graf orientat este o secventa de noduri conectate prin muchii a.i. fiecare nod este
conectat direct cu nodul urmator in secventa.Nodurile pot aparea de mai multe ori in drum
-Un circuit intr-un graf orientat este un drum in care primul si ultimul nod sunt identice a.i. se
formeaza un ciclu in graf
-Un graf orientat este tare conex daca exista un drum orientat intre orice pereche de noduri din graf
-Intr-un graf orientat gradul interior al unui nod reprez nr de muchii care intra in acel nod iar gradul
exterior al unui nod reprez nr de muchii care ies din nod
-Grafurile orientate se reprez in mermoria calculatorului prin: Matricea de Adiacenta sau Lista de
Adiacenta
-in latime BFS ( Breadth First Search) consta in explorarea nodurilor in ordinea nivelului lor in raport
cu nodul de start. Se incepe de la nodul start se viziteaza vecini sai apoi se trece la vizitarea vecinii
vecinilor si asa mai departe pana sunt vizitate toate nodurile sau se atinge scopul
-in adancime DFS (Depth First Search) consta in explorarea cat mai adanc posibila a unui lant si apoi
revenirea la alt lant neexplorat. Se incepe de la nodul start se exploreaza un vecin neizitat apoi se
exploreaza vecinii nevizitati ai acestui vecin si asa mai departe pana cand nu mai exista vecini
nevizitati sau se atinge un anumit scop
Algoritmi:
Dijkstra ( algoritm ptr gasirea celui mai scurt drum intre un nod de start si toate celelalte noduri din
graf se foloseste o strategie Greedy)
Prim/Kruskal (algoritm ptr determinarea arborelui de cost minim asociat unui graf)
Metode de sortare:
funcționează prin inserarea fiecărui element dintr-o listă nesortată în locul corespunzător într-o
sublistă sortată. În fiecare pas, se alege un element din lista nesortată și se plasează în locul său
corect în lista sortată. Acest proces se repetă până când toate elementele sunt sortate
funcționează prin selectarea celui mai mic element din lista nesortată și plasarea lui în partea sortată
a listei. Acest proces se repetă pentru fiecare element din lista nesortată până când întreaga listă
este sortată
funcționează prin împărțirea listei inițiale în două subliste egale sau aproximativ egale, sortarea
acestor subliste, apoi combinarea sublistelor sortate într-o singură listă sortată.
funcționează prin alegerea unui element din lista de sortat, numit element pivot, și împărțirea listei
în două subliste: una cu elemente mai mici sau egale cu pivotul și cealaltă cu elemente mai mari sau
egale cu pivotul. Apoi, cele două subliste sunt sortate recursiv