html5-img
1 / 14

Agenda

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

callum
Download Presentation

Agenda

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programare in limbajul C – Cursul 15Structuri de date definite de utilizatorProf. univ. dr. Constantin Popescu

  2. Agenda • Structuri • Accesarea membrilor unei structuri • Operaţii asupra unei structuri • Pointeri la structuri

  3. 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;

  4. 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:

  5. 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.

  6. 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

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

  8. 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ă.

  9. 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

  10. 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

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

  12. 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; }

  13. 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; }

  14. 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;   }

More Related