Agenda

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

description

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). - PowerPoint PPT Presentation

Transcript of Agenda

Page 1: Agenda

1

Programare in limbajul C – Cursul 15Structuri de date definite de utilizator

Prof. univ. dr. Constantin Popescu

Page 2: Agenda

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

Page 3: Agenda

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;

Page 4: Agenda

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:

Page 5: Agenda

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.

Page 6: Agenda

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

Page 7: Agenda

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)

Page 8: Agenda

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

Page 9: Agenda

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ţiune face ca pointerul p1 să

pointeze unde pointează şi p2.

p1 = p2

Page 10: Agenda

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

Page 11: Agenda

Exemplu Următorul program complet conţine funcţiile:

– cpx_add() pentru adunarea a două numere complexe.– cpx_mult() pentru înmulţirea a două numere complexe.

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

Page 12: Agenda

Exempluint 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;}

Page 13: Agenda

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

}

Page 14: Agenda

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