Structuri de Date

Vectori (Tablouri) în C++

Clasa a VIII-a • Tehnologia Informației și a Comunicațiilor
Modulul: Algoritmi – Secvențe de valori
6 Lecții • De la zero la proiect complet

Ce vom învăța în acest modul?

6 lecții • Fiecare construiește pe cea anterioară
  • Lecția 1: Tablouri (Arrays)
  • Declarare, inițializare, indexare de la 0
  • Cum stocăm 100 de valori cu o singură linie
  • Lecția 2: Parcurgere cu for
  • Citire, afișare, sumă, medie, numărare
  • Formula magică: for(int i=0; i<n; i++)
  • Lecția 3: Căutare
  • Căutare liniară (orice vector)
  • Căutare binară (vector sortat – super-rapidă!)
  • Lecția 4: Maxim și Minim
  • Algoritmul Campionului
  • Cu poziție, ambele simultan
  • Lecția 5: Sortare (Bubble Sort)
  • Interschimbarea (Swap)
  • Metoda bulelor – pas cu pas
  • Lecția 6: Proiect Final
  • Catalog de Note – aplicație completă
  • Toate tehnicile combinate
La final vei ști să stochezi, parcurgi, cauți, sortezi și prelucrezi colecții de date în C++!
01

Introducere în Vectori

De ce avem nevoie de ei și cum funcționează

De ce avem nevoie de vectori?

Problema: Cum stocăm notele a 30 de elevi?
  • Fără vectori:
// 30 de variabile separate!
int nota1, nota2, nota3;
int nota4, nota5, nota6;
int nota7, nota8, nota9;
// ... inca 21 de variabile ...
int nota28, nota29, nota30;

// Vrei suma? 30 de adunari!
int suma = nota1 + nota2 + nota3
         + nota4 + nota5 + nota6
         // ... + inca 24 ...
30 variabile, cod repetitiv, imposibil de gestionat!
  • Cu vectori:
// O singura linie!
int note[30];

// Citire cu for:
for (int i = 0; i < 30; i++)
    cin >> note[i];

// Suma cu for:
int suma = 0;
for (int i = 0; i < 30; i++)
    suma += note[i];

// 4 linii in loc de 60+!
Același cod funcționează pentru 5, 30 sau 1000 de elevi!

Analogie: Dulapul cu sertare

Un singur dulap, mai multe sertare numerotate
  • Dulapul = Vectorul
  • Dulapul are un singur NUME („Dulap Note”)
  • Fiecare sertar are un NUMĂR (0, 1, 2, 3...)
  • Toate sertarele au aceeași formă (același tip de date)
  • Pentru a găsi ceva: Dulap[nr_sertar]
  •  
  • Traducția în C++:
  • int note[5] = dulap cu 5 sertare
  • note[0] = primul sertar (nu note[1]!)
  • note[4] = ultimul sertar (nu note[5]!)
  • note[5] = sertarul 6 care NU EXISTĂ!
  • Vizualizare: int note[5] = {9, 7, 10, 8, 6};
note[0]
9
note[1]
7
note[2]
10
note[3]
8
note[4]
6
← index 0                           index 4 →
Fiecare int ocupă 4 bytes consecutivi în memorie. Dacă note[0] e la adresa 100, note[1] e la 104, note[2] la 108...
Regula de Aur: N sertare = indici de la 0 la N-1. Indexul N nu există!
02

Declarare și Indexare

Lecția 1: Cum creăm și accesam vectori

Declararea Vectorilor

Sintaxă generală și variante
  • Formula generală:
  • tip   nume[dimensiune];
  •  
  • Cele 3 tipuri frecvente:
  • int – numere întregi (note, vârste, scoruri)
  • float – numere cu zecimale (temperaturi, medii)
  • char – caractere individuale (litere, cifre)
  •  
  • 4 moduri de declarare:
  • Vector gol: int x[10];
  • Cu valori: int x[5] = {9,7,10,8,6};
  • Dimensiune dedusă: int x[] = {9,7,10};
  • Parțial: int x[5] = {9,7}; restul = 0
// 1. Vector gol (valori nedefinite!)
int note[30];
// ATENTIE: contine "gunoi" din memorie!

// 2. Vector cu toate valorile
int note[5] = {9, 7, 10, 8, 6};

// 3. Dimensiune dedusa automat
int zile[] = {31, 28, 31, 30};
// compilatorul stie: 4 elemente

