Teoriechevron_rightStructuri de Date (Tipul Articol / struct)

Teorie: Structuri de Date (Tipul Articol / struct)

Definirea tipului struct. Accesarea câmpurilor și operații pe vectori de structuri (util la Subiectul II).

Nivel: Mediuschedule 35 min

data_objectStructuri 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).

design_services1. 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 elevi

ads_click2. 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;

code3. 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;

warningSubiectul 2, Exercițiul 1 la Bacalaureat

  • Tipul de date struct apare 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 Elev ar putea avea un câmp data_nasterii de tipul Data. În acest caz vom folosi operatorul punct de două ori: e1.data_nasterii.an.
syncSe încarcă statusul...