Invatare Atomica

Vreau sa construiesc un catalog digital!

Progres lectie:
0%
🎯

Obiectivul lectiei

Ai invatat tablouri, parcurgere, cautare, maxim/minim si sortare. Acum le combini pe toate intr-un proiect real: unCatalog de Notecomplet functional!

Dupa aceasta lectie vei putea:

  • Sa explici progRAMul complet: catalog note elevi
  • Sa aplici pattern-urile pe care le-ai stapanit

Incearca singur!

🛠 CONSTRUIESTE

Construieste catalogul pas cu pas!

Primesti un schelet de program cu locuri marcate // TODO. Completeaza fiecare parte, testeaza, si continua. Nu trebuie sa faci totul dintr-o data!

Pasul 0: Copiaza scheletul programului

Copiaza acest cod pe OneCompiler. Citeste comentariile - ele iti spun exact ce sa faci la fiecare pas.

#include <iostream> using namespace std; int main() { // Constante si declaratii const int MAX = 100; int note[MAX]; int n; // ===== HEADER ===== cout << "===================================" << endl; cout << " CATALOG NOTE ELEVI - Clasa a VIII-a" << endl; cout << "===================================" << endl; // ===== CITIRE ===== cout << "Cate note doresti sa introduci? "; cin >> n; for (int i = 0; i < n; i++) { cout << "Introdu nota " << i + 1 << ": "; cin >> note[i]; } // ===== PASUL 1: AFISARE CATALOG ===== cout << endl << "--- CATALOGUL NOTELOR ---" << endl; cout << " Nr. | Nota" << endl; cout << "-----|------" << endl; // TODO 1: Parcurge tabloul si afiseaza fiecare nota // Format: " 1 | 9" // Foloseste o bucla for si cout // Hint: i+1 pentru numarul de ordine, note[i] pentru valoare // ===== PASUL 2: MEDIA ===== cout << endl << "--- STATISTICI ---" << endl; // TODO 2: Calculeaza suma tuturor notelor // Declara o variabila suma = 0 // Parcurge tabloul si aduna fiecare nota la suma // Afiseaza media: (float)suma / n // ===== PASUL 3: MAXIM SI MINIM ===== // TODO 3: Gaseste nota maxima si nota minima // Initializeaza maxim = note[0] si minim = note[0] // Parcurge de la i=1 si compara cu if // Afiseaza: "Nota maxima: X" si "Nota minima: Y" // ===== PASUL 4: PROMOVATI / NEPROMOVATI ===== // TODO 4: Numara cati elevi au nota >= 5 si cati au nota < 5 // Declara promovati = 0 si nepromovati = 0 // Parcurge tabloul, pentru fiecare nota verifica cu if // Afiseaza rezultatele // ===== PASUL 5: SORTARE DESCRESCATOARE ===== cout << endl << "--- NOTE SORTATE (descrescator) ---" << endl; // TODO 5: Sorteaza tabloul descrescator (Bubble Sort) // Doua bucle for imbricate // Compara note[j] < note[j+1] si interschimba daca e cazul // Apoi afiseaza tabloul sortat // ===== PASUL 6: CAUTARE ===== cout << endl << "--- CAUTARE ---" << endl; // TODO 6: Cauta o nota specifica in tablou // Citeste nota cautata de la tastatura // Parcurge tabloul si numara de cate ori apare // Afiseaza daca a fost gasita si de cate ori return 0; }
▶ Deschide OneCompiler
Pasul 1: Afisarea catalogului
1
Inlocuieste // TODO 1 cu o bucla for care parcurge tabloul de la 0 la n-1 si afiseaza fiecare nota cu numarul ei de ordine. Formatul: " " << i+1 << " | " << note[i]
Blocat? Click pentru solutia Pasului 1
for (int i = 0; i < n; i++) { cout << " " << i + 1 << " | " << note[i] << endl; }

Este exact ca la Lectia 2 (Parcurgere): o bucla for care trece prin fiecare element si il afiseaza. i+1 transforma indexul 0,1,2... in numere naturale 1,2,3...