// 4. Partial initializat
int x[5] = {9, 7};
// x = {9, 7, 0, 0, 0}
// restul se completeaza cu 0!

// 5. Toate zero
int note[100] = {0};
// Truc: toate 100 devin 0
Vectorul TREBUIE să aibă dimensiune cunoscută la compilare (număr fix sau dedus din valorile inițiale)

Accesare și Modificare

Cum citim și scriem valori în vector
int note[5] = {9, 7, 10, 8, 6};

// CITIRE (accesare)
cout << note[0];     // Afiseaza: 9
cout << note[2];     // Afiseaza: 10
cout << note[4];     // Afiseaza: 6

// SCRIERE (modificare)
note[2] = 8;
// Vectorul acum: {9, 7, 8, 8, 6}

// CALCULE cu elementele
int suma = note[0] + note[1];
// suma = 9 + 7 = 16

// Un element e o variabila normala!
note[3] = note[3] + 1;
// sau: note[3]++;
// note[3] era 8, acum e 9
  • Ce puteți face cu note[i]:
  • Citi valoarea: cout << note[i];
  • Modifica valoarea: note[i] = 10;
  • Folosi în calcule: suma += note[i];
  • Compara: if (note[i] >= 5)
  • Citi de la tastatură: cin >> note[i];
  •  
  • Indexul poate fi și variabilă!
  • int i = 3; cout << note[i];
  • Asta face posibilă parcurgerea cu for!
  •  
  • Indexul poate fi și expresie:
  • note[i+1] = elementul de după i
  • note[n-1] = ultimul element
  • note[n/2] = elementul din mijloc
Fiecare element note[i] se comportă exact ca o variabilă obișnuită de tip int!

Greșeli frecvente la declarare și accesare

Evită-le și vei fi înaintea clasei!
GREȘITCORECTDe ce?
int note(10);int note[10];Parantezele rotunde sunt pentru funcții!
array note[10];int note[10];Nu există tipul „array”. Tipul vine primul.
int note[];int note[10];Fără dimensiune și fără valori = eroare!
int n; int x[n];int x[100]; cin>>n;Dimensiunea trebuie să fie constantă!
note[5] pt. vector de 5note[4] = ultimul5 elemente = indici 0,1,2,3,4. NU 5!
int x[3]={1,2,3,4};int x[4]={1,2,3,4};4 valori nu încap în vector de 3!
if (x[i] = 5)if (x[i] == 5)Un = e atribuire, == e comparație!
Cele mai periculoase greșeli: accesare în afara limitelor (note[n]) și confuzia = vs ==

🧠 Checkpoint: Ce afișează codul?

Verifică-ți înțelegerea indexurilor!
int x[6] = {3, 8, 1, 5, 9, 2};

cout << x[0];         // a) ???
cout << x[3];         // b) ???
cout << x[5];         // c) ???

x[1] = x[4];
cout << x[1];         // d) ???

x[2] = x[2] + 10;
cout << x[2];         // e) ???

cout << x[0] + x[5]; // f) ???
  • Răspunsuri:
  •  
  • a) 3 – x[0] = primul element
  • b) 5 – x[3] = al patrulea element
  • c) 2 – x[5] = ultimul (al 6-lea)
  • d) 9 – x[1] a devenit x[4] care e 9
  • e) 11 – x[2] era 1, acum 1+10=11
  • f) 5 – x[0]+x[5] = 3+2 = 5
  •  
  • Starea finală a vectorului:
[0]
3
[1]
9
[2]
11
[3]
5
[4]
9
[5]
2
03

Parcurgerea Vectorilor

Lecția 2: Vizitarea fiecărui element cu bucla for

Formula magică: Parcurgerea cu for

Analogie: Profesorul face prezența – trece prin fiecare elev, de la primul la ultimul
  • Cele 4 componente:
  • int i = 0 → începe de la primul element
  • i < n → continuă cât timp nu am depășit
  • i++ → trece la următorul
  • x[i]elementul curent
  •  
  • De ce i < n și NU i <= n?
  • Dacă n=5, indicii valizi sunt 0,1,2,3,4
  • i < 5 se oprește la i=4 (corect!)
  • i <= 5 ar accesa și x[5] (NU EXISTĂ!)
  •  
  • Parcurgere inversă:
  • for(int i=n-1; i>=0; i--)
// Parcurgere: stanga -> dreapta
for (int i = 0; i < n; i++) {
    // Fa ceva cu x[i]
}

// Exemplu: Afisare
int note[5] = {9, 7, 10, 8, 6};
int n = 5;

