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);