Invatare Atomica ⭐ Extra / Aprofundare

Vreau sa lucrez cu liste de date!

⚠️ Continut extracurricular — sintaxa C++ pentru tablouri depaseste programa de gimnaziu OMEN 3393/2017. Recomandat pentru aprofundare si pregatire liceu.

Progres lectie:
0%
🎯

Obiectivul lectiei

Imagineaza-ti ca esti profesorul clasei si trebuie sa stochezi notele a 30 de elevi. Cum faci?

Dupa aceasta lectie vei putea:

  • Sa explici ce este un tablou si de ce ai nevoie de el
  • Sa explici sintaxa declararii
  • Sa scrii citire si scriere prin index
  • Sa aplici accesare in afara limitelor = pericol
  • Sa aplici afiseaza notele si calculeaza media

Incearca singur!

🎯 INCEARCA

Testeaza inainte sa inveti!

Nu trebuie sa intelegi totul acum. Doar copiaza, ruleaza si observa ce se intampla.

Misiunea ta (5 minute):
1
Copiaza codul de mai jos si lipeste-l pe OneCompiler. Apasa Run.
#include <iostream> using namespace std; int main() { int note[5] = {9, 7, 10, 8, 6}; cout << "Prima nota: " << note[0] << endl; cout << "A doua nota: " << note[1] << endl; cout << "A treia nota: " << note[2] << endl; return 0; }
▶ Deschide OneCompiler
2
Programul afiseaza doar primele 3 note. Modifica-l sa afiseze si nota 4 si nota 5. Ce numere pui intre parantezele patrate?
3
Acum incearca ceva riscant: adauga linia cout << note[5]; si ruleaza. Ce observi? De ce acel numar ciudat?
4
Schimba valoarea notei a treia: adauga linia note[2] = 4; inainte de cout-uri. Ruleaza din nou. Ce s-a schimbat?
🌟 BONUS: Incearca sa adaugi o linie care calculeaza note[0] + note[1] si afiseaza rezultatul.
Blocat la pasul 2? Click aici pentru un indiciu

Uita-te la pattern: prima nota e note[0], a doua e note[1], a treia e note[2].

Observi? Numerele cresc: 0, 1, 2... Deci a patra nota ar fi note[3], iar a cincea?

Daca tabloul are 5 elemente, numerele merg de la 0 la 4 (nu de la 1 la 5!).

Blocat la pasul 3? Click aici

Tabloul are 5 elemente, numerotate 0, 1, 2, 3, 4. Deci note[5] nu exista!

C++ nu verifica limitele automat, asa ca note[5] va citi o zona de memorie de dupa tablou. Vei vedea un numar aleatoriu (ce s-a nimerit acolo). In programe mai mari, asta poate provoca rezultate gresite sau chiar oprirea programului. Aceasta clasa de erori se numeste undefined behavior — retine ca indexul valid merge de la 0 la N-1.

Blocat la pasul 4? Click aici

Scrie note[2] = 4; pe linia de dupa declaratia tabloului (dupa linia cu {9, 7, 10, 8, 6}).

Observa ca "A treia nota" se schimba din 10 in 4. Ai modificat o valoare din tablou!

1

Ce este un tablou si de ce ai nevoie de el?

Ce este un tablou si de ce ai nevoie de el?

Un tablou (in engleza: array) este o colectie de valori de acelasi tip, stocate una langa alta in memorie, pe care le accesezi printr-un singur nume si un numar de pozitie (numit index).

Fara tablouri, daca ai 100 de valori, ai nevoie de 100 de variabile separate. Cu un tablou, ai nevoie de o singura variabila care le contine pe toate.

📁 Analogie: Sirul de sertare

Imagineaza-ti un dulap cu 5 sertare asezate unul langa altul. Dulapul are un singur nume (de ex. "Dulapul cu Note"), iar sertarele sunt numerotate de la stanga la dreapta: sertarul 0, sertarul 1, sertarul 2, sertarul 3, sertarul 4. Ca sa ajungi la un sertar, spui: "Dulapul cu Note, sertarul 3".

La fel in C++: tabloul are un singur nume (de ex. note), iar fiecare element are un index (de ex. note[3]). Sertarele sunt aliniate orizontal, la fel ca elementele tabloului in memorie — primul sertar este cel mai din stanga (index 0).

2

Sintaxa declararii

Sintaxa declararii

Ca sa creezi un tablou, ai nevoie de 3 informatii: ce tip de date va contine, cum se numeste, si cate elemente incap in el.

