Teorie: Structuri de Date (Tipul Articol / struct)
Definirea tipului struct. Accesarea câmpurilor și operații pe vectori de structuri (util la Subiectul II).
Structuri de Date Neomogene (Tipul Articol / struct)
Până acum, am învățat despre vectori și matrice, care sunt structuri de date omogene (toate elementele au același tip, ex: doar int). Dar ce facem dacă vrem să grupăm date de tipuri diferite care aparțin aceleiași entități logic? (de exemplu, un "Elev" care are un "nume" de tip șir de caractere și o "medie" de tip real).
Aici intervine tipul articol (cunoscut în C/C++ drept struct). O structură grupează mai multe variabile de tipuri diferite sub un singur nume. Componentele structurii se numesc câmpuri (sau membri).
1. Definirea tipului și Declararea variabilelor
Definirea unui tip nou (struct)
Definirea se face de obicei global, deasupra funcției main(). Cuvântul cheie este struct, urmat de numele noului tip și blocurile de câmpuri între acolade. Obligatoriu se pune ; la finalul acoladei!
struct Elev {
char nume[50];
int varsta;
float medie;
}; // Nu uita punctul și virgula!Declararea variabilelor
Odată definit tipul Elev, îl putem folosi ca pe orice alt tip de date standard (cum ar fi int).
// Declarăm o singură variabilă de tip Elev
Elev e1, e2;
// Putem declara și un VECTOR de structuri (foarte util la Bac!)
Elev clasa[30]; // Un vector cu 30 de elevi2. Accesarea câmpurilor (Operatorul punct)
Pentru a citi, modifica sau afișa un câmp specific dintr-o structură, folosim operatorul punct (.): nume_variabila.nume_camp.
Variabilă simplă
Elev e1;
// Atribuire valori
e1.varsta = 18;
e1.medie = 9.50;
strcpy(e1.nume, "Popescu Ion");
// Citire de la tastatură
cin >> e1.varsta;
cin.get();
cin.getline(e1.nume, 50);Vector de structuri
Pentru vectori, precizăm mai întâi indexul din vector, apoi folosim punctul pentru câmp: v[i].camp
Elev clasa[30];
// Accesăm media primului elev
clasa[0].medie = 10;
// Afișăm vârsta elevului de pe poziția i
cout << clasa[i].varsta;3. Exemplu practic: Găsirea elevului cu media maximă
int n;
Elev clasa[100];
cin >> n;
// Citirea datelor (simplificată)
for(int i=0; i<n; i++) {
cin >> clasa[i].nume >> clasa[i].medie;
}
// Căutarea maximului
float max_medie = clasa[0].medie;
int poz_max = 0;
for(int i=1; i<n; i++) {
if(clasa[i].medie > max_medie) {
max_medie = clasa[i].medie;
poz_max = i; // Reținem poziția elevului eminent
}
}
cout << "Cel mai bun elev este " << clasa[poz_max].nume << " cu media " << max_medie;Subiectul 2, Exercițiul 1 la Bacalaureat
- Tipul de date
structapare garantat la Subiectul II, Exercițiul 1 (varianta pe variante). De obicei cerința sună așa: "Scrieți o secvență de instrucțiuni pentru a accesa și modifica..." sau "Ce se va afișa în urma executării secvenței?". - Atribuirea directă între structuri: Spre deosebire de tablouri, structurile de același tip pot fi atribuite direct cu operatorul
=.e1 = e2; // Copiază automat TOATE câmpurile din e2 în e1 - Structuri imbricate: Un câmp al unei structuri poate fi de tipul altei structuri! De exemplu, structura
Elevar putea avea un câmpdata_nasteriide tipulData. În acest caz vom folosi operatorul punct de două ori:e1.data_nasterii.an.