for (int i = 0; i < n; i++) {
    cout << "note[" << i << "] = "
         << note[i] << endl;
}
note[0] = 9 note[1] = 7 note[2] = 10 note[3] = 8 note[4] = 6

Trace: Parcurgere pas cu pas

int note[5] = {9, 7, 10, 8, 6};    for(int i=0; i<5; i++) suma += note[i];
Inițial: suma = 0 Pas 1: i=0 → note[0]=9 → suma = 0+9 = 9 [9] [7] [10] [8] [6] ^ Pas 2: i=1 → note[1]=7 → suma = 9+7 = 16 [9] [7] [10] [8] [6] ^ Pas 3: i=2 → note[2]=10 → suma = 16+10 = 26 [9] [7] [10] [8] [6] ^ Pas 4: i=3 → note[3]=8 → suma = 26+8 = 34 [9] [7] [10] [8] [6] ^ Pas 5: i=4 → note[4]=6 → suma = 34+6 = 40 [9] [7] [10] [8] [6] ^ STOP: i=5 → 5 < 5? NU! → Ieșim din for Rezultat: suma = 40
  • Observații:
  • i începe de la 0 (primul)
  • i se oprește la n-1 (ultimul)
  • La fiecare pas, suma creste cu note[i]
  •  
  • Acumulatorul:
  • suma = 0; (inițializare)
  • suma += x[i]; (acumulare)
  • Același pattern pentru:
  • Sumă, produs, numărare
Inițializează înainte de for! Sumă = 0, produs = 1, contor = 0

Operații în timpul parcurgerii

Aceeeași buclă, operații diferite
// 1. CITIRE de la tastatura
int note[100], n;
cout << "Cate note? ";
cin >> n;

for (int i = 0; i < n; i++) {
    cout << "Nota " << i+1
         << ": ";
    cin >> note[i];
}

// 2. AFISARE pe o linie
for (int i = 0; i < n; i++)
    cout << note[i] << " ";
cout << endl;
// 3. SUMA si MEDIA
int suma = 0;
for (int i = 0; i < n; i++)
    suma += note[i];

float media = (float)suma / n;
cout << "Media: " << media;

// 4. NUMARARE (note >= 8)
int bune = 0;
for (int i = 0; i < n; i++)
    if (note[i] >= 8)
        bune++;
cout << bune << " note bune";
// 5. NUMARARE PARE
int pare = 0;
for (int i = 0; i < n; i++)
    if (x[i] % 2 == 0)
        pare++;

// 6. PRODUS
long produs = 1;  // NU 0!
for (int i = 0; i < n; i++)
    produs *= x[i];

// 7. AFISARE INVERSA
for (int i = n-1; i >= 0; i--)
    cout << x[i] << " ";
Pattern comun: inițializează variabila (suma=0, contor=0, produs=1) apoi acumulează în for

Exemplu complet: Temperaturi săptămânale

Citire + Afișare + Sumă + Medie + Numărare
#include <iostream>
#include <string>
using namespace std;
int main() {
    float temp[7];
    int n = 7;
    string zile[] = {"Luni","Marti",
        "Miercuri","Joi","Vineri",
        "Sambata","Duminica"};

    // 1. Citire
    for (int i = 0; i < n; i++) {
        cout << zile[i] << ": ";
        cin >> temp[i];
    }

    // 2. Afisare + Suma
    float suma = 0;
    for (int i = 0; i < n; i++) {
        cout << zile[i] << ": "
             << temp[i] << "°C" << endl;
        suma += temp[i];
    }

    // 3. Media
    cout << "Media: " << suma/n << "°C";

    // 4. Numarare zile calde (>25°C)
    int calde = 0;
    for (int i = 0; i < n; i++)
        if (temp[i] > 25) calde++;
    cout << "Zile calde: " << calde;
    return 0;
}
Luni: 22.5 Marti: 28.3 Miercuri: 31.0 Joi: 19.7 Vineri: 26.1 Sambata: 24.5 Duminica: 21.8 Media: 24.84°C Zile calde: 3
Observă: Am folosit 2 vectori paraleli – temp[] și zile[] – legate prin același index i.
La float nu ai nevoie de (float) la împărțire – e deja real!
04

Căutarea în Vectori

Lecția 3: Liniară și Binară

Căutarea Liniară

Verifică element cu element – simplu dar sigur!
  • Cum funcționează?
  • Parcurge vectorul de la început la sfârșit
  • Compară fiecare element cu cel căutat
  • Dacă găsește → se oprește (break)
  • Dacă ajunge la sfârșit → „nu există”
  •  
  • Analogie: Căutarea cheilor
  • Verifici fiecare buzunar, pe rând
  • Funcționează mereu, dar e lent
  • 10 buzunare = max. 10 verificări
  •  
  • Când o folosim?
  • Pe ORICE vector (sortat sau nu)
  • E singura opțiune pt. vectori nesortați
int x[7] = {3, 8, 1, 4, 9, 2, 7};
int n = 7;
int cautat = 4;

// Variabila pentru rezultat
bool gasit = false;
int pozitie = -1;  // -1 = negasit

// Parcurgere cu verificare
for (int i = 0; i < n; i++) {
    if (x[i] == cautat) {
        gasit = true;
        pozitie = i;
        break;  // STOP! Am gasit!
    }
}

// Afisare rezultat
if (gasit)
    cout << "Gasit la pozitia "
         << pozitie;
else
    cout << "Nu exista!";
Gasit la pozitia 3

Trace: Căutare liniară pas cu pas

x = {3, 8, 1, 4, 9, 2, 7}   Căutăm: 4
Pas 1: i=0 → x[0]=3 == 4? NU → continuă [3] [8] [1] [4] [9] [2] [7] ^ Pas 2: i=1 → x[1]=8 == 4? NU → continuă [3] [8] [1] [4] [9] [2] [7] ^ Pas 3: i=2 → x[2]=1 == 4? NU → continuă [3] [8] [1] [4] [9] [2] [7] ^ Pas 4: i=3 → x[3]=4 == 4? DA!GASIT! [3] [8] [1] [4] [9] [2] [7] ^ break! → pozitie = 3, gasit = true (Nu mai verificam restul vectorului)
  • Dacă căutăm 5?
  • Parcurgem TOATĂ lista
  • 7 comparații, nici o potrivire
  • gasit rămâne false
  •  
  • Performanță:
  • Cel mai bun caz: 1 pas
  • (Elementul e primul)
  • Cel mai rău caz: n pași
  • (E ultimul sau nu există)
  • Media: n/2 pași
break e esențial! Fără el, continuă să caute după ce a găsit.

Căutarea Binară – Super-rapidă!

Condiție obligatorie: vectorul TREBUIE să fie SORTAT!
  • Ideea genială:
  • Împarte zona de căutare în jumătate
  • Compară cu elementul din mijloc
  • Egal? GASIT!
  • Mai mic? Caută în stânga
  • Mai mare? Caută în dreapta
  •  
  • Analogie: Ghicirea numărului
  • „Gândește-te la un număr 1-100”
  • „E mai mare sau mai mic decât 50?”
  • Cu fiecare întrebare, eliminam jumătate!
  •  
  • Performanță incredibilă:
ElementeLiniarăBinară
100100 pași7 pași
1.0001.00010 pași
1.000.0001.000.00020 pași!
// OBLIGATORIU: vector SORTAT!
int x[8] = {2,5,8,12,15,23,37,45};
int n = 8, cautat = 15;

int st = 0, dr = n - 1;
bool gasit = false;
int pozitie = -1;

while (st <= dr) {
    int mij = (st + dr) / 2;

    if (x[mij] == cautat) {
        gasit = true;
        pozitie = mij;
        break;
    }
    else if (cautat < x[mij])
        dr = mij - 1;  // stanga
    else
        st = mij + 1;  // dreapta
}

if (gasit)
    cout << "Gasit la " << pozitie;
else
    cout << "Nu exista!";

Trace: Căutare binară pas cu pas

x = {2, 5, 8, 12, 15, 23, 37, 45}   Căutăm: 15
Pas 1: st=0, dr=7 → mij=(0+7)/2 = 3 [2] [5] [8] [12] [15] [23] [37] [45] st mij dr x[3]=12, cautat=15 → 15 > 12 → caută DREAPTA st = mij+1 = 4 Pas 2: st=4, dr=7 → mij=(4+7)/2 = 5 [2] [5] [8] [12] [15] [23] [37] [45] st mij dr x[5]=23, cautat=15 → 15 < 23 → caută STÂNGA dr = mij-1 = 4 Pas 3: st=4, dr=4 → mij=(4+4)/2 = 4 [2] [5] [8] [12] [15] [23] [37] [45] st=mij=dr x[4]=15, cautat=15 → 15 == 15 → GASIT! Rezultat: pozitie = 4 (doar 3 pasi!)
  • Rezumat:
  • 8 elemente, doar 3 pași
  • Liniară ar fi făcut 5 pași
  •  
  • De reținut:
  • NUMAI pe vector SORTAT!
  • Folosim while, nu for
  • mij = (st+dr)/2
  • La fiecare pas, jumătățim zona