Pasul 2: Calculul mediei
2
Inlocuieste // TODO 2 cu codul care calculeaza suma notelor si apoi media. Ai nevoie de: o variabila suma = 0, o bucla care aduna note[i] la suma, si un cout care afiseaza (float)suma / n.
!
Atentie: Daca scrii suma / n fara (float), obtii un rezultat intreg (7 in loc de 7.25). De ce? Pentru ca int / int = int in C++. Conversia la float rezolva asta.
Blocat? Click pentru solutia Pasului 2
int suma = 0; for (int i = 0; i < n; i++) { suma = suma + note[i]; } cout << "Media notelor: " << (float)suma / n << endl;

Acesta este pattern-ul "acumulator" de la Lectia 2. Declari o variabila suma initializata cu 0, apoi adaugi fiecare element la ea.

Pasul 3: Nota maxima si minima
3
Inlocuieste // TODO 3 cu codul care gaseste maximul si minimul. Initializeaza maxim = note[0] si minim = note[0], apoi parcurge de la i = 1 si compara fiecare nota.
Blocat? Click pentru solutia Pasului 3
int maxim = note[0]; int minim = note[0]; for (int i = 1; i < n; i++) { if (note[i] > maxim) maxim = note[i]; if (note[i] < minim) minim = note[i]; } cout << "Nota maxima: " << maxim << endl; cout << "Nota minima: " << minim << endl;

Exact ca la Lectia 4: initializam maximul/minimul cu primul element, apoi comparam cu restul. Pornim de la i = 1 (nu 0) fiindca deja am folosit note[0] ca valoare initiala.

Pasul 4: Promovati si nepromovati
4
Inlocuieste // TODO 4 cu codul care numara cati elevi au nota >= 5 (promovati) si cati au nota < 5 (nepromovati). Foloseste doi contori: promovati = 0 si nepromovati = 0.
Blocat? Click pentru solutia Pasului 4
int promovati = 0, nepromovati = 0; for (int i = 0; i < n; i++) { if (note[i] >= 5) promovati++; else nepromovati++; } cout << "Promovati (nota >= 5): " << promovati << " elevi" << endl; cout << "Nepromovati (nota < 5): " << nepromovati << " elev(i)" << endl;

Pattern-ul "numarare conditionata" de la Lectia 2/3. Un contor care creste doar cand conditia este adevarata. Aici avem doua ramuri: if...else.

Pasul 5: Sortare descrescatoare
5
Inlocuieste // TODO 5 cu algoritmul Bubble Sort de la Lectia 5, dar adaptat pentru ordine descrescatoare. Schimba conditia: in loc de note[j] > note[j+1] (crescator), foloseste note[j] < note[j+1] (descrescator). Apoi afiseaza tabloul sortat.
!
Atentie: Sortarea modifica tabloul original! Daca vrei sa pastrezi ordinea originala, fa o copie inainte de sortare. Pentru acest proiect, sortam dupa ce am afisat toate statisticile, deci e OK.
Blocat? Click pentru solutia Pasului 5
// Bubble Sort descrescator for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (note[j] < note[j + 1]) { int temp = note[j]; note[j] = note[j + 1]; note[j + 1] = temp; } } } // Afisare tablou sortat for (int i = 0; i < n; i++) { cout << note[i]; if (i < n - 1) cout << " "; } cout << endl;

Exact algoritmul de la Lectia 5, cu o singura diferenta: conditia note[j] < note[j+1] in loc de >. Asta face sortarea sa mearga de la mare la mic (descrescator).

Pasul 6: Cautarea unei note
6
Inlocuieste // TODO 6 cu codul care citeste o nota de la tastatura, o cauta in tablou si afiseaza de cate ori apare. Atentie: tabloul e deja sortat dupa Pasul 5, dar cautarea liniara functioneaza oricum.
Blocat? Click pentru solutia Pasului 6
int cautata; cout << "Ce nota cauti? "; cin >> cautata; int aparitii = 0; for (int i = 0; i < n; i++) { if (note[i] == cautata) aparitii++; } if (aparitii > 0) cout << "Nota " << cautata << " a fost gasita! (apare de " << aparitii << " ori)" << endl; else cout << "Nota " << cautata << " nu exista in catalog." << endl;

Cautare liniara de la Lectia 3, imbunatatita: in loc sa ne oprim la prima aparitie, numaram TOATE aparitiile. Astfel stim daca nota exista si de cate ori apare.

🌟 PROVOCARE BONUS: Dupa ce ai completat toti cei 6 pasi, ruleaza programul complet cu aceste note de test: 9, 5, 10, 3, 7, 8, 6, 10. Verifica ca output-ul arata ca in preview-ul din sectiunea OBIECTIV!
1