Formula generala
tip_date nume[dimensiune];
Exemple practice
// Tablou gol (valorile sunt nedefinite!) int note[30]; // Tablou cu valori initiale int note[5] = {9, 7, 10, 8, 6}; // Tablou de numere cu zecimale (temperaturi) float temp[7] = {22.5, 23.1, 19.8, 21.0, 25.3, 20.7, 18.9}; // Tablou de caractere (vocalele) char vocale[5] = {'a', 'e', 'i', 'o', 'u'}; // Dimensiunea se deduce automat din valorile date int zile[] = {31, 28, 31, 30}; // are 4 elemente
3

Citire si scriere prin index

Citire si scriere prin index

Folosim nume[index] atat pentru a citi o valoare, cat si pentru a o modifica. Indexul e un numar intreg, incepand de la 0.

Citire (obtinem valoarea)
int x[5] = {2, 4, 6, 8, 10}; cout << x[0]; // Afiseaza: 2 (primul element) cout << x[2]; // Afiseaza: 6 (al treilea element) cout << x[4]; // Afiseaza: 10 (ultimul element) int suma = x[0] + x[1]; // suma = 2 + 4 = 6
Modificare (schimbam valoarea)
// Inainte: x = {2, 4, 6, 8, 10} x[2] = 99; // Dupa: x = {2, 4, 99, 8, 10} cout << x[2]; // Acum afiseaza: 99 (nu mai e 6!)
4

Accesare in afara limitelor = pericol!

Accesare in afara limitelor = pericol!

In C++, daca folosesti un index in afara intervalului valid (0 pana la N-1), programul nu te opreste. Nu vei primi nicio eroare la compilare. Dar la rulare, se intampla lucruri rele.

De ce? Pentru ca C++ citeste/scrie in memoria calculatorului exact unde ii spui tu. Daca ii spui un index gresit, el va accesa o zona de memorie care nu apartine tabloului tau.

5

Afiseaza notele si calculeaza media

Afiseaza notele si calculeaza media

Acum punem totul impreuna: declarare, acces cu for, si calcul. Urmareste fiecare linie!

Program complet - ruleaza-l!
#include <iostream> using namespace std; int main() { // Pasul 1: Declaram tabloul cu 5 note int note[5] = {9, 7, 10, 8, 6}; int suma = 0; // Pasul 2: Parcurgem tabloul cu for for (int i = 0; i < 5; i++) { cout << "Nota " << i + 1 << ": " << note[i] << endl; suma = suma + note[i]; } // Pasul 3: Calculam media float media = (float)suma / 5; cout << "Suma: " << suma << endl; cout << "Media: " << media << endl; return 0; }
▶ Ruleaza pe OneCompiler

Exercitii practice

Exercitiul 1 (Nivel minim) - Analiza tablourilor

Raspunde la urmatoarele intrebari despre tablouri:

  1. Avem tabloul int note[5] = {9, 7, 10, 8, 6}; - Care este valoarea note[2]? Dar note[4]? Care este indexul valorii 7?
  2. De ce este mai eficient sa stocam 30 de note intr-un tablou int note[30] decat in 30 de variabile separate? Da un exemplu concret de cod care devine mai simplu.
  3. Ce se intampla daca incercam sa accesam note[5] in tabloul de mai sus? De ce nu da compilatorul eroare? De ce este asta periculos?

Raspunde numerotat: 1. ... 2. ... 3. ...

Vezi rezolvarea

1. note[2] = 10 (al treilea element, index incepe de la 0). note[4] = 6 (ultimul element).

2. Valoarea 7 se afla la indexul 0 (note[0] = 7).

3. Cu int note[30] putem folosi o bucla for ca sa prelucram toate cele 30 de valori in cateva linii: for(int i=0;i<30;i++) cout<<note[i];. Cu 30 de variabile separate ar trebui sa scriem 30 de linii de cod doar pentru afisare, si la fel pentru citire sau calculul mediei.

4. Tabloul are indicii valizi 0-4, deci note[5] este in afara limitelor. Compilatorul nu da eroare pentru ca C++ nu verifica limitele la compilare - accesul se face direct in memorie, la adresa calculata. La rulare, note[5] citeste o valoare aleatorie (orice s-a intamplat sa fie acolo in memorie), ceea ce e periculos: programul poate afisa date gresite sau chiar se poate bloca (crash).

Exercitiul 2 (Nivel standard) - Programeaza cu tablouri

Cerinta: Scrie un program C++ care declara un tablou cu temperaturile din fiecare zi a saptamanii (7 valori), apoi afiseaza fiecare temperatura cu numele zilei si calculeaza temperatura medie.

Exemplu output:

Luni: 22 grade
Marti: 25 grade
...
Duminica: 19 grade
Temperatura medie: 21.7 grade