Căutare binară pe vector NESORTAT = REZULTATE GREȘITE! Sortează întâi!

Numărarea aparițiilor și căutare condițională

Variațiuni ale căutării – diferența cheie: break vs. fără break
// 1. NUMARARE: Cate note de 10?
int note[8] = {7,10,8,10,6,10,9,10};
int contor = 0;

for (int i = 0; i < 8; i++) {
    if (note[i] == 10)
        contor++;  // NU break!
}
cout << "Nota 10: " << contor
     << " ori";
Nota 10: 4 ori
// 2. PRIMA aparitie conditionala
// Primul numar par din vector
int x[6] = {7, 3, 9, 4, 8, 1};
int pozitie = -1;

for (int i = 0; i < 6; i++) {
    if (x[i] % 2 == 0) {
        pozitie = i;
        break;  // STOP!
    }
}
cout << "Primul par: " << x[pozitie]
     << " la poz " << pozitie;
Primul par: 4 la poz 3
⭐ Căutare (un element) → break după găsire   |   Numărare (toate) → FĂRĂ break, parcurgem tot!
05

Maxim și Minim

Lecția 4: Algoritmul Campionului

Algoritmul Campionului

Analogie: Campionatul școlar – cine e cel mai bun?
  • Cum funcționează:
  • 1. Îl iei pe primul ca „campion” inițial
  • 2. Compari campionul cu al doilea
  • E mai bun? Noul campion!
  • Nu? Campionul rămâne.
  • 3. Compari cu al treilea, al patrulea...
  • 4. La sfârșit = campionul adevărat!
  •  
  • Pași în cod:
  • maxim = x[0] (campionul inițial)
  • Parcurge de la i=1 (NU de la 0!)
  • Dacă x[i] > maximmaxim = x[i]
  •  
  • NICIODATĂ maxim = 0! Dacă ai {-3, -1, -7}, maximul e -1, NU 0!
int note[5] = {7, 9, 4, 10, 6};
int n = 5;

// MAXIM
int maxim = note[0]; // campion initial

for (int i = 1; i < n; i++) {
    if (note[i] > maxim) {
        maxim = note[i]; // noul campion
    }
}
cout << "Maximul: " << maxim;
Maximul: 10
// MINIM - singura diferenta: > devine <
int minim = note[0];

for (int i = 1; i < n; i++) {
    if (note[i] < minim)
        minim = note[i];
}
cout << "Minimul: " << minim;
Minimul: 4

Trace: Algoritmul Campionului

note = {7, 9, 4, 10, 6} – Căutăm MAXIMUL
Inițial: maxim = note[0] = 7 (campion inițial) Pas 1: i=1 → note[1]=9 > 7? DA! → maxim = 9 [7] [9] [4] [10] [6] campion: 9 ^ Pas 2: i=2 → note[2]=4 > 9? NU. → maxim rămâne 9 [7] [9] [4] [10] [6] campion: 9 ^ Pas 3: i=3 → note[3]=10 > 9? DA! → maxim = 10 [7] [9] [4] [10] [6] campion: 10 ^ Pas 4: i=4 → note[4]=6 > 10? NU. → maxim rămâne 10 [7] [9] [4] [10] [6] campion: 10 ^ Rezultat: maxim = 10 ✔
  • Observă:
  • 4 comparații (n-1)
  • 2 actualizări ale campionului
  • Parcurgem de la i=1
  • (note[0] e deja campionul)
  •  
  • Variante utile:
  • Cu poziție:
int maxim = x[0];
int poz = 0;  // pozitia max
for(int i=1; i<n; i++)
  if(x[i] > maxim) {
    maxim = x[i];
    poz = i;  // retine si unde
  }
Max și Min în aceeași parcurgere:
if(x[i]>maxim) maxim=x[i];
if(x[i]<minim) minim=x[i];
06

Sortarea – Bubble Sort

Lecția 5: Interschimbarea și metoda bulelor

Interschimbarea (Swap)