Programul complet: Catalog Note Elevi

Programul complet: Catalog Note Elevi

Acesta este programul finalizat cu toate cele 6 functionalitati. Fiecare sectiune este marcata cu comentarii si referinte la lectia din care provine tehnica folosita.

#include <iostream> using namespace std; int main() { // ===== DECLARATII (Lectia 1: Tablouri) ===== const int MAX = 100; // capacitatea maxima a tabloului int note[MAX]; // tabloul de note int n; // numarul real de note introduse // ===== HEADER ===== cout << "===================================" << endl; cout << " CATALOG NOTE ELEVI - Clasa a VIII-a" << endl; cout << "===================================" << endl << endl; // ===== CITIRE NOTE (Lectia 2: Parcurgere) ===== cout << "Cate note doresti sa introduci? "; cin >> n; cout << endl; // Citim fiecare nota de la tastatura for (int i = 0; i < n; i++) { cout << "Introdu nota " << i + 1 << ": "; cin >> note[i]; } // ===== 1. AFISARE CATALOG (Lectia 2: Parcurgere) ===== cout << endl << "--- CATALOGUL NOTELOR ---" << endl; cout << " Nr. | Nota" << endl; cout << "-----|------" << endl; for (int i = 0; i < n; i++) { cout << " " << i + 1 << " | " << note[i] << endl; } // ===== 2. CALCULUL MEDIEI (Lectia 2: Parcurgere) ===== cout << endl << "--- STATISTICI ---" << endl; int suma = 0; for (int i = 0; i < n; i++) { suma = suma + note[i]; // sau: suma += note[i]; } cout << "Media notelor: " << (float)suma / n << endl; // ===== 3. NOTA MAXIMA SI MINIMA (Lectia 4: Max/Min) ===== int maxim = note[0]; // presupunem ca prima nota e cea mai mare int minim = note[0]; // si cea mai mica for (int i = 1; i < n; i++) { // pornim de la 1! if (note[i] > maxim) { maxim = note[i]; // am gasit o nota mai mare } if (note[i] < minim) { minim = note[i]; // am gasit o nota mai mica } } cout << "Nota maxima: " << maxim << endl; cout << "Nota minima: " << minim << endl; // ===== 4. PROMOVATI / NEPROMOVATI (Lectia 2+3: Numarare) ===== int promovati = 0; int nepromovati = 0; for (int i = 0; i < n; i++) { if (note[i] >= 5) { promovati++; // nota de trecere: 5 sau mai mult } else { nepromovati++; // sub 5: nepromovat } } cout << "Promovati (nota >= 5): " << promovati << " elevi" << endl; cout << "Nepromovati (nota < 5): " << nepromovati << " elev(i)" << endl; // ===== 5. SORTARE DESCRESCATOARE (Lectia 5: Bubble Sort) ===== cout << endl << "--- NOTE SORTATE (descrescator) ---" << endl; // Bubble Sort: compara perechi vecine si interschimba for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { // Pentru DESCRESCATOR: daca nota curenta e MAI MICA // decat urmatoarea, le interschimbam if (note[j] < note[j + 1]) { int temp = note[j]; note[j] = note[j + 1]; note[j + 1] = temp; } } } // Afisam tabloul sortat for (int i = 0; i < n; i++) { cout << note[i]; if (i < n - 1) cout << " "; // spatiu intre note, dar nu dupa ultima } cout << endl; // ===== 6. CAUTARE NOTA (Lectia 3: Cautare liniara) ===== cout << endl << "--- CAUTARE ---" << endl; int cautata; cout << "Ce nota cauti? "; cin >> cautata; int aparitii = 0; for (int i = 0; i < n; i++) { if (note[i] == cautata) { aparitii++; // am gasit nota cautata } } if (aparitii > 0) { cout << "Nota " << cautata << " a fost gasita! (apare de " << aparitii << " ori)" << endl; } else { cout << "Nota " << cautata << " nu exista in catalog." << endl; } return 0; }
▶ Testeaza pe OneCompiler
2

Pattern-urile pe care le-ai stapanit

Pattern-urile pe care le-ai stapanit

Fiecare functionalitate din catalog foloseste un pattern (sablon) pe care l-ai invatat in lectiile anterioare. Iata cum se leaga totul:

Functionalitate Pattern folosit Cod cheie
Citire note Parcurgere + citire cin >> note[i];
Afisare catalog Parcurgere + afisare cout << note[i];
Calculul mediei Acumulator (suma) suma += note[i];
Max si Min Comparatie cu candidat if(note[i] > maxim)
Numarare promovati Contor conditionat if(note[i] >= 5) nr++;
Sortare note Bubble Sort if(note[j] < note[j+1]) swap
Cautare nota Cautare liniara if(note[i] == cautata)

Exercitii practice

Exercitiul 1 (Nivel minim) - Extensia 1: Adauga numele elevilor (tablouri paralele)

Cerinta: Modifica programul catalog pentru a include si numele elevilor. Foloseste doua tablouri: unul de note (int note[100]) si unul de nume (string nume[100]). Cand afisezi catalogul, afiseaza si numele alaturi de nota.

Exemplu output:

Nr. | Elev | Nota
----|---------------|-----
1 | Popescu Andrei| 9
2 | Ionescu Maria | 5
3 | Vasilescu Ion | 10

Indicii:

  • Adauga #include <string> la inceputul programului
  • Declara string nume[MAX]; alaturi de int note[MAX];
  • Cand citesti, citeste mai intai numele cu getline(cin, nume[i]), apoi nota cu cin >> note[i];
  • Atentie: dupa cin >> n, adauga cin.ignore(); ca sa "cureti" buffer-ul inainte de getline
  • Cand sortezi, muta SI numele in paralel cu notele (interschimba ambele tablouri simultan)

Exercitiul 2 (Nivel standard) - Extensia 2: Mai multe materii (preview tablouri 2D)

Cerinta: Extinde catalogul pentru 3 materii (Matematica, Romana, Informatica). Foloseste 3 tablouri paralele de note sau, daca te simti aventuros, un tablou bidimensional int note[MAX][3] unde prima coloana e Matematica, a doua Romana, a treia Informatica.

Exemplu output:

Nr. | Mate | Romana | Info | Media
----|------|--------|------|------
1 | 9 | 7 | 10 | 8.67
2 | 5 | 8 | 6 | 6.33

Indicii (varianta cu 3 tablouri):

  • Declara: int mate[MAX], romana[MAX], info[MAX];
  • Citeste notele pentru fiecare materie in parte
  • Media per elev: (float)(mate[i] + romana[i] + info[i]) / 3
  • Afiseaza tabelul cu toate cele 3 note si media per elev
  • Calculeaza si media generala pe fiecare materie

Indicii (varianta cu tablou 2D - avansata):

  • Declara: int note[MAX][3]; - 3 coloane pentru 3 materii
  • Acces: note[i][0] = Matematica elevului i, note[i][1] = Romana, note[i][2] = Informatica
  • Ai nevoie de doua bucle imbricate: una pentru elevi, una pentru materii

Exercitiul 3 (Nivel performanta) - Extensia 3: Reflectie scrisa - Ce am invatat in acest modul

Cerinta: Scrie o reflectie de minimum 10 randuri in care raspunzi la urmatoarele intrebari:

  1. Care a fost cea mai usoara lectie din modul si de ce? Dar cea mai grea?
  2. Cum ai folosi tablourile intr-un alt context decat notele? Da 2 exemple concrete (ex: temperaturi, scoruri la un joc, preturi produse).
  3. Explica in cuvintele tale ce face Bubble Sort si de ce are nevoie de doua bucle for imbricate. Foloseste o analogie din viata reala.
  4. Daca ai putea adauga o singura functionalitate noua la catalog, ce ai alege si cum ai implementa-o? (descrie in cuvinte, nu trebuie cod)
  5. Ce crezi ca ar fi util sa inveti in continuare dupa acest modul? Ce intrebari ti-au ramas?

Raspunde liber, in propriile cuvinte. Nu exista raspunsuri gresite - important este sa gandesti si sa reflectezi asupra a ceea ce ai invatat.

Cuvinte cheie de folosit: tablou, parcurgere, cautare, maxim/minim, sortare, index, element, bucla for, contor, acumulator, Bubble Sort, interschimbare

Ce ai invatat astazi

  • Ai invatat programul complet: catalog note elevi
  • Acum stii pattern-urile pe care le-ai stapanit