CURS 9 Tipuri de date derivate tipuri definite







- Slides: 7

CURS 9 Tipuri de date derivate - tipuri definite de către utilizator - bazate pe tipurile de date de bază - permit prelucrarea globală a unor grupe complexe de date Tipul enumerare - permite folosirea unor nume sugestive pentru valori numerice. Exemple 1. roşu, oranj, galben, verde albastru, indigo şi violet pot fi asociate valorilor numerice 1, 2, 3, 4, 5, 6, 7. enum nume { nume_0, nume_1, . . . , nume_k } data_1, data_2, . . . , data_n; enum culoare {Rosu=1, Oranj, Galben, Verde, Albastru, Indigo, Violet} cul; cul=Galben; printf(“%d”, cul); 3 enum colors { rosu=650, oranj=590, galben=570, verde=510, albastru=475, indigo=445, violet=400 } col;

Tipul reuniune - variabilă care poate păstra obiecte de diferite tipuri şi dimensiuni. - permite păstrarea într-o zonă de memorie a unor date de tipuri diferite, lucru care duce la posibilitatea reutilizării unor zone de memorie şi deci la economisirea memoriei Declarare union nume { lista de declaraţii; } data_1, data_2, . . . , data_n; Exemplu union a { int x, y; double r; char fill; } cerc; Pentru date de diferite tipuri union se alocă o zonă de memorie necesară pentru a păstra data care necesită un număr maxim de octeţi. În exemplul de mai sus, pentru orice dată de tip union a se alocă 8 octeţi. Accesul membrilor reuniunii: - prin nume calificate - prin intermediul pointerilor : cerc. x cerc. y cerc. r cerc. fill cerc *p, c 1; p=&c 1; p->x p->y p->r p->fill Membrii unei structuri sunt stocaţi la aceeaşi adresă, aşadar, în mod evident, un singur membru poate fi stocat la un moment dat. O reuniune poate păstra oricare dintre membrii săi, dar la momente diferite de timp. se recomandă utilizarea cu atenţie a datelor de acest tip

Exemple Explicaţi output-ul programului de mai jos: #include <stdio. h> int main() { union a { int x, y; double r; char fill; } cerc, *p; cerc. y=66; printf("y= %d", cerc. y); printf("nfill: %c", cerc. fill); cerc. y=67; printf("nx= %d", cerc. x); printf("nfill: %c", cerc. fill); printf("nr: %lf", cerc. r); printf("nr: %d", cerc. r); return 0; } Output:

Tipul structură - set de variabile, nu neapărat de acelaşi tip, grupate împreună sub un singur nume, conform unei ierarhii - permit ca un grup de variabile aflate într-o anumită legătură să fie tratate ca o unitate şi nu ca entităţi separate. Tablourile sunt structuri particulare în care toate elementele structurii sunt de acelaşi tip. Declarare: struct nume { lista_de_declaratii; } data_1, data_2, . . . , data_n; struct nume { lista de declaraţii; }; struct nume data_1, data_2, . . . , data_n; typedef struct nume { lista de declaraţii; }; nume data_1, data_2, . . . , data_n; nume - numele tipului introdus prin această structură data_1, data_2, . . . , data_n - date de tipul structură nume membrii structurii

Exemple struct coord { int x; int y; } poz; Initializarea structurii: struct coord poz={30, 30}; typedef struct nucleu { int nrp; int nrn; } ; nucleu C 12={6, 6}, C 13; C 13. nrp=6; C 13. nrn=7; O structură poate avea ca mebru o altă structură. Având declarată structura coord, o structură dreptunghi poate fi declarată sub forma: struct drpt { struct coord pss; struct coord pdj; } dr; struct data { int zi; enum luni{Ian=1, Feb, Mar, Apr, Mai, Iun, Iul, Aug, Sep, Oct, Noi, Dec } luna; int an; }; struct date_personale { char nume[30], prenume [30], adresa[50]; struct data_nasterii; long cod; int varsta; enum stare {Necasatorit, Casatorit} stare_civ; int nr_copii; }; struct date_personale staff_ubb[2000], staff_ffiz[50], angajat;

Accesul la elementele structurilor - se foloseste operatorul. (operator membru de structură) poz. x=20; staff_ubb[7]. data_nasterii. an=1950; strcpy(angajat. data_nasterii. luna, "Apr"); Transferarea structurilor catre funcţii - se folosesc pointeri Exemplu Fie o funcţie care prelucrează structura angajat. O astfel de funcţie va fi apelată sub forma: f(&angajat) Antetul funcţiei f va fi: void f(struct date_personale *psdp) În corpul lui f nu se pot utiliza nume calificate de forma: angajat. nume, angajat. data_nasterii. zi, etc. Accesul elementelor structurii se face prin intermediul pointerului, sub forma: (*psdp). nume, (*psdp). data_nasterii. zi Eventual, în loc de construcţia (*psdp). se pot folosi construcţii de forma: psdp->nume, psdp->data_nasterii. zi, etc. Este posibila copierea unei întregi structuri într-o singură instrucţiune: angajat=staff_ubb[2];

Exemple structuri