Sunteți pe pagina 1din 9

STRUCTURI

Def: O structura este o colectie de una sau mai multe variabile grupate sub un acelasi nume.
Variabilele intr-o structura, spre deosebire de cele dintr-un array, pot fi de diferite tipuri. O structura poate
contine orice tip de date, inclusiv alte structuri sau array-uri, mai puin declaraii ce implica recursivitate.
Fiecare variabila dintr-o structura se numeste membru al structurii.
Ex de structura numita coord, care are ca si membrii coordonatele unui punct :
struct coord {
int x;
int y;
};
Obs. Caracterul ; este obligatoriu dp declararea unei structuri.
Cuvantul cheie struct indica inceputul definirii unei structuri. Acesta trebuie urmat de numele structurii.
ntre acolade se declara membrii structurii. Fiecare membru tebuie sa aiba specificat tipul. !"emplul de mai
sus defineste un tip structura care contine doua variabile de tip intreg ",y, dar nu creea#a nici un fel de
instantiere. $unt doua posibilitati de a declara o structura %de a re#erva spatiu de memorie pentru membrii
structurii& :
'.
struct coord {
int x;
int y;
} first, second;
first si second declara ( structuri de tip coord. Asta inseamna ca first contine doi membrii de tip intreg ,
adica pe " si pe y si la fel si second.
(.
struct coord {
int x;
int y;
};
/* optional poate fi scris cod, declararea fiind posibila pe parcursul
programului */
struct coord first, second;
typedef struct)
int "*
int y*
+coord*
coord first, second*
Accesarea membrilor unei structuri:
,embrii unei structuri sunt accesati prin operatorul -.. %operatorul de selecie&. Acesta se pune intre numele
structurii si numele membrului. /e e"emplu, daca vrem sa atribuim lui " valoarea 01 si lui y valoarea '11,
apartinand structurii first vom scrie :
first.x !";
first.y #"";
2entru a ne convinge ca atribuirea s-a efectuat, putem sa afisam coordonatele in felul urmator:
printf$%&d,&d%, second.x, second.y';
3n avanta4 ma4or care este oferit de folosirea structurilor in locul folosirii de simple variabile este copiera
de informatii dintre structurile de acelasi tip printr-o simpla atribuire :
first second; first.x second.x;
$ec(i)alent cu' first.y second.y;
3n alt avanta4 pe care structurile il ofera este acela de a putea accesa un grup de diferite tipuri de variabile.
/e e"emplu, daca dorim sa avem o ba#a de date la care fiecare intrare sa fie o structura care sa aiba ca
membri mai multe informatii %nume, adresa, telefon&, acestea constituind membrii structurii.
Ex de structura cu instantiere :
struct date {
c(ar mont(*+,;
c(ar day*+,;
c(ar year*-,;
} current.date;
Ex de declarare si initiali#are a unei structuri :
struct time {
int (ours;
int minutes;
int seconds;
} time.of.birt( { /, -!, " };
Structuri care contin alte structuri
$a presupunem ca dorim sa fi"am cooronatele unui dreptunghi. 2entru aceasta avem nevoie de doua puncte
care vor repre#enta colturile de pe diagonala dreptunghiului. Fiecare colt este definit prin doua coordonate
" si y. 2entru a ne referi la " si y %coordonatele unui punct&, facem apel la structura de mai sus coord.
n continuare definim o alta structura care are ca si membrii doua structuri de tip coord,fiecare
repre#entand cate un punct al diagonalei dreptunghiului :
struct rectangle {
struct coord topleft;
struct coord bottomrt;
};
2entru a declara aceasta structura, e"emplificam inca o data cele doua metode e"puse mai sus :
'.
struct rectangle {
struct coord topleft;
struct coord bottomrt;
} mybox;
(.
struct rectangle mybox;
Accesarea punctelor " si y se face in felul urmator :
mybox.topleft.x ";
mybox.topleft.y #";
mybox.bottomrt.x #"";
mybox.bottomrt.y +"";

Structuri care contin tablouri (array-uri)
Ex de definire de structura care are ca si membrii ( tablouri de tipuri diferite
struct data{
int x*-,;
c(ar y*#",;
};
Ex de declarare a acestei structuri :
struct data record;
Ex de accesare a membrilor ei :
record.x*+, #"";
record.y*#, 0x1;
Tablouri e structuri
$a presupunem ca dorim sa retinem numele si numarul de telefon al unor persoane. 2entru aceasta definim
o structura :
struct entry{
c(ar fname*#",;
c(ar lname*#+,;
c(ar p(one*/,;
};
Apoi declaram un tablou numit lista care contine '111 de elemente. Fiecare din aceste elemente va fi o
structura de tip entry :
struct entry list*#""",;
5e#ultatul obtinut este un tablou de structuri. $e pot face diferite operatii intre membrii structurilor. $pre
e"emplu putem atribui un element al tabloului altui element :
list*#, list*!,;
2rin e"emplul de mai sus am atribuit fiecarui membru al structurii list6'7 valorile care sunt la list607. /e
asemenea se pot copia date intre membrii structurilor :
strcpy$list*#,.p(one, list*!,.p(one';
!bs: Variabila phone a fost declarata de tip char, de aceea trebuie folosita functia strcpy%&.
Structuri si "ointeri
2ointerii pot fi folositi pe de o parte ca si membri ai unei structuri, dar si pentru a accesa o structura
%pointeri la structuri&
#ointeri ca membri ai structurii
8u sunt diferente intre declararea pointerilor in afara structurilor fata de declararea lor ca si membrii ai
structurii :
Ex de structura care are ca si membrii pointeri la intregi :
struct data {
int *)alue;
int *si2e;
} first;
!bs. $tructurile care conin pointeri 83 este indicat sa fie doar atribuite.
Am definit si declarat o structura cu doi mebri pointeri la intregi. Acestia trebuie sa pointe#e %sa indice&
catre ceva:
first.)alue 3cost;
first.si2e 3)olume;
!"presia 9first.value evaluea#a valoarea lui cost, precum si e"presia 9first.si#e evaluea#a valoarea lui
volume.
Ex cu membrii pointeri la char:
struct msg {
c(ar *p#;
c(ar *p+;
} myptrs;
myptrs.p# %4ntelegem structuri%;
myptrs.p+ %4n)atam structuri%;
E$: Afisare:
printf$%&s &s%, myptrs.p#, myptrs.p+';
#ointeri la structuri
2ointerii la structuri sunt cel mai adesea folositi atunci cand dorim sa transmitem o structura ca si
parametru intr-o functie sau la liste inlantuite, capitol ce va fi tratat ulterior.
Ex de pointer la structura :
struct part {
int number;
c(ar name*#",;
};
struct part *p.part;
!bs : Operatorul de dereferentiere -9. de mai sus indica faptul ca p:part este un pointer catre tipul part, nu
o instantiere a tipului part. 2ointerul are nevoie de o adresa de memorie spre care sa indice. /in acest motiv
este necesar sa declaram o instanta de tipul part :
struct part inst;
Acum putem face initiali#area pointerului:
p.part 3inst;
Aceasta operatie atribuie adresa lui inst la p:part. Am obtinut un pointer catre structura inst. O metoda de
acces la structura este prin folosirea operatorului de indirectare -9 -. /in moment ce p:part este un pointer
catre structura inst ;< 9p:part se refera la inst.
2entru a ne referi la mebrii individuali ai structurii inst :
%. putem aplica operatorul -.&.
Ex de atribuire mebrului inst.number, valoarea '11 :
$*p.part'.number #"";
!bs : 9p:part trebuie pus intre parante#e deoarece operatorul -.. are precedenta mai mare decat -9..
'. folosind operatorul -( Acest operator este plasat intre numele pointerului si numele membrului.
Ex de accesare a membrului number din inst cu a4utorul lui p:part:
p.part56number
2resupunem ca str este o structura, p.str este un pointer catre str si memb este un membru al str.
2utem accesa str.memb in felul urmator :
p.str56memb
!bs: /aca p.str este un pointer la structura str. 3rmatoarele e"presii sunt echivalente :
str.memb $*p.str'.memb p.str56memb
#ointeri si tablouri e structuri
2entru e"emplificare, o sa plecam de la un e"emplu folosit anterior:
struct part {
int number;
c(ar name*#",;
};
/upa ce am definit structura part, putem sa declaram un array de tipul part.
struct part data*#"",;
n continuare putem sa declaram un pointer la tipul part si sa-l initiali#am sa pointe#e spre prima
structura din tabloul data.
struct part *p.part;
p.part 3data*",;
2entru a afisa membrii, putem sa scriem in urmatorul mod:
printf$%&d &s%, p.part56number, p.part56name';
Alocare inamica a structurilor
2resupunem ca avem urmatoarea structura :
typedef struct {
int number;
c(ar *string;
}my7truct#;
2entru a aloca dinamic spatiu pentru aceasta structura folosim una din functiile de alocare de4a invatate.
$pre e"emplu cu a4utorul lui malloc:
my7truct# *name $my7truct# *' malloc$si2eof$my7truct#'';
=ineinteles ca nu trebuie negli4at nici testul de alocare:
if $name 89::' {
printf$%out of memory;n%';
exit$#';
}
Accesul la membrii structurii se face la fel ca si in e"emplele de mai sus:
name56number#" ;
name56string <locare dinamica a structurilor;
!bs: 8u uitati sa eliberati memoria>
free$name';
2utem aloca in mod dinamic spatiu si pentru un membru al structurii. !"emplul de mai 4os ilustrea#a un
mod in care s-a alocat spatiu pentru membrul string.
c(ar *sir <locare dinamica a unui membru;
name56string$c(ar *' malloc $strlen $sir '=#';
strcpy$name56string,sir';
)unctii care au ca si ar*ument structuri
Acest lucru este ilustrat in e"emplul de mai 4os :
>include ?stdio.(6
/* @efineste si declara o structura */
struct data{
float amount;
c(ar fname*A",;
c(ar lname*A",;
} rec;
/* Brototipul functiei. 8u are )aloare returnata si are un argument de
tip structura */
)oid print.rec$struct data x';
)oid print.rec.+$struct data *x';
main$'
{
/* Citirea datelor de la tastatura. */
printf$%Cnter t(e donor1s first and last names,;n%';
printf$%separated by a spaceD %';
scanf$%&s &s%, rec.fname, rec.lname';
printf$%;nCnter t(e donation amountD %';
scanf$%&f%, 3rec.amount';
/* <pelarea functiei print.rec$'. */

print.rec$ rec ';
print.rec.+$ 3rec ';
/* Obs :apelul se face a)and ca si argument numele dat instantei
structurii*/
return ";
}
)oid print.rec$struct data x'
{
printf$%;n@onor &s &s ga)e E&.+f.;n%, x.fname, x.lname,
x.amount';
}
)oid print.rec.+$struct data *x'
{
printf$%;n@onor &s &s ga)e E&.+f.;n%, x56fname, x56lname,
x56amount';
}
Ex de program care accesea#a elemente succesive ale unui array prin incrementarea unui pointer :

>include ?stdio.(6
>define F<G -
/*@efinirea unei structuri, apoi declararea si initiali2area unui
tablou cu - structuri*/
struct part {
int number;
c(ar name*#",;
} data*F<G, {{#, %7mit(%},
+, %Hones%,
A, %<dams%,
-, %Iilson%
};
/* @eclararea unui pointer de tip part si a unui intreg pentru numarul
de )ariabile*/
struct part *p.part;
int count;
main$'
{
/* 4nitiali2area pointerului la primul element al tabloului*/
p.part data;
/*Barcurgerea tabloului prin incrementarea pointerului la fiecare
iteratie */
for $count "; count ? F<G; count=='
{
printf$%<t address &pD &d &s;n%, p.part, p.part56number,
p.part56name';
p.part==;
}
return ";
}
2robleme propse :
'.
2ropuneti o structura care sa contina toate campurile necesare unei inregistrari din cartea de telefon.
,otivati utili#area si definirea campurilor respective.
(.
$e cere proiectarea unei ba#e de date care sa contina poligoane neregulate inchise in plan. $e vor initiali#a
3n numar de ? poligoane cu numarul de laturi intre @ si '1, iar in final pentru fiecare poligon se va afisa
perimetrul.

A.
$a se argumente#e crearea unei ba#e de date folosind structuri, necesare unui campionat de fotbal in care
sa fie incluse 4ucatorii, echipele si meciurile.
A.
$e considera mai multe orase, fiecare oras putand dispune sau nu de unul din urmatoarele atribute :
- patinoar %?-@0&
- opera %'0-?1&
- mu#eu %'0-B1&
- stadion %'1-A1&
- monumente %@1-?1&
- mall %@-@1&
- strand %'1-(1&
- cinema %'A-@1&
- parc %A1-?1&
- discoteca %'0-(0&
8umerele din parante#a repre#inta intervalul de varsta pentru care proprietatea respectiva pre#inta interes.
Orasele se introduc de la taspatura, pentru fiecare oras dandu-se ( linii : pe prima linie, numele orasului iar
pe a (-a un sir format din 1 si ' fara pau#e, de '1 caractere, 1 repre#entand absenta proprietatii, iar '
pre#enta ei in oras. Cista de orase se incheie la prima linie vida. /upa ce s-au introdus orasele, se vor
introduce pe rand numere repre#entand varste. 2entru fiecare varsta introdusa, sa se afise#e primele @ orase
cele mai atractive pentru acea varsta si gradul lor de atractivitate. Dradul de atractivitate este dat de
numarul proprietatilor pre#ente in oras, care repre#inta atractie pentru varsta data.
0.
$crieti o functie care atribuie o structura alteia, structura fiind definita in felul urmator: struct
o:structura)int "* char h* char 9f+* si cunoscandu-se ca f arata spre un sir de caractere neconstant>

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