Operația fundamentală pentru sortare – Analogia cu paharele
  • Problema: Interschimbă 2 valori
  • Pahar A: suc de portocale
  • Pahar B: suc de mere
  • Vrei să le interschimbi?
  • Ai nevoie de un pahar GOL (temp)!
  •  
  • Cei 3 pași:
  • Pasul 1: temp = a[i]
  • Salvezi portocalele în paharul gol
  • Pasul 2: a[i] = a[i+1]
  • Torni merele în paharul A
  • Pasul 3: a[i+1] = temp
  • Torni portocalele salvate în paharul B
// CORECT - cu variabila temporara
int temp = a[i];      // Salvam
a[i] = a[i+1];       // Copiam
a[i+1] = temp;       // Restauram
// GRESIT - fara temp!
a[i] = a[i+1];    // a[i] original PIERDUT!
a[i+1] = a[i];    // Ambele au aceeasi
                   // valoare acum!
Exemplu: a[0]=5, a[1]=3. Swap: temp = 5 → temp=5, a={5,3} a[0] = a[1] = 3 → temp=5, a={3,3} a[1] = temp = 5 → temp=5, a={3,5} Rezultat: a = {3, 5} ✔
Fără variabila temporară (temp), valoarea originală se PIERDE definitiv!

Bubble Sort – Metoda Bulelor

Compară vecini, interschimbă, repetă – ca bulele care urcă la suprafață!
  • Cum funcționează?
  • Compară perechi de vecini: a[i] cu a[i+1]
  • Dacă sunt în ordine greșită → swap!
  • Repetă trecerea până când totul e sortat
  •  
  • De ce „bule”?
  • După fiecare trecere, cel mai mare element „urcă” la sfârșit
  • Ca o bulă de aer în apă!
  •  
  • Formule cheie:
  • N elemente → N-1 treceri maxim
  • Bucla interioară: i < n-1-p
  • La fiecare trecere, ultimul element deja e pe loc
  •  
  • Crescător: if (a[i] > a[i+1])
  • Descrescător: if (a[i] < a[i+1])
int a[5] = {5, 3, 8, 1, 4};
int n = 5;

// Bubble Sort CRESCATOR
for (int p = 0; p < n-1; p++) {
    for (int i = 0; i < n-1-p; i++) {
        if (a[i] > a[i+1]) {
            // Swap (interschimbare)
            int temp = a[i];
            a[i] = a[i+1];
            a[i+1] = temp;
        }
    }
}
// Rezultat: {1, 3, 4, 5, 8}
// Bubble Sort DESCRESCATOR
// Singura diferenta: > devine <
for (int p = 0; p < n-1; p++)
    for (int i = 0; i < n-1-p; i++)
        if (a[i] < a[i+1]) {
            int temp = a[i];
            a[i] = a[i+1];
            a[i+1] = temp;
        }
// Rezultat: {8, 5, 4, 3, 1}

Trace: Bubble Sort pas cu pas

Vector inițial: {5, 3, 8, 1, 4} → Sortare CRESCĂTOARE
TRECEREA 1 (p=0): 4 comparații (5,3) → 5>3? DA → swap → {3,5,8,1,4} (5,8) → 5>8? NU → {3,5,8,1,4} (8,1) → 8>1? DA → swap → {3,5,1,8,4} (8,4) → 8>4? DA → swap → {3,5,1,4,8} → Rezultat: {3, 5, 1, 4, [8]} ← 8 pe loc! TRECEREA 2 (p=1): 3 comparații (3,5) → 3>5? NU (5,1) → 5>1? DA → swap → {3,1,5,4,8} (5,4) → 5>4? DA → swap → {3,1,4,5,8} → Rezultat: {3, 1, 4, [5], [8]} TRECEREA 3 (p=2): 2 comparații (3,1) → 3>1? DA → swap → {1,3,4,5,8} (3,4) → 3>4? NU → Rezultat: {1, 3, [4], [5], [8]} TRECEREA 4 (p=3): 1 comparație (1,3) → 1>3? NU → Rezultat: {[1], [3], [4], [5], [8]} FINAL: {1, 3, 4, 5, 8} ✔
  • Statistici:
  • 4 treceri (n-1 = 5-1)
  • 10 comparații total (4+3+2+1)
  • 6 interschimbări
  •  
  • De ce n-1-p?
  • După trecerea 1: ultimul e sortat
  • După trecerea 2: ultimii 2 sunt sortați
  • Nu mai trebuie să-i verificăm!
  •  
  • Optimizare (oprit devreme):
