Sari la conținut
Atestia
Înapoi la teorie

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ă
  1. Declarația și accesul la câmpuri
  2. Tehnica 1 — Vector de structuri, sortat după un câmp
  3. Tehnica 2 — Câmpul calculat: valoarea după care sortezi
  4. Tehnica 3 — Structura ca parametru: puncte și distanțe
  5. Tehnica 4 — Funcție care returnează o structură
  6. Greșeli care se repetă
  7. Unde exersezi mai departe
  8. 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

C++
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, ca int sau double. Declarația se scrie înainte de main ș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};.

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:

C++
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:

C++
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 = 0

Acelaș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.

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:

C++
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.

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:

C++
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 de 169/84, iar numitorii cresc până depășesc tipul.
  • long long pentru produse. Doi numitori de 9 cifre înmulțiți nu încap în int, 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ă.

Greșeli care se repetă

  • Vectori paraleli în loc de struct câ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 de c.mi)
  • Împărțire întreagă la fracții — (double) uitat
  • Ordinea citirii diferită de cea a câmpurilor — 20 45 6 din fișier înseamnă 06:45:20 când câmpurile sunt sec, mi, ora
  • == între numere reale și abs în loc de fabs
  • Fracția sumă nereducută și int acolo unde produsul cere long 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 rezolvate8 programare