140 likes | 267 Views
Programare in limbajul C – Cursul 15 Structuri de date definite de utilizator Prof. univ. dr. Constantin Popescu. Agenda. Structuri Accesarea membrilor unei structuri Operaţii asupra unei structuri Pointeri la structuri. Structuri (1).
E N D
Programare in limbajul C – Cursul 15Structuri de date definite de utilizatorProf. univ. dr. Constantin Popescu
Agenda • Structuri • Accesarea membrilor unei structuri • Operaţii asupra unei structuri • Pointeri la structuri
Structuri (1) • Tipul de date elementar, definit de utilizator în C este structura sau struct. • Definirea structurilor este un proces din două etape: prima dată se declară un "şablon" care descrie noul tip, după care se declară variabile de acel tip (sau funcţii ce returnează noul tip). • Ca un prim exemplu, presupunem că vrem să definim un tip de date pentru reprezentarea numerelor complexe. • Tipul de date îl vom declara astfel: struct complex { double real; double imag; }; • Variabilele de tip complex se declară astfel: struct complex c1; • sau struct complex c2, c3;
Structuri (2) • Cuvântul cheie struct indică faptul că avem de-a face cu o structură, iar identificatorul complex este numele structurii despre care discutăm. • Astfel, c1, c2, c3 vor fi variabile de tip struct complex • Varibabilele c1, c2, c3 le putem reprezenta astfel: • O reprezentare mai simplă şi mai sugestivă ar fi:
Structuri (3) • Nu putem scrie: complex c1; • De exemplu, dacă scriem: struct complex { double real; double imag; } c1, c2, c3; • Am definit tipul struct complex, şi imediat am declarat trei variabile c1, c2, c3 toate de tip struct complex. • Putem folosi şi prima, a treia şi a patra parte: struct { double real; double imag; } c1, c2, c3; • În acest caz declarăm c1, c2, c3 fiind de tip structură ce nu are nume, ceea ce nu este foarte util.
Accesarea membrilor unei structuri • Elementele unei structuri se accesează prin numele acestora, folosind operatorul de selecţie a membrilor unei structuri care este caracterul punct (.). • In partea stângă trebuie să aibă o variabilă sau un obiect de tip structură, iar ca operand drept trebuie să fie numele unui membru al acelei structuri. • De exemplu, dacă c1 este o variabilă de tip struct complex, aşa cum am declarat-o în secţiunea precedentă, atunci c1.real este partea reală a numărului complex şi c1.imag este partea imaginară a numărului complex. • Accesarea elementelor unei structuri poate să apară oriunde, în partea stângă sau în partea deraptă a operatorului de atribuire. • Pentru a stabili valoarea părţii reale a variabilei c1 la 1,putem folosi instrucţiunea: c1.real = 1 • Pentru a lua partea imaginară a variabilei c2 şi a o atribui părţii imaginare a variabilei c1, putem folosi instrucţiunea: c1.imag = c2.imag
Operaţii asupra unei structuri (1) • Putem de asemenea atribui structuri ca un întreg: expresia c1 = c2 • Atribuie toată structura c2 structurii c1. • Putem transmite structuri ca argumente funcţiilor şi putem declara funcţii care returnează structuri. • De exemplu, putem scrie o funcţie care adună două numere complexe: struct complex cpx_add(struct complex c1, struct complex c2) { struct complex sum; sum.real = c1.real + c2.real; sum.imag = c1.imag + c2.imag; return sum; } • O dată scrisă această funcţie putem folosi o expresie de forma: c1 = cpx_add(c2, c3)
Operaţii asupra unei structuri (2) • Mai este o operaţie care se poate executa cu structurile, aceasta este iniţializarea variabilelor de tip structură la declarare. • La fel ca şi la iniţializarea tablourilor, iniţializatorii se pun într-o listă fiind separaţi de caracterul virgulă şi delimitaţi de acolade: struct complex c1 = {1, 2}; struct complex c2 = {3, 4}; • Tipul fiecărui iniţializator trebuie să fie compatibil cu tipul membrului corespunzător din structură.
Pointeri la structuri (1) • Putem declara doi pointeri la struct complex astfel: struct complex *p1, *p2; • Pentru ca pointerii p1 şi p2 să pointeze la variabile de tip struct complex putem folosi instrucţiunile: p1 = &c2; p2 = &c3; • Instrucţiunea de mai jos copiază structura pointată de p2 în structura pointată de p1: *p1 = *p2 • Urmatoarea instrucţiuneface ca pointerul p1 să pointeze unde pointează şi p2. p1 = p2
Pointeri la structuri (2) • Dacă vrem să accesăm un membru al unei structuri prin intermediul unui pointer trebuie să folosim operatorul * pentru a obţine structura pointată • Apoi trebuie să folosim operatorul . pentru a obţine membrul de care avem nevoie. • Din moment ce operatorul . are precedenţă mai mare decât *, trebuie să folosim paranteze: (*p1).real • Dacă scriem doar *p1.real, atunci am lua structura p1 i-am selecta membrul cu numele real şi am accesa valoarea la care pointează p1.real • Nu este corect întrucât membrul real din exemplul nostru nu este un pointer şi p1 nu este o structură ci un pointer la o structură, astfel că operatorul . nu va funcţiona. • Dacă p este un pointer la o structură şi m este un membru al acelei structuri, pt. a selecta membrul structurii pointate scriem: p->m • Expresia p->m este perfect echivalentă cu: (*p).m
Exemplu • Următorul program complet conţine funcţiile: • cpx_add() pentru adunarea a două numere complexe. • cpx_mult()pentru înmulţirea a două numerecomplexe. #include <stdio.h> struct complex { double real; double imag; }; struct complex cpx_add(struct complex c1, struct complex c2); struct complex cpx_mult(struct complex c1, struct complex c2);
Exemplu int main() { struct complex c1 = {1, 2}, c2 = {3, 4}; struct complex c3, c4; c3 = cpx_add(c1, c2); c4 = cpx_mult(c1, c2); printf("c1 + c2= %4.2f + %4.2fi", c3.real, c3.imag); printf("c1 * c2= %4.2f + %4.2fi", c4.real, c4.imag); return 0; } struct complex cpx_add(struct complex c1, struct complex c2) { struct complex sum; sum.real = c1.real + c2.real; sum.imag = c1.imag + c2.imag; return sum; }
Exemplu struct complex cpx_mult(struct complex c1, struct complex c2) { struct complex mult; mult.real = c1.real * c2.real - c1.imag * c2.imag; mult.imag = c1.real * c2.imag + c1.imag * c2.real; return mult; }
Exemplu #include <stdio.h> /* copiere structura in alta structura */ #include <conio.h> int main() { struct coordinate { int row,col; }; struct coordinate previous, current, next; previous.col = 5; previous.row = 6; current.col=previous.col; current.row= previous.row; next = previous; printf("previous.col = %d, previous.row = %d\n", previous.col, previous.row); printf("current.col=%d, current.row=%d\n",current.col,current.row); printf("next.col = %d, next.row = %d\n", next.col, next.row); getch(); return 0; }