InfoBook.ro ← Harta anului
Modul 11a · Tipul struct (C++)
Modul 11a · Suport BAC C++ · echivalentul POO

Grupează datele: tipul struct

În Python ai învățat clasa — date + acțiuni la un loc. În C++, mecanismul care grupează mai multe date de tipuri DIFERITE sub un singur nume este struct. E cărămida cu care descrii lucruri reale: un elev, un punct, o carte.

🎯 Obiectiv 1Înțelegi de ce grupăm date neomogene și declari un struct corect.
🎯 Obiectiv 2Accesezi câmpurile cu operatorul punct: e.varsta, v[2].nume.
🎯 Obiectiv 3Folosești vectori de structuri și structuri imbricate — și rezolvi grile de BAC.
1

De ce ai nevoie de struct?

Vrei să reții date despre un ELEV: numele, vârsta, clasa, media. Sunt de tipuri diferite — cum le ții împreună?

😟 Fără struct — variabile separate

1char nume[51];
2int varsta, clasa;
3float media;

Datele unui elev, împrăștiate în patru variabile fără nicio legătură între ele. Pentru 30 de elevi ai avea nevoie de vectori paraleli — greu de ținut sincronizați.

😌 Cu struct — un singur tip

1struct elev {
2 char nume[51];
3 int varsta, clasa;
4 float media;
5};
6elev v[30]; // un vector, elevi întregi

Un elev = o „cutie" cu toate datele lui. Muți un elev întreg dintr-o mișcare.

Definiția din programă: o structură de date neomogene (un struct) este o colecție de informații de tipuri DIFERITE, grupate sub un singur nume. Fiecare informație din structură se numește câmp (sau membru).
2

Sintaxa — declararea structurii și a variabilei

Doi pași: (1) definești TIPUL nou (structura), (2) declari VARIABILE de acel tip. Trei forme, toate corecte:

Forma 1 — tip, apoi variabile (recomandat)

1struct elev {
2 char nume[51];
3 int varsta;
4 float media;
5}; // ; OBLIGATORIU după }
6elev e1, e2, v[30];

Forma 2 — variabile lângă definiție

1struct elev {
2 char nume[51];
3 int varsta;
4 float media;
5} e1, v[30]; // direct aici
Două greșeli care pică mulți la BAC:
  • uiți ; după } → eroare de compilare;
  • scrii int e.varsta; în loc de int varsta; — câmpurile se declară doar ÎN interiorul structurii.
Cum arată o declarare corectă (din grile):
  • struct { int a, b; } x;
  • struct P { int a, b; }; apoi P x;
  • int x.a; float x.b; — greșit, câmpurile nu se declară cu punct în afară.
3

Accesul cu punct — laboratorul viu

Ca să ajungi la un câmp, scrii variabila.câmp. Completează câmpurile, apoi apasă o expresie și vezi ce „scoate":

✎ scrie în câmpuri — se actualizează live

Apasă o expresie C++:

apasă o expresie 👆 — câmpul se aprinde și îi vezi valoarea
cout << e.varsta; // citește câmpul
e.media = 9.5; // scrie în câmp
cin >> e.varsta; // citește de la tastatură
Reguli de aur ale punctului: cin >> e și cout << e pe TOATĂ structura NU merg — mergi câmp cu câmp. Iar atribuirea între structuri de același tip merge întreagă: e1 = e2; copiază toate câmpurile deodată!
4

Vector de structuri — tabelul de elevi

Un elev v[30] e un TABEL: fiecare rând e un elev întreg. Accesezi cu v[i].câmp. Apasă expresiile:

apasă o expresie 👆 — rândul și celula se aprind
1// cel mai bun elev din vector
2int pmax = 0;
3for (int i = 1; i < n; i++)
4 if (v[i].media > v[pmax].media) pmax = i;
5cout << v[pmax].nume; // exact ca min/max pe numere (M04)!
Recunoști șablonul? E fix „maximul dintr-un vector" din Modulul 04 — doar că acum comparăm după UN CÂMP (v[i].media) și afișăm un ALT câmp (v[pmax].nume). Structura ține datele legate, tu alegi criteriul.
5

Program complet, pas cu pas: citește elevii și află campionul

Flowchart + cod + exemplu, rulate în paralel. Citim n elevi de la „tastatură" (câmp cu câmp!) și afișăm elevul cu media maximă.

