Documente Academic
Documente Profesional
Documente Cultură
1
Administrativ
• Curs
– Sincron pe MS Teams: susținere curs
– Asincron pe Moodle: suport curs în format electronic
• Laborator
– Sincron pe MS Teams:
• rezolvare sarcini laborator
• se va folosi limbajul C și mediul de dezvoltare CodeBlocks
– Asincron pe Moodle:
• suport laborator în format electronic (schelet cod + document
sarcini de realizat)
• activități de încărcare (”assignments”) pentru sarcinile fiecărui
laborator
2
Notare la disciplina SDA
• Punctaj și evaluare
– 2 puncte activitate laborator:
• realizarea sarcinilor de lucru în cadrul fiecărui laborator
• încărcarea pe Moodle în cadrul unei activități dedicate pentru fiecare
laborator a rezolvării sarcinilor de lucru
– 2 puncte Quiz-uri pe Moodle:
• 2 Quiz-uri
• întrebări tip grilă cu un singur răspuns corect
• 1 Quiz se poate da de 2 ori
– 3 puncte proiect despre o structură de date/algoritm:
• temă aleasă dintr-o listă de subiecte (se pot propune și alte teme)
• echipe de maxim 3 persoane
• Încărcare pe Moodle în cadrul unei activități dedicate
– 3 puncte examen:
• examen fizic la sediul facultății
• tip grilă
– Total punctaj: 10 puncte
Cuprins
• Noțiuni introductive
– structuri de date fundamentale
– clasificare generală structuri de date
• Liste
– liste simplu înlănțuite
– liste dublu înlănțuite
HEAD NULL
5
Cuprins
• Stive TOP
NULL
• Cozi
1 2 3 4
6
Cuprins
• Algoritmi de căutare și sortare
– căutarea binară
– sortarea prin metoda bulelor (bubblesort)
– sortarea prin inserție (insertion sort)
– sortarea prin selecție (selection sort)
– sortarea prin interclasare (merge sort)
7
Cuprins
• Arbori
– arbori binari
– parcurgerea arborilor
(a+b)*c+7
8
Cuprins
• Grafuri
– orientate
– neorientate
9
Bibliografie și resurse utile (1)
• Cărți
– Kernighan B., Ritchie D., The C Programming Language,
Ed. Prentice Hall
– Cormen T.H, Leiserson C.E, Rivest R.L, Introducere în
algoritmi, (traducere a primei ediții), Ed. Agora, 2000
– Moraru F., Structuri de date și algoritmi, Ed. Bren
– Sedgewick R., Wayne K., Algorithms, Ed. Addison-
Wesley, Professional, 4th Edition
10
Bibliografie și resurse utile (2)
• Resurse utile online
– CodeBlocks IDE: http://www.codeblocks.org/
– Vizualizarea structurilor de date și algoritmilor prin animație:
https://visualgo.net/en
– Vizualizarea structurilor de date:
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
– Repository de rezolvări de probleme și descriere implementări
algoritmi: https://infoarena.ro/
• Platforma Moodle de eLearning a cursului
– Curs Structuri de date și algoritmi:
https://curs.upb.ro/2021/course/view.php?id=7840
• Platforma MS Teams
– Curs Structuri de date și algoritmi: link direct 11
Structuri de date fundamentale (1)
• De ce structuri de date
– rezolvarea unei probleme presupune: reprezentarea
datelor problemei, modalități de transformare a datelor
problemei, soluție cu un criteriu de succes / finalizare
• Structuri de date
– gruparea / organizarea datelor pentru a le accesa în mod
eficient
– prima structură de date: vector
– matrice (vector de vectori în limbajul C)
– gruparea în entități de tip înregistrare (”struct” în limbajul
C): liste înlănțuite (Linked Lists), arbori
12
Structuri de date fundamentale (2)
• Exemple structuri de date în limbajul C
int vec[100];
int mat[100][100];
struct persoana
{
char *nume;
char *prenume;
};
struct element
{
char *informatie;
struct element *urmator;
};
13
Structuri de date fundamentale (3)
• Structuri de date fundamentale în C
– vectori
– pointeri
– structuri
14
Structuri de date fundamentale (3)
• Reprezentarea unui graf orientat prin
15
Clasificare generală structuri de date
• Structurile de date pot fi caracterizate prin:
– relațiile dintre elementele structurii de date
– operațiile cu elementele structurii de date
• În funcție de relațiile dintre elemente
– structuri de date liniare: tablouri, liste, stive, cozi
– structuri de date neliniare
• structuri de date ierarhice sub formă de arbore în care un element
poate avea mai mulți succesori dar un singur predecesor
• structuri de date de tip graf în care un element poate avea mai
mulți predecesori și mai mult succesori
• În funcție de operațiile cu elemente
– structuri de căutare (mulțimi, dicționare, arbori de căutare,
etc.), structuri de stocare (liste, stive, cozi, etc.), etc.
16
Structuri de date abstracte
• O structură de date abstractă reprezintă descrierea logică a
organizării datelor și definirea operațiilor de bază a utilizării
acestora
• Se realizează abstractizarea operațiilor de bază fără a se
preciza modul concret de implementare (limbaj de programare,
alocare statică sau dinamică a elementelor, etc.)
– Exemple:
• push(stiva, element)
• pop(stiva, element)
• enqueue(coada, element)
• dequeue(coada, element)
• Etape dezvoltare program
– etapă de proiectare: alegere structuri abstracte de date
– etapă de implementare: implementarea concretă a structurilor de
date prin scrierea de cod
17
Ce este un algoritm
• Conceptul de algoritm există și a fost folosit încă din
antichitate
– împărțirea a două numere întregi
– ciurul lui Eratostene
– algoritmul lui Euclid pentru calculul celui mai mare divizor
comun
• Termenul de algoritm
– provine de la numele lui Muhammad ibn Musa al-
Khwarizmi (matematician persan din secolul 9)
– o secvență de pași, bine definită, cu o finitudine și
finalitate practică pentru rezolvarea unei probleme sau a
unei categorii de probleme
18
Recapitulare noțiuni limbaj C (1)
• Tipuri de date
– tipuri de date de bază: tipuri de date aritmetice
• întregi (”integer”)
• virgulă mobilă (”floating-point”)
– tipuri de date derivate
• vectori
• pointeri
• structuri
• funcții
– tipul enumerare
– tipul void
19
Recapitulare noțiuni limbaj C (2)
• Tipuri de date de bază întregi
Tip Dimensiune maximă Interval valori
char 1 octet
(8 biți)
unsigned char 1 octet
(8 biți)
short 2 octeți
(16 biți)
unsigned short 2 octeți
(16 biți)
int 4 octeți
(32 biți)
unsigned int 4 octeți
(32 biți)
long 8 octeți
(64 biți)
unsigned long 8 octeți
(64 biți)
• Pentru obținerea dimensiunii unui tip sau variabile (dependentă de
platformă): sizeof(tip)
20
Recapitulare noțiuni limbaj C (3)
• Exemplu citire variabilă int și afișare valoare și
dimensiune tip
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
Output:
Introduceti o valoare intreaga:10
Variabila are valoarea 10 iar dimensiunea tipului este de 4 octeti
21
Recapitulare noțiuni limbaj C (4)
• Tipuri de date de bază reale (reprezentate în virgulă mobilă)
22
Recapitulare noțiuni limbaj C (5)
• Exemplu citire variabilă double și afișare valoare și
dimensiune tip
#include <stdio.h>
#include <stdlib.h>
int main()
{
double b;
return 0;
}
Output:
Introduceti o valoare de tip double:1.2
Variabila are valoarea 1.200000 iar dimensiunea tipului este de 8 octeti
23
Recapitulare noțiuni limbaj C (6)
• Tipul void: reprezintă practic absența unei valori
– Este folosit în următoarele cazuri uzuale:
• ca valoare întoarsă de o funcție: o funcție care nu produce nicio
ieșire va întoarce void
– Exemplu: void afiseaza_nume(char nume[10]);
• daca o funcție nu are nevoie să primească parametri
– Exemplu: int initializare(void);
• ca pointer la void: un pointer de tip * void va reprezenta o adresa
din memorie însă fără a avea asociat un tip. În acest fel se poate
face cast la orice tip de date necesar a fi folosit în funcție de
situație. Exemplu când se vor prezenta pointerii
24
Recapitulare noțiuni limbaj C (7)
• Funcții
– grupare logică a unui număr de instrucțiuni
– orice program C are cel puțin funcția main()
– pentru lizibilitate cod și modularizare este de dorit de
împărțit codul în funcții separate ce pot fi apelate mai ales
în cazul în care codul din corpul unei funcții devine prea
mare și dacă se repetă în cadrul aceleiași funcții calupuri
de cod similare
– o funcție are:
• declarație: precizează numele funcției, tipul returnat de funcție
și parametrii primiți de funcție
• definiție: alături de nume, tip returnat și parametri conține și codul
propriu-zis al funcției
25
Recapitulare noțiuni limbaj C (8)
• Declarația unei funcții
– Este alcătuită dintr-un header (antet) și are forma:
tip_returnat nume_functie(lista parametri);
– Conține:
• tip de date returnat: o funcție poate să întoarcă o valoare sau nu (atunci
va întoarce void)
• nume funcție
• parametri: lista parametrilor identificați prin tip și nume în ordinea dorită;
la apelul funcției se vor trimite valorile propriu-zise ale parametrilor; nu
este obligatoriu ca o funcție să aibă parametri (pot să lipsească)
• corpul funcției: codul propriu-zis al instrucțiunilor executate de funcție
– În C se poate separa declarația de codul propriu-zis al acesteia
(definiția). Astfel pentru ca o funcție să fie folosită este de ajuns să fie
declarată înainte de codul care o apelează și definiția acesteia să fie
făcută ulterior în cod (fișierul sursă curent sau alt fișier sursă parte din
program)
• Exemplu:
void afiseaza_semn_numar(int numar);
26
Recapitulare noțiuni limbaj C (9)
• Definirea unei funcții
– Este alcătuită dintr-un header (antet) al funcției și corpul
funcției și are forma:
tip_intors nume_functie(lista parametri)
{
corpul functiei
}
– Conține:
• tip de date returnat, nume funcție și parametri: similari ca cei de la
declarație
• corpul funcției: codul propriu-zis al instrucțiunilor executate de funcție
29
Recapitulare noțiuni limbaj C (12)
• Exemplu transmitere parametri prin valoare
void suma_doua_numere_varianta_1(int numar1, int numar2, int suma)
{
suma = numar1 + numar2;
return;
}
int suma_doua_numere_varianta_2(int numar1, int numar2)
{
int suma;
suma = numar1 + numar2;
return suma;
}
int main()
{
int suma = 0;int numar1 = 3;int numar2 = 2;
33
Recapitulare noțiuni limbaj C (16)
• Exemple de utilizare:
typedef struct
{
int X; int Y;
} S1; // typedef pentru numele S1, se poate utiliza numele 'S1'
struct S2
{
int X; int Y;
}; // este un typedef pentru struct S2, se poate utiliza ca 'struct S2'
struct
{
int X; int Y;
} S3; // se declara variabila S3, fara tip; se poate utiliza doar ca variabila S3
typedef struct S4
{
int X; int Y;
} S4; // typedef pentru numele S4 cat si pentru struct S4; se poate utiliza numele 'S4’
// cat si 'struct S4’
int main()
{
S1 val1; // CORECT
struct S2 val2; // CORECT
S2 val3; // INCORECT
S3 val4; // INCORECT
struct S4 val5; // CORECT
S4 val6; // CORECT
}
return 0;
34
Recapitulare noțiuni limbaj C (17)
• Vectori (tablou uni-dimensional): un vector este o
colecție liniară de variabile de același tip
• Elementele dintr-un vector pot fi accesate în mod
unic printr-un index specific
• Indexul este un număr întreg pozitiv
• Indexarea în limbajul C începe cu valoarea 0
• Declarația unui vector:
tip nume_vector [dimensiune_vector];
dimensiune_vector: o constantă întreagă mai mare decât 0
Exemple:
int a[10];
float b[10];
#define NUM_ELEM 10
int c[NUM_ELEM];
35
Recapitulare noțiuni limbaj C (18)
• Dimensiunea vectorilor o constantă la compilare
pentru a se putea aloca memoria necesară
• Valorile unui vector se pot inițializa una câte una
sau direct la declararea vectorului:
int a[4] = { 1,2,3,4 }; // Initializare completa
float b[] = { 0.1, 0.2,0.3 }; // La compilare se determina dimensiunea de 4 a
// vectorului
int c[10] = { 1,2,3,4 }; // Se initializeaza doar primele 4 valori
int main()
{
int a[10]; // vectorul va avea maxim 10 elemente
int numar_elemente; // numarul de elemente din vector
if (numar_elemente > 10) // daca numarul de elemente mai mare decat maximul
{
printf("Ati introdus un numar de elemente prea mare pentru vector\n");
return 0;
}
return 0;
}
Output:
Introduceti numarul de elemente al vectorului:2
Introduceti elementul [1] din vector:1
Introduceti elementul [2] din vector:5
Vectorul are urmatoarele elemente:1 5
37
Recapitulare noțiuni limbaj C (20)
• Matrice (tablou bi-dimensional): o matrice este o colecție
bi-dimensională de variabile de același tip
• Elementele dintr-o matrice pot fi accesate în mod unic
folosind doi indecși specific, pozitivi, începând de la 0
• Declarația unei matrice:
tip nume_matrice [dimensiune_1][dimensiune_2];
dimensiune_1, dimensiune_2: constante întregi mai mari decât 0
de obicei, dimensiune_1 = numărul de linii, dimensiune_2 = numărul de coloane
Exemple:
int a[10][10];
float b[10][10];
#define NUM_ELEM 10
int c[NUM_ELEM][NUM_ELEM];
if (n > 10) // daca numarul de linii si coloane mai mare decat maxim
{
printf("Ati introdus un numar de linii si coloane prea mare pentru matrice\n");
return 0;
}