// Daca o trecere nu face swap
// = vectorul e deja sortat!
bool sortat;
for(int p=0; p<n-1; p++) {
  sortat = true;
  for(int i=0; i<n-1-p; i++)
    if(a[i] > a[i+1]) {
      int t=a[i];
      a[i]=a[i+1];
      a[i+1]=t;
      sortat = false;
    }
  if(sortat) break; //STOP!
}
07

Proiect Final: Catalog Note

Lecția 6: Toate tehnicile combinate într-o aplicație reală

Proiectul: Catalog de Note

6 funcționalități = 6 lecții aplicate
  • Funcționalități:
  •  
  • 1. Citirea notelor (L1+L2)
  • Declarare vector + citire cu for
  • 2. Afișarea catalogului (L2)
  • Parcurgere + format frumos (Nr. | Nota)
  • 3. Statistici: Suma + Media (L2)
  • Acumulator + (float)suma/n
  • 4. Nota maximă și minimă (L4)
  • Algoritmul campionului cu poziție
  • 5. Căutare: câte note de 10? (L3)
  • Numărare apariții (fără break!)
  • 6. Sortare descrescătoare (L5)
  • Bubble Sort: if(a[i] < a[i+1]) swap
  • Ordinea contează!
  •  
1. Citire → avem datele 2. Afisare → vedem ce am citit 3. Statistici → suma, media (INAINTE de sortare!) 4. Max/Min → extreme (INAINTE de sortare!) 5. Cautare → numarare aparitii (ordinea nu conteaza) 6. Sortare → ULTIMUL! (schimba ordinea originala!)
După sortare, nu mai știi care elev avea care notă! Calculează tot ce ai nevoie îNAINTE.

Codul complet al proiectului

Selectează și copiază codul pentru a-l testa!
#include <iostream>
using namespace std;
int main() {
    const int MAX = 100;
    int note[MAX], n;

    // 1. CITIRE
    cout << "Cati elevi? ";
    cin >> n;
    for(int i = 0; i < n; i++) {
        cout << "Nota elevului " << i+1 << ": ";
        cin >> note[i];
    }

    // 2. AFISARE CATALOG
    cout << "\n=== CATALOG ===\n";
    for(int i = 0; i < n; i++)
        cout << "Elev " << i+1 << ": " << note[i] << endl;

    // 3. SUMA + MEDIA
    int suma = 0;
    for(int i = 0; i < n; i++)
        suma += note[i];
    float media = (float)suma / n;
    cout << "Suma: " << suma << endl;
    cout << "Media: " << media << endl;

    // 4. MAX si MIN cu pozitie
    int mx = note[0], pmx = 0;
    int mn = note[0], pmn = 0;
    for(int i = 1; i < n; i++) {
        if(note[i] > mx) { mx=note[i]; pmx=i; }
        if(note[i] < mn) { mn=note[i]; pmn=i; }
    }
    cout << "Max: " << mx << " (elev " << pmx+1 << ")\n";
    cout << "Min: " << mn << " (elev " << pmn+1 << ")\n";

    // 5. NUMARARE note de 10
    int zece = 0, promovati = 0;
    for(int i = 0; i < n; i++) {
        if(note[i] == 10) zece++;
        if(note[i] >= 5) promovati++;
    }
    cout << "Note de 10: " << zece << endl;
    cout << "Promovati: " << promovati << "/" << n << endl;

    // 6. SORTARE descrescatoare
    for(int p=0; p<n-1; p++)
      for(int i=0; i<n-1-p; i++)
        if(note[i] < note[i+1]) {
          int t=note[i];
          note[i]=note[i+1];
          note[i+1]=t;
        }
    cout << "\nClasament: ";
    for(int i=0; i<n; i++)
        cout << note[i] << " ";
    return 0;
}

Greșeli clasice în proiect

Top 5 greșeli – verifică să nu le faci!
#GreșealaConsecințaSoluția
1Sortezi INAINTE de statisticiPierzi asocierea elev-notăStatistici → apoi sortare
2suma/n (int/int)58/8 = 7 (nu 7.25!)(float)suma/n
3maxim = 0Eșec la note negativemaxim = note[0]
4break la numărareGăsește doar prima aparițieFără break la numărare!
5i <= n în forAccesare în afara vectoruluii < n (strict mai mic)
// GRESIT: suma/n cand ambele sunt int
int suma = 58, n = 8;
cout << suma / n;     // Afiseaza: 7 !!!
cout << (float)suma/n; // Afiseaza: 7.25 ✔
// GRESIT: maxim = 0 cu numere negative
int x[3] = {-3, -1, -7};
int maxim = 0;        // Maximul REAL e -1!
maxim = x[0];          // CORECT: -3 ✔
⭐ Regula de Aur: Statistici → Sortare → Afisare clasament (această ordine!)
08

Recapitulare

Tot ce ai învățat, pe scurt

Recapitulare: 6 tehnici esențiale

Tot modulul pe un singur slide
  • L1: Tablouri (Arrays)
  • int x[n]; – declarare, acces cu x[i], index de la 0
  • L2: Parcurgere
  • for(int i=0; i<n; i++) – citire, afișare, sumă, medie, numărare
  • L3: Căutare
  • Liniară (orice vector) – element cu element, break la găsire
  • Binară (DOAR sortat) – înjumătățire repetată, super-rapidă
  • L4: Maxim și Minim
  • Algoritmul campionului: max=x[0], parcurgere de la i=1
  • L5: Sortare
  • Swap cu temp + Bubble Sort: compară vecini, repetă
  • L6: Proiect
  • Catalog Note: citire → statistici → max/min → cautare → sortare
  • ⭐ Regulile de Aur:
  •  
  • Indexarea începe de la 0, NU de la 1
  • N elemente = indici de la 0 la N-1
  • for(i=0; i<n; i++) – strict mai mic!
  • Inițializează maxim/minim cu x[0], NU cu 0
  • Swap necesită variabila temp
  • == pentru comparație, = pentru atribuire
  • (float)suma/n pentru medie reală
  • break la căutare, fără break la numărare
  • Căutare binară = DOAR pe vector sortat
  • Statistici ÎNAINTE de sortare

📋 Cheat Sheet: Formule esențiale

Referință rapidă – selectează și copiază ce ai nevoie
// DECLARARE
int x[100], n;

// CITIRE
cin >> n;
for(int i=0; i<n; i++)
    cin >> x[i];

// AFISARE
for(int i=0; i<n; i++)
    cout << x[i] << " ";

// SUMA + MEDIA
int s = 0;
for(int i=0; i<n; i++)
    s += x[i];
float m = (float)s / n;
// NUMARARE (cate >= 8?)
int c = 0;
for(int i=0; i<n; i++)
    if(x[i] >= 8) c++;

// CAUTARE LINIARA
int poz = -1;
for(int i=0; i<n; i++)
    if(x[i] == cautat) {
        poz = i; break;
    }

// MAXIM
int mx = x[0];
for(int i=1; i<n; i++)
    if(x[i] > mx) mx = x[i];
// MINIM
int mn = x[0];
for(int i=1; i<n; i++)
    if(x[i] < mn) mn = x[i];

// SWAP (interschimbare)
int temp = x[i];
x[i] = x[i+1];
x[i+1] = temp;

// BUBBLE SORT crescator
for(int p=0; p<n-1; p++)
 for(int i=0; i<n-1-p; i++)
  if(x[i] > x[i+1]) {
    int t=x[i];
    x[i]=x[i+1];
    x[i+1]=t;
  }

Exerciții practice

4 nivele de dificultate – alege-l pe al tău!
  • 🟢 Nivel 1: Începător
  • Declară un vector cu 5 numere și afișează-le.
  • Calculează suma și media elementelor.
  •  
  • 🔵 Nivel 2: Intermediar
  • Citește n numere. Afișează câte sunt pare și câte impare.
  • Găsește cel mai mare și cel mai mic număr din vector.
  •  
  • 🟠 Nivel 3: Avansat
  • Citește n numere. Caută o valoare dată și afișează poziția.
  • Sortează vectorul cu Bubble Sort. Afișează înainte și după.
  • 🔴 Nivel 4: Expert (Proiect)
  • Implementează Catalogul de Note complet:
  • Citire note + Afișare formatată
  • Suma + Media + Nr. promovați
  • Nota max și min cu poziție
  • Numărare note de 10
  • Sortare și clasament
  •  
  • ⭐ BONUS Challenge:
  • Adăugă și numele elevilor (vector paralel de string-uri)
  • Implementează căutarea binară pe vectorul sortat
  • Numără interschimbările la Bubble Sort
Testează pe onecompiler.com/cpp – nu ai nevoie de nimic instalat!

Succes la programare!

„Practica face perfectul.”
Vectorii sunt fundamentul programării.
Stăpâniți-i și veți putea rezolva orice problemă!

Sfat: Scrie codul cu mâna ta, nu-l copia.
Greșelile sunt cele mai bune lecții!
Prof. Gurlan Vasile  •  Clasa a VIII-a  •  TIC