Indicii:

  • Declara tabloul cu float temp[7] = {...};
  • Poti folosi un al doilea tablou de string-uri pentru zilele saptamanii, sau pur si simplu afisa manual fiecare zi
  • Foloseste o bucla for pentru a calcula suma, apoi imparte la 7
Vezi rezolvarea

Rezolvare:

  1. Declaram tabloul de temperaturi si un tablou de nume ale zilelor: float temp[7] = {22, 25, 19, 30, 28, 21, 18}; si string zile[7] = {"Luni","Marti","Miercuri","Joi","Vineri","Sambata","Duminica"};
  2. Parcurgem cu for(int i=0;i<7;i++) si afisam zile[i] << ": " << temp[i] << " grade".
  3. In aceeasi bucla adunam suma += temp[i];, iar dupa bucla calculam media: float media = suma/7; (aici 163/7 ≈ 23.3 grade) si o afisam.

Structura codului: declari tabloul, o bucla for care afiseaza si acumuleaza, apoi un singur cout final cu media.

Exercitiul 3 (Nivel performanta) - Cod cu doua tablouri si raport

Cerinta: Scrie un program C++ care primeste notele a 5 elevi in doua materii (matematica si romana) stocate in doua tablouri separate. Programul trebuie sa:

  1. Afiseze tabelul: Elev 1: Mate=9, Romana=8 (etc.) pentru fiecare elev
  2. Calculeze si afiseze media fiecarei materii
  3. Afiseze numele materiei cu media mai mare (sau "Egalitate!" daca sunt egale)

Exemplu output:

Elev 1: Mate=9, Romana=8
Elev 2: Mate=7, Romana=10
Elev 3: Mate=8, Romana=9
Elev 4: Mate=10, Romana=7
Elev 5: Mate=6, Romana=8
Media Matematica: 8.00
Media Romana: 8.40
Materia cu media mai mare: Romana

Indicii:

  • Declara doua tablouri: int mate[5] = {...}; si int romana[5] = {...};
  • Parcurge cu o singura bucla for si acceseaza mate[i] si romana[i] in acelasi pas
  • Calculeaza sumele separat, apoi imparte la 5 folosind float pentru medie
  • Compara cele doua medii cu if/else si afiseaza mesajul corespunzator

Concepte aplicate: doua tablouri paralele, acces simultan cu acelasi index, comparatie de medii

Vezi rezolvarea

Schita de rezolvare (nivel performanta - nu se da programul complet):

  1. Declara doua tablouri paralele: int mate[5], romana[5]; si citeste-le sau initializeaza-le direct.
  2. O singura bucla for(int i=0;i<5;i++) in care afisezi "Elev "<<i+1<<": Mate="<<mate[i]<<", Romana="<<romana[i] si acumulezi doua sume separate.
  3. Dupa bucla, calculeaza cele doua medii cu cast la float.
  4. Compara mediile cu if/else if/else si afiseaza materia castigatoare sau "Egalitate!".

Capcane: uitarea castului la float da o medie trunchiata (intreaga); folosirea a doua bucle separate in loc de una singura merge, dar ideea lectiei e accesul simultan mate[i] si romana[i] cu acelasi index.

Criterii de evaluare: tablourile paralele sunt accesate cu acelasi index; mediile sunt numere reale corect calculate; comparatia trateaza si cazul de egalitate; formatul de afisare respecta cerinta.

Ce ai invatat astazi

  • Ai invatat ce este un tablou si de ce ai nevoie de el
  • Acum stii sintaxa declararii
  • Ai descoperit citire si scriere prin index
  • Ai explorat accesare in afara limitelor = pericol
  • Ai inteles afiseaza notele si calculeaza media

Vrei mai mult?

Provocare: Declara int caseta[6] cu 6 valori diferite alese de tine. Fara nicio bucla for, scrie cod care interschimba elementul de pe pozitia 0 cu cel de pe pozitia 5, folosind o variabila temporara (int temp = caseta[0]; etc.), apoi afiseaza tot tabloul ca sa verifici schimbarea.

De gandit: Python si Java opresc programul cu eroare daca accesezi un index in afara tabloului. C++ nu face asta - lasa programul sa citeasca orice zona de memorie ii ceri. De ce ar alege un limbaj sa NU verifice limitele, cand riscul e exact cel descris la Atomul 4?

Deschidere: Accesarea unui index in afara tabloului sta la baza unei clase intregi de vulnerabilitati numite buffer overflow - un program scrie date dincolo de zona alocata si strica alta informatie din memorie. Multe atacuri informatice reale exploateaza exact acest defect, motiv pentru care limbajele moderne (Rust, Java) verifica automat limitele.

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →