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;

}