Declararea unei structuri
Declarea unei structuri. Operatii permise
Noţiuni introductive.Definirea unei structuri
Să presupunem că ni se cere să întocmim o situaţie pentru şcoală, care să conţină următoarele date primare:
1. numele elevului
2. prenumele elevului
3. media generala
4. clasa
Observăm că pentru a memora aceste date cu cunoştiinţele acumulate până în prezent, ar trebui să utilizăm 4 tablouri unidimensionale, două de tip şir de caractere, unul de tip float şi unul de tip întreg. Cu siguranţă scrierea programului ar fi neplăcută. Apare astfel evidentă necesitatea existenţei unui tip de dată cu ajutorul căruia să putem prelucra date neomogene ca cele din exemplul de mai sus. C++ ne pune la dispoziţie un astfel de tip, numit struct, cu ajutorul căruia utilizatorul poate să îşi definească structura de date de care are nevoie.
Forma generală de definire a tipului struct:
struct [<nume structură>] {
tip1 <nume câmp> [,<nume câmp>, …];
tip2 <nume câmp > [,<nume câmp >, …];
....
tipn <nume câmp > [,<nume câmp >, …];
} [listă variabile];
Unde:
nume structură - desemnează numele sub care este cunoscut tipul structurat respectiv, în program
<tip1>…<tipn> - reprezintă tipurile de date din care se compune structura <nume câmp> - desemnează identificatorii datelor care compun structura
Tipul struct descrie doar modul cum sunt organizate datele, asemenea tipurilor predefinite, nu rezervă o zonă de memorie în care datele se păstreză. Pentru a memora datele este obligatorie declararea unei variabile de tip <nume structură>. Pentru exemplul de mai sus definim următoarea structură:
struct elev { // numele structurii este elev
char nume[20]; //memoreaza numele elevului care va fi un sir de maxim 20 caractere
char prenume[20]; //memoreaza prenumele elevului care va fi un sir de maxim 20 caractere
float medie; //memoreaza media elevului care va fi un numar real
int clasa; //memoreaza clasa elevului care va fi un numar intreg, ex: 9, 10, 11, 12
};
Declararea variabilelor de tipul structurii definite se poate realiza în două moduri:
a.) După cum putem observa din forma generală, variabilele se pot declara după definirea structurii. În acest caz structura poate fi anonimă, adică <nume structură> poate să lipsească.
b.) Oriunde în program, în acelaşi mod cu declararea variabilelor pentru tipurile predefinite:
<nume structură> <nume var1>[, <nume var2>, …,<nume varn>];
În acest caz <nume structură> este obligatoriu, la definirea structurii. Definirea unui tip structură poate fi plasată oriund în program, acest tip va fi cunoscut din momentul definirii lui până în momentul încheierii structurii în interiorul careia a fost definit.
Modul de adresare
Cum ne adresăm unui anumit membru al unei structuri, ştiind că avem o singură variabilă care cuprinde toate câmpurile structurii? Pentru a putea accesa un anumit câmp din interiorul unei structuri vom folosi operatorul de selecţie directă “.” , acest operator are prioritate maximă. Pentru exemplul datŞ
struct elev {char nume[20],prenume[20];
float medie;
int clasa;
};
Şi declaraţia de variabilă:elev articol; ne vom adresa unui câmp din variabila articol astfel:
articol.nume
articol.prenume
articol.medie
articol.clasa
Înregistrări imbricate
Să presupunem că pe lângă datele elevului din exemplul precedent trebuie să mai adăugăm situaţiei noastre şi data naşterii elevului.
O dată calendaristică se compune din 3 câmpuri: zi, lună, an. Vom putea defini datele unui elev folosind două structuri, astfel:
struct data {
int zi,luna,an;
};
struct elev{
char nume[20],prenume[20];
data datan;
float medie;
int clasa;
};
elev articol;
Observaţii:
câmpul datan – reprezentând data naşterii elevului-din structura elev, este de tip structurat, adică de tip data(structură definită inaintea structurii elev) şi se foloseşte în interiorul altei structuri. Spunem despre tipul data că este imbricat în tipul elev.
Se pot realiza mai multe nivele de imbricări.
Modul de adresare în cazul structurilor imbricate, pentru exemplul precedent:
articol.nume
articol.prenume
articol.datan.zi
articol.datan.luna
articol.datan.an
articol.medie
articol.clasa
Operaţii cu variabile declarate de tip structura
1. Operaţia de atribuire:atribuirea este permisă intre două variabile declarate de tip struct doar daca ambele sunt definite de acelasi tip
2. Operația de citire/scriere:citirea, respectiv afisarea unei variabile definite de tip struct este permisă doar câmp cu câmp.
Exemplu: fie următoarea declarare de tipuri şi variabile:
struct data {
int zi,luna,an;
};
struct elev {
char nume[10],prenume[20];
data datan; //datan –dată de tip structurat, in interiorul unui tip structurat
float medie;
int clasa;
};
elev a, b;
void citire( elev x)
{cout<<"nume:";cin>>x.nume;
cout<<"prenume:";cin>>x.prenume;
cout<<"zi:";cin>>x.datan.zi; //modul de adresare al datelor imbricate
cout<<"luna:";cin>>x.datan.luna;
cout<<"an:";cin>>x.datan.an;
cout<<"medie:";cin>>x.medie;
cout<<"clasa:";cin>>x.clasa;
}
void afisare( elev x)
{ cout<< x.nume<<" "<<x.prenume<<" ";
cout<<"Nascut la data :"<<x.datan.zi<<"/"<<x.datan.luna<<"/"<<x.datan.an;
cout<<" are media "<<x.medie<<" si este in clasa "<<x.clasa<<endl;
}
int main()
{ // se citesc datele pentru doi elevi numiti a,b
citire(a);
citire(b)
//afisarea
cout<<"Primul elev:";
afisare(a);
cout<<"al doilea elev: ";
afisare(b);
return 0;
}