Teorie
Date structurate (struct) în C++ la atestatul de informatică — fracții, numere complexe, puncte, timp
Tipul struct la atestat: declararea și accesul la câmpuri, câmpul calculat pentru sortare, structura ca parametru și ca rezultat al unei funcții (suma fracțiilor, a numerelor complexe), punctele din plan și momentele de timp — cu problemele de atestat în care apar.
6
minute de citit
8
secțiuni
8
probleme rezolvate legate
Actualizat pe .
Pe această pagină
- Declarația și accesul la câmpuri
- Tehnica 1 — Vector de structuri, sortat după un câmp
- Tehnica 2 — Câmpul calculat: valoarea după care sortezi
- Tehnica 3 — Structura ca parametru: puncte și distanțe
- Tehnica 4 — Funcție care returnează o structură
- Greșeli care se repetă
- Unde exersezi mai departe
- Toate problemele din această categorie
Când o problemă spune „folosind date structurate” sau îți dă direct o declarație de tipul
struct punct { float x, y; };, ea cere un singur lucru: valorile care țin de același obiect să
stea împreună. Numele elevului lângă media lui, numărătorul lângă numitor, partea reală lângă cea
imaginară.
Cele opt probleme din sesiunile Dolj 2026 și Bucureşti 2020 folosesc struct în trei feluri: ca
element al unui vector care se sortează, ca parametru al unui subprogram și ca rezultat
returnat de el. Pagina le ia pe rând.
Declarația și accesul la câmpuri
struct Elev {
char nume[30];
double media;
}; // punct si virgula obligatoriu dupa acolada
Elev e[30]; // vector de structuri
cin >> e[i].nume >> e[i].media;struct Elev { … };definește un tip nou, caintsaudouble. Declarația se scrie înainte demainși de subprogramele care o folosesc.- Câmpurile se accesează cu punct:
e[i].media,c.ora,P.x. - O structură se atribuie dintr-odată:
aux = e[i]copiază toate câmpurile. Cu vectorii nu merge. - Se poate inițializa direct:
punct O = {0, 0};.
Exersează pe subiecte reale
Tehnica 1
Vector de structuri, sortat după un câmp
Motivul pentru care enunțurile cer struct se vede la sortare. Cu numele într-un vector și mediile
în altul, la fiecare interschimbare trebuie mutați amândoi, sincronizat — o singură scăpare și
elevii ajung cu mediile altora. Cu struct, elevul e un singur element, care se mută întreg:
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (e[j].media > e[i].media) { // > descrescator, < crescator
Elev aux = e[i]; // se muta structura intreaga
e[i] = e[j];
e[j] = aux;
}Comparația se face pe un câmp, interschimbarea pe toată structura. Algoritmul de sortare e explicat pe larg la algoritmii de sortare.
Exersează pe subiecte reale
Tehnica 2
Câmpul calculat: valoarea după care sortezi
Fracțiile nu se pot sorta după numărător sau după numitor: 7/(-2) și 9/(-3) au numărători
apropiați, dar valori foarte diferite. Se sortează după valoarea lor — care se calculează o
dată, la citire, și se păstrează într-un câmp în plus:
struct Fractie {
int a, b; // datele originale
double valoare; // calculata la citire, folosita la sortare
};
fr[i].valoare = (double)fr[i].a / fr[i].b; // fara (double): 1/4 = 0Același tipar la numerele complexe sortate după modul (modul = sqrt(a*a + b*b)). Câmpul calculat
e redundant ca informație, dar scutește recalcularea la fiecare comparație și ține rezultatul lângă
datele din care a ieșit.
Exersează pe subiecte reale
Tehnica 3
Structura ca parametru: puncte și distanțe
Subprogramele cerute la a) primesc adesea structuri: distanta(punct A, punct B), timp(clipa c).
Structura se transmite ca orice variabilă — o singură valoare, cu toate câmpurile în ea:
struct punct { float x, y; };
float distanta(punct A, punct B) {
float dx = A.x - B.x, dy = A.y - B.y;
return sqrt(dx * dx + dy * dy); // #include <cmath>
}Formulele de geometrie care apar:
| Cerința | Formula |
|---|---|
| distanța dintre două puncte | √((xA − xB)² + (yA − yB)²) |
punctul e pe cercul de centru O și rază r |
distanta(O, P) == r — cu toleranță, vezi mai jos |
aria dreptunghiului cu diagonala PQ, laturi paralele cu axele |
fabs(P.x - Q.x) * fabs(P.y - Q.y) |
O altă cerință care se rezolvă prin transformarea structurii într-un singur număr: momentul cel
mai târziu dintr-o listă hh:mm:ss. Comparând câmp cu câmp, ușor se greșește ordinea; transformat
în secunde de la miezul nopții (ora * 3600 + mi * 60 + sec), devine o simplă căutare de maxim.
Exersează pe subiecte reale
Tehnica 4
Funcție care returnează o structură
Suma a două fracții e tot o fracție; suma a două numere complexe e tot un număr complex. Funcția întoarce o structură, construită câmp cu câmp:
fractie suma(fractie f, fractie g) {
fractie r;
r.x = f.x * g.y + g.x * f.y; // a/b + c/d = (ad + cb) / bd
r.y = f.y * g.y;
long long d = cmmdc(r.x, r.y);
r.x /= d; // suma adusa la forma ireductibila
r.y /= d;
return r;
}Suma mai multor valori se acumulează ca la numere, cu s = suma(s, t) — doar că elementul neutru e
o structură: 0/1 la fracții, 0 + 0i la numerele complexe.
Trei detalii care decid rezultatul:
- Suma se reduce după fiecare adunare prin c.m.m.d.c.;
altfel ieși cu
845/420în loc de169/84, iar numitorii cresc până depășesc tipul. long longpentru produse. Doi numitori de 9 cifre înmulțiți nu încap înint, iar depășirea nu dă nicio eroare — doar un rezultat greșit.- La complexe, părțile se adună separat: reală cu reală, imaginară cu imaginară.
Exersează pe subiecte reale
Greșeli care se repetă
- Vectori paraleli în loc de
structcând enunțul cere date structurate - Interschimbarea unui singur câmp la sortare — datele se desperechează
- Lipsa
;după acolada declarației — eroare de compilare greu de citit - Câmpuri redenumite față de declarația din enunț (
c.minîn loc dec.mi) - Împărțire întreagă la fracții —
(double)uitat - Ordinea citirii diferită de cea a câmpurilor —
20 45 6din fișier înseamnă06:45:20când câmpurile suntsec, mi, ora ==între numere reale șiabsîn loc defabs- Fracția sumă nereducută și
intacolo unde produsul cerelong long - Diagonala cea mai lungă luată drept aria cea mai mare — nu sunt același lucru
Mai departe
Unde exersezi mai departe
Orice problemă cu „obiecte” care au mai multe proprietăți — elevi cu nume și medii, produse cu preț
și cantitate — se poate rescrie cu struct. Un exercițiu bun: ia o problemă de
sortare rezolvată cu vectori paraleli și rescrie-o cu un vector de
structuri.
Pe pbinfo.ro găsești probleme cu structuri și evaluator automat.
Toate problemele din această categorie
Fiecare are rezolvare completă în C++, explicată pas cu pas.
8Arată toate problemele rezolvateAscunde lista8 programare
- Dreptunghiul de arie maximă determinat de două puncte (struct punct: distanta și arie)
- Elevii ordonați descrescător după medie, folosind date structurate
- Modulele numerelor complexe dintr-un fișier, afișate în ordine descrescătoare
- Momente ale zilei în format hh:mm:ss, cu tipul struct clipa (subprogramul timp)
- Punctele aflate pe cercul cu centrul în origine și raza r (struct punct, subprogramul distanta)
- Suma fracțiilor ireductibile (struct fractie: cmmdc și suma)
- Suma numerelor complexe cu modul întreg (struct complexi: modul și suma)
- Să se ordoneze crescător fracţiile, afişând valorile zecimale ale lor
Alte pagini de teorie