Cap. 7

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

Sunteți pe pagina 1din 15

Structuri

O structur este o colecie de una sau mai multe componente,


posibil de tipuri diferite, grupate mpreun sub un singur nume
pentru uurina manipulrii n ansamblu.
Structurile ajut la organizarea datelor complicate, n special
n programe ample, deoarece permit ca un grup de variabile
care au ceva n comun s fie tratate ca o unitate, n loc de a fi
considerate entiti separate.
Un exemplu tradiional de structur este o nregistrare de tip
stat de plat: un angajat este descris printr-un set de atribute
precum nume, adres, cod numeric personal, salariu etc.
Unele dintre acestea pot fi, la rndul lor structuri: de exemplu,
un nume poate aveamai multe componente, la fel o adres i
chiar un salariu.
Structuri
Bazele structurilor
S crem o structur potrivit pentru grafic. Obiectul de
baz este un punct, care are o coordonat xi o coordonat y,
ambele ntregi.
Cele dou componente pot fi plasate ntr-o structur
declarat astfel:
struct punct {
int x;
int y;
};
(0,0)
.(4,3)
x
y
Structuri
Bazele structurilor
Cuvntul cheie struct introduce o declaraie de structur, care
este o list nchis ntre acolade.
Dup cuvntul struct poate urma un nume opional, numit nume
generic al structurii (structure tag) (punct n exemplu). Numele
generic reprezint acest tip de structur i poate fi folosit ulterior ca
prescurtare pentru partea declaraiei cuprins ntre acolade.
Variabilele definite ntr-o structur (componentele structurii) se
numesc membri.
Un membru al unei structuri sau numele generic al acesteia i o
variabil obinuit (care nu este membru) pot avea acelai nume
fr a aprea conflicte, deoarece acestea pot fi oricnd deosebite
prin context.
n structuri diferite pot s apar aceleai nume de membri.
Structuri
Bazele structurilor
dupa acolada nchis care ncheie lista de membri poate urma
o list de variabile, la fel ca n cazul oricrui tip de baz.
struct {... }x, y, z;
O declaraie de structur care nu este urmat de o list de
variabile nu aloc spaiu; descrie doar un ablon de structur.
Dac n declaraie apare numele generic, acest nume poate fi
folosit mai trziu n definirea unor instanieri ale structurii
(variabile de tipul structurii).
Declaraia
struct punct pt;
definete o variabil pt care este o structur de tipul struct
punct.
in C trebuie pus si struct cand definim variabile de
tipul structurii
Structuri
Bazele structurilor
O structur poate fi iniializat plasnd dup definiia sa o
list de valori intre acolade, la fel ca la vectori, fiecare valoare
corespunzand unui membru si fiind o expresie constant:
struct punct maxpt = {320, 200 }; //membrul x al
variabilei maxpt va fi initializat cu 320 si y cu 200
ntr-o expresie, un membru al unei structuri poate fi accesat
printr-o construcie de forma:
variabila.membru
Operatorul . (punct) are semnificatia apartinand lui sau
din
printf(%d,%d, pt.x, pt.y); //membrul x apartinand
variabilei pt si membrul y apartinand tot variabilei pt
dist = sqrt((double)(pt.x * pt.x + pt.y * pt.y));
Structuri
Bazele structurilor
Structurile pot fi imbricate(incluse unele n altele).
Exemplu: o reprezentare a unui dreptunghi este o pereche de
puncte care reprezint colurile diagonal opuse.
struct dreptunghi {
struct punct pt1;
struct punct pt2;
};
pt1
pt2
x
y
Structuri
Bazele structurilor
Structura dreptunghi conine dou structuri punct
(membrii pt1 si pt2).
Dac declarm variabila ecran ca
struct dreptunghi ecran;
atunci
ecran.pt1.x
se refer la coordonata xa membrului pt1din ecransi se
citeste: membrul x apartinand membrului pt1 al variabilei
ecran
Structuri
Bazele structurilor
Exemple tipice de structuri:
struct data {
int zi;
int luna;
int an;
};
struct angajat {
char nume[64];
int varsta;
int categ_salarizare;
float salariu;
unsigned nr_marca;
}angajat_info, nou_angajat, fost_angajat;
Structuri
Structurile i funciile
Singurele operaii legale cu o structur sunt:
- copierea acesteia prin operaia de atribuire sau prin
transmiterea de argumente funciilor i returnarea de
valori din funcii(structura se consider ca o unitate)
- invocarea adresei structurii cu operatorul &
- accesarea membrilor unei structuri
Structurile nu pot fi comparate.
O structur poate fi iniializat printr-o list de valori
constante pentru membri cu valori date intre acolade
Structuri
Transmiterea structurilor ca argumente
/*creazaPunct: creaza un punct din coord. x si y */
struct punct creazaPunct(int x, int y)
{
struct punct temp;
temp.x = x;
temp.y = y;
return temp;
}
Nu exist nici un conflict ntre numele argumentului (x sau
y) i membrul (x sau y) cu acelai nume din structura.
Membrii pot fi accesati doar prin intermediul variabilei care ii
contine si atunci distinctia este clara
Structuri
Transmiterea structurilor ca argumente
Funcia creeazaPunct poate fi folosit pentru a iniializa
orice structur de tip punct, sau pentru a furniza unei funcii
argumente de tip structur:
struct dreptunghi ecran;
struct punct mijloc;
ecran.pt1 = creazaPunct(0, 0);
ecran.pt2 = creazaPunct(XMAX, YMAX);
mijloc = creazaPunct((ecran.pt1.x + ecran.pt2.x)/2,
(ecran.pt1.y + ecran.pt2.y)/2);
Structuri
Transmiterea structurilor ca argumente
Exemple: funcii care efectueaz operaii aritmetice cu
puncte.
/* ptInDreptunghi: returneaza 1 daca p se afla in
interiorul dreptunghiului d si 0 in caz contrar */
int ptInDreptunghi(struct punct p, struct dreptunghi d)
{
return p.x >= d.pt1.x && p.x < d.pt2.x
&& p.y >= d.pt1.y && p.y < d.pt2.y;
}
Structuri
Vectori de structuri
La fel ca si variabilele obisnuite, structurile pot constitui
elemente ale unui vector:
struct persoana{
char nume[25];
int varsta;
};
struct persoana persoane[100]={{Ion, 23},{Ana,21}};
int nPersoane=2;
persoane este un vector avand elemente de tipul struct
persoana si care poate contine maxim 100 elem
persoane poate fi initializat cu {}, la fel ca un vector
obisnuit si punand intre acolade initializarea fiecarei structuri
Structuri
Vectori de structuri
daca exista mai multe variabile sau elemente dintr-un vector
apartinand aceleiasi structuri, FIECARE MEMBRU OCUPA
UN LOC SEPARAT IN MEMORIE (fiecare variabila de tipul
structurii are proprii sai membrii, care sunt distincti de ceilalti)
=>membrul nume de la pozitia persoane[0] este o alta variabila
decat membrul nume de la pozitia persoane[1].
printf(%s %d\n, persoane[0].nume, persoane[0].varsta);
//Ion 23
printf(%s %d\n, persoane[1].nume, persoane[1].varsta);
//Ana 21
Structuri
Vectori de structuri
cu vectorii de structuri se pot efectua aceleasi operatii ca in
cazul vectorilor obisnuiti: cautare, stergere, inserare, sortare,
for(i=0;i<nPersoane;i++)
if(persoane[i].varsta>=18)
printf(%s este major\n,persoane[i].nume);

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