Tipul înregistrare (struct)
Ideile de bază pe scurt și, unde există, exercițiile din subiectele de BAC care le verifică. Lecția completă, animată, cu grile și exerciții corectate, e în aplicația Tomomi.
Pe scurt
Sintaxă: declararea și folosirea unui struct
Tipul se declară o dată (atenție la punctul și virgula final), variabila după aceea:
struct Elev {
int nota;
int varsta;
};
Elev e;
cin >> e.nota >> e.varsta;
cout << e.nota;
Capcana: tipul nu este variabilă
Elev este TIPUL, e este variabila. Elev.nota = 9; nu compilează, iar cin >> e; nu are sens: citirea și afișarea se fac întotdeauna câmp cu câmp. Și nu uita punctul și virgula de după acolada care închide struct - lipsa lui dă o eroare de compilare greu de citit.
Șablon: citirea unui tablou de înregistrări
Indicele alege fișa, punctul alege câmpul:
Elev v[51];
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> v[i].nota >> v[i].varsta;
}
Capcana: v[i].nota, nu v.nota[i]
v este un tablou DE înregistrări, deci indicele vine primul: v[i].nota. Scrierea v.nota[i] ar cere ca v să fie o înregistrare al cărei câmp nota este tablou - exact pe dos față de declarație.
Șablon: maximul după un câmp
Reții POZIȚIA, ca să poți răspunde apoi cu orice câmp al aceleiași fișe:
int poz = 0;
for (int i = 1; i < n; i++) {
if (v[i].nota > v[poz].nota) {
poz = i;
}
}
cout << v[poz].varsta;
Capcana: la ordonare muți fișa întreagă
Compari după un câmp, dar interschimbi înregistrarea completă, cu o temporară de tip Elev: Elev t = v[j]; v[j] = v[j+1]; v[j+1] = t;. Dacă temporara este int și muți doar notele, notele ajung lipite de vârstele altor elevi.
Din subiectele de BAC
Exerciții reale din subiectele anilor trecuți. Încearcă-le singur înainte să deschizi rezolvarea.
Variabila p memorează simultan, pentru un tip de prăjitură, codul (un număr natural de două cifre), prețul (număr real) și un set de trei numere naturale din intervalul , reprezentând informații specifice, în această ordine: tipul glazurii, tipul cremei principale și numărul de blaturi. Știind că expresiile C/C++ de mai jos au ca valori codul, prețul, respectiv tipul glazurii pentru o prăjitură, scrieți definiția unei structuri cu eticheta prajitura, care permite memorarea datelor despre o prăjitură, și declarați corespunzător variabila p.
p.cod p.pret p.informatii[0]Vezi rezolvarea
Expresiile din enunț impun structura câmpurilor: p.cod și p.pret sunt câmpuri simple, iar p.informatii[0] arată că informatii este un tablou cu 3 elemente.
struct prajitura
{
int cod;
float pret;
int informatii[3];
};
prajitura p;Codul este un număr natural de două cifre și cele trei informații sunt numere naturale din , deci tipul int este suficient pentru toate; prețul este număr real, deci float (sau double). În C, declararea variabilei se scrie struct prajitura p;.
Variabila x memorează, pentru fiecare dintre cele 20 de sortimente de ciocolată, următoarele date: tipul (litera N pentru ciocolată neagră și litera L pentru ciocolată cu lapte) și prețul produsului. Indicați o expresie a cărei valoare este egală cu tipul celui de al 11-lea sortiment de ciocolată.
struct ciocolata
{ char tip;
float pret;
}x[20];a. x.ciocolata[10].tip
b. x.tip[10]
c. x[10].ciocolata.tip
d. x[10].tip
Vezi rezolvarea
x este un tablou cu 20 de elemente de tip struct ciocolata. Al 11-lea sortiment se află pe indicele 10 (indexarea începe de la 0), deci elementul este x[10], iar câmpul său se accesează cu operatorul punct: x[10].tip.
Celelalte variante aplică operatorii în ordine greșită (indexează câmpul sau numele tipului în loc de variabilă).
Răspunsul corect este d.
Variabila f memorează, pentru fiecare dintre cele 10 soiuri de lalele care se vând într-o florărie, caracteristicile acestora: denumirea (șir de maximum 20 de caractere) și stocul, exprimat prin numărul de fire și prețul unui fir, în lei (numere naturale). Știind că expresiile de mai jos au ca valori denumirea primului soi de lalele, respectiv suma, în lei, necesară pentru a cumpăra toate lalelele din acest soi, scrieți în limbajul C/C++ definiția unei structuri cu eticheta lalea, care să permită memorarea informațiilor menționate pentru un soi de lalea, și declarați corespunzător variabila f.
f[0].denumire
f[0].stoc.nrFire*f[0].stoc.pretFirVezi rezolvarea
struct lalea {
char denumire[21];
struct {
int nrFire;
int pretFir;
} stoc;
};
struct lalea f[10];Câmpul denumire are 21 de caractere (20 utile plus terminatorul '\0'), câmpul stoc este o structură imbricată cu nrFire și pretFir, iar f este un tablou cu 10 elemente de tip lalea, câte unul pentru fiecare soi.