Sunteți pe pagina 1din 21

O structur este un ansamblu format din una sau mai multe

variabile grupate mpreun sub un singur nume. Structurile se


deosebesc de tablouri prin urmtoarele aspecte:
(i) elementele unei structuri pot avea tipuri diferite, (ii)
structurile pot fi atribuite, (iii)
funciile pot returna structuri, (iv) elementele unui structuri nu
sunt variabile anonime ci au cte un nume, (v) referirea unui
element al unei structuri se realizeaz cu operatorul de
selecie ( . ) i nu cu operatorul de indexare ( [ ] ).

Dac dorim s prelucrm date


referitoare la mai muli elevi, pentru
fiecare elev trebuie s cunoatem:
Numele char[20]
Prenumele char[20]
Nota matematic - float
Nota informatic - float
Vrsta - int

n C++ exist un tip de date, numit struct,


care permite ca fiecrui elev s-i
corespund o singur nregistrare.
Forma general este:
struct [nume structura]
{
[<tip> <nume variabila [, nume variabila, ]>];
[<tip> <nume variabila [, nume variabila, ]>];

} [lista de variabile];

Structura o denumim elev i este:


struct elev
{ char nume[20], prenume[20];
float nota_mate, nota_info;
int varsta;
};

Exist dou posibiliti de declarare a variabilelor care


alctuiesc structura:
1.
Scriind la sfrit numele variabilelor:

struct elev
{ char nume[20], prenume[20];
float nota_mate, nota_info;
int varsta;
} inr1,inr2;
2.

Declarnd variabilele aa cum suntem obinuii:


elev inr1, inr2;

Definiia structurii poate fi fcut:


n cadrul funciei main()
naintea funciei main() (caz
recomandat)
Pentru accesul la cmpurile unei variabile
de tip struct se folosete operatorul de
selecie direct, notat cu ., operator
cu prioritate maxim.

Dac inr este o variabil de tipul elev.


Atunci:
inr.nume reprezint irul nume al
variabilei inr;
inr.nume[0] - reprezint primul caracter
al irului nume;
inr.nota_mate reprezint cmpul
nota_mate al variabilei inr.

ntre dou variabile de acelai tip struct se


poate folosi atribuirea.
Dac inr1, inr2 sunt dou variabile de tip
elev, prin atribuirea inr1=inr2, variabila
inr1 ia aceeai valoare ca variabila inr2.
O astfel de atribuire se mai numete
copiere bit cu bit.

Putem avea un tip structurat ce conine n interiorul


su un alt tip structurat.
struct elev
{ char nume[20], prenume[20];
struct
{ int clasa;
float note[20];
} situatie;
int varsta;
};

Dac inr este o variabil de tipul elev.


Atunci accesarea elementelor situate n
interiorul structurii se face astfel:
inr.situatie.clasa se acceseaz cmpul
clasa al substructurii
inr.situatie.note[0] se acceseaz prima
not a vectorului inclus n substructur

Dac avem
struct elev1
{ char nume[20], prenume[20];
struct
{ int clasa;
float note[20];
} situatie_1, situatie_2;
int varsta;
};

Tipul structurat elev1, subordoneaz


structurile situatie_1 i situatie_2.
Dac una sau mai multe structuri sunt
incluse una n alta, acestea se numesc
structuri imbricate.

Cele dou structuri sunt echivalente.

struct elev1
{ char nume[20],
prenume[20];
struct
{ int clasa;
float note[20];
} situatie_1,
situaie_2;
int varsta;
};

struct elev1
{ char nume[20],
prenume[20];
struct
{ int clasa;
float note[20];
} situatie_1;
struct
{ int clasa;
float note[20];
} situaie_2;
int varsta;
};

# include <iostream.h>
union test
{ int a;
char b[10];
double c;
};
main()
{ test var; int i;
cin>>var.c;
cout<<var.c<<endl;
cin>>var.b; cout<<var.b;
}

Variabila var este de tipul union.


Cmpurile subordonate ar trebui s
ocupe 2,10 i 8 octei dar toate
variabilele ocup numrul de octei
necesari pentru memorarea
cmpului cel mai lung.
La un moment dat se poate memora
doar un singur cmp dintre cele
subordonate.

Forma general a unei uniuni este:


union [<numele uniunii>]
{ <tip> <nume variabila>;

} [lista de variabile] ;
La un moment dat numai un cmp poate
fi ocupat. nregistrrile pot avea structur
variabil.

Uniunile pot fi incluse n structuri.


Structurile pot fi incluse n uniuni.
nregistrarea are structur variabil dar
ocup un numr fix de octei.
Citirea i afiare nregistrrii se face, de
fiecare dat , sub switch, n funcie de
datele citite sau coninute.

#include<iostream.h>
struct persoana
{ char nume[30], studii;
union
{ int nr_clase;
struct
{ int an_t;
char oras[20];
} liceu;
struct
{ char nume_f[30];
int nr_ani;
} facultate;
} std;
};

main()
{ persoana pers;
cout<<Nume persoana ;
cin.get(pers.nume,30);
cout<<Studii (f-fara, g-generala, l-liceu,
s-superioare);
cin>>pers.studii;

switch(pers.studii)
{ case g: cout<< numar clase ;
cin>>pers.std.nr_clase; break;
case l: cout<< anul terminarii liceului ;
cin>>pers.std.liceu.an_t;
cout<< orasul ;
cin>>pers.std.liceu.oras; break;
case s: cout<< numele facultatii ; cin.get();
cin.get(pers.std.facultate.nume_f,30);
cout<< nr. Ani de studiu ;
cin>>pers.std.facultate.nr_ani;
}

cout<<pers.nume<<endl;
switch(pers.studii)
{case f: cout<<n-are saracu studii ; break;
case g: cout<<numar
clase<<pers.std.nr_clase;
break;
case l: cout<< a terminat liceul in
<<pers.std.liceu.an_t<< in orasul
<<pers.std.liceu.oras; break;
case s: cout<< A terminat facultatea
<<pers.std.facultate.nume_f<< de
<<pers.std.facultate.nr_ani<< ani ;
}

S-ar putea să vă placă și