📥 Date de intrare (ce „tastăm"): n, apoi pentru fiecare elev — numele și media

DA NU START citește n i ← 0; pmax ← 0 i < n ? citește v[i].nume, v[i].media dacă v[i].media > v[pmax].media atunci pmax ← i i ← i + 1 scrie v[pmax].nume STOP
Variabile
n
i
pmax
Ecran
 
Apasă „Pas" — urmărește cum fiecare elev intră în tabel câmp cu câmp. 👣
Citirea unui struct = câmp cu câmp: cin >> v[i].nume >> v[i].media; — fiecare câmp e citit separat, exact ca o variabilă obișnuită. Restul e șablonul maximului din Modulul 04, aplicat pe v[i].media.
6

Structuri imbricate — struct în struct

Un câmp poate fi el însuși un struct. Exemplu: un obiectiv turistic are o dată de început și una finală, fiecare cu zi și lună.

1struct data {
2 int zi, luna;
3};
4struct obiectiv {
5 int cod;
6 data inceput, final; // struct în struct!
7} ob;
ob : obiectiv
int cod108
data inceput
int zi15
int luna6
data final
int zi22
int luna6
Accesul se lanțuiește cu puncte: ziua de început e ob.inceput.zi (= 15), luna finală e ob.final.luna (= 6). Cobori nivel cu nivel, exact ca la modelele mixte pe care le vei revedea în clasa a X-a.
7

Clasa Python ↔ struct C++ — tabelul-oglindă

Aceeași idee, „a grupa date", în cele două limbaje. Ai făcut clasa la Modulul 11; iată corespondența.

Concept🐍 Python — class⚙ C++ — struct
definirea tipuluiclass Elev:struct elev { … };
câmpuri (date)self.varsta = vint varsta;
creare obiect / variabilăe = Elev("Ana", 20)elev e;
acces la câmpe.varstae.varsta
„colecție" de obiectelista = [Elev(...), ...]elev v[30];
metode (acțiuni)def promovat(self): …de obicei funcții separate care primesc structura
Diferența cheie: în Python, clasa ține date ȘI metode împreună. În C++, la nivelul acesta, structul ține doar DATELE — pe care le prelucrezi cu funcții separate (Modulul 05a: transmiterea prin referință & lasă funcția să modifice structura direct). E același spirit — „grupăm ce ține împreună".
8

Grile de BAC — struct

Cinci grile în stilul examenului. Alege și vezi imediat de ce.

9

Fișa de sinteză

Tipul struct, condensat.

struct = grupează date NEOMOGENE (tipuri diferite) sub un nume; fiecare dată = un câmp/membru.
Declarare: struct nume { tip câmp; … }; apoi variabile: nume v1, vect[n]; — ; obligatoriu după }.
Acces: variabila.câmp (e.varsta) · la vector: v[i].câmp · imbricat: ob.inceput.zi.
Punctul: cin/cout merg CÂMP cu câmp, nu pe toată structura; dar e1 = e2 copiază tot.
Vector de structuri: șabloanele de la vectori (M04) merg identic — compari după un câmp, afișezi altul.
Legătura cu POO: structul C++ = ruda „doar cu date" a clasei Python din Modulul 11.
Exersează pe pbinfo.ro — categoria „Structuri":
grile · ușor

Exerciții — Structuri

Setul de grile de tip BAC: declarări corecte, acces cu punct, atribuiri.

Vezi pe pbinfo.ro →
problemă · ușor

Aniversari

Structuri cu date calendaristice — imbricare zi/lună, exact ca obiectivul turistic.

Caută pe pbinfo.ro →
10

📌 Temă pentru acasă

Trei programe în C++ cu struct. Scrie-le, compilează-le, testează-le.

  1. Elevul citit de la tastatură. Definește struct elev { char nume[30], prenume[30]; int varsta; float media; }; Citește un elev de la tastatură (câmp cu câmp!) și afișează-l pe o singură linie.
  2. Cel mai bun din școală. Citește n (≤ 100), apoi n elevi cu nume, prenume, clasă și media generală. Afișează elevul cu media cea mai mare — folosește șablonul maximului din secțiunea 4.
  3. Definește structura (stil BAC). Se dau expresiile t.A.x, t.B.y, t.C.y (coordonatele a trei vârfuri A, B, C ale unui triunghi). Scrie definiția unei structuri cu eticheta triunghi și declară variabila t. (Indiciu: ai nevoie de un struct punct{ x, y } în interior.)
Provocare bonus (grilă BAC). Pentru struct carte { char titlu[20]; int nr_pag; } x, y; și strcpy(x.titlu, "Ion"); strcpy(y.titlu, "Mara"); — ce afișează cout << x.titlu[1] << y.titlu[2];? (Gândește-te la ce literă e pe fiecare poziție.)
← anteriorModul 11 · Introducere în POO urmează →Modul 12 · Interfețe grafice (Tkinter)