Structuri si uniuni
1. Structuri
O structura este un tip de date definit de utilizator. O structura este o colectie de date de tipuri diferite. Datele dintr-o structura sunt numite componente sau campuri. O structura se defineste cu instructiunea
struct nume ;
unde nume este noul tip de date.
De exemplu, urmatoarea structura poate defini tipul numere complexe
struct complex ;
Mentionam ca o structura poate contine componente de orice tip, chiar si alte structuri.
Variabilele de tipul unei structuri se definesc cu instructiunea
struct nume lista de variabile;
De exemplu, intr-un program putem defini numerele complexe a si b cu instructiunea
struct complex a, b;
Adresarea unui element al unei structuri se face cu operatorul "." cu forma
nume.membru
Putem da valori variabilelor definite anterior astfel:
a.real = 1.0;
a.imag = -1.2 + sin(0.3);
Putem utiliza valorile componentelor unei structuri in expresii, ca de exemplu:
float x;
x = a.real * a.imag;
La fel ca si in cazul variabilelor putem defini variabile tip pointer la o structura, ce vor contine adresa unei structuri. Instructiunea de definire a unui pointer la o structura are formele
struct nume * identificator;
unde nume este numele structurii. De exemplu,
struct complex * pc;
defineste un pointer de tip struct complex. Variabila tip pointer poate fi initializata ca orice variabila tip pointer, folosind operatorul de calcul al adresei &
pc = &a;
In cazul unui pointer p la o structura, un camp al structurii este adresat astfel
(*p).membru
deoarece operatorul . are precedenta mai mare decat operatorul *.
Prin definitie, aceasta scriere se prescurteaza ca
p->membru
Putem defini un tip de date structura cu instructiunea typedef
typedef struct tipnou ;
In acest caz definirea unor variabile de tipul structurii se face mai simplu cu instructiunea
tipnou lista de variabile ;
Probleme rezolvate
Problema 1. Se considera structura
struct complex
;
ce descrie numerele complexe. Sa se defineasca o functie care sa adune doua numere complexe. Sa se faca un program care sa defineasca trei variabile de tipul complex, sa atribuie valori la doua dintre variabile si sa calculeze suma lor utilizand functia. Se vor scrie apoi valorile variabilelor pe ecran sub forma (real, imag). Vom defini tipul de date cu instructiunea typedef. Programul ce rezolva problema este urmatorul.
# include <stdio.h>
// structuri C
typedef struct
numcmp;
numcmp addcmp(numcmp a, numcmp b)
int main ()
Rezultatele rularii programului sunt cele de mai jos.
Probleme propuse
Problema 1. Se considera structura complex din problema propusa 1. Sa se faca un program care sa defineasca un vector x cu 10 componente de tipul complex. Se va calcula dimensiunea structurii complex si a vectorului x cu ajutorul instructiunii sizeof.
Problema 2. Se considera structura complex din problema propusa 1. Sa se defineasca functii pentru scaderea , inmultirea si impartirea a doua numere complexe. Prototipurile acestor functii vor fi
numcmp subcmp(numcmp a, numcmp b)
numcmp mulcmp(numcmp a, numcmp b)
numcmp divcmp(numcmp a, numcmp b)
Problema 3. Fie structura
struct data
;
ce descrie data nasterii unei persoane. Sa se defineasca un vector cu 5 elemente tip data care se vor initializa cu valorile
nume zi luna an
Radu 10 7 1985
Dragos 11 2 1992
Cosmin 5 9 1978
Ovidiu 8 9 1964
Raul 15 4 1994
Sa se calculeze cate persoane sunt nascute dupa anul 1990.
2. Uniuni
O uniune se defineste cu instructiunea
union nume ;
Toate campurile unei uniuni ocupa aceeasi zona de memorie. Uniunile se utilizeaza atunci cand variabile de tipuri diferite nu trebuie initializate in acelasi timp.
Variabilele de tipul unei uniuni se definesc cu instructiunea :
union nume lista de variabile;
Probleme rezolvate
Problema 1. Fie uniunea
union id
;
Sa se defineasca o variabila de tip id care se va initializa pe rand cu valorile "alb" si 10 si se vor scrie aceste valori pe ecran. Se va calcula dimensiunea uniunii id cu operatorul sizeof. Programul ce rezolva problema este urmatorul.
# include <stdio.h>
# include <string.h>
int main()
union id x1;
x1.size = 8;
printf('size : %dn', x1.size);
strcpy(x1.color, 'white');
printf('color : %sn', x1.color);
printf('union size : %dn', sizeof(id));
return 0;
Rezultatele rularii programului sunt cele de mai jos.
3. Functii de timp
time_t time(time_t*);
initializeaza variabile de tipul time_t cu timpul curent.
char * ctime(time_t * t1);
converteste timpul curent GMT indicat de variabila t1 intr-un sir de caractere ce contine timpul curent local.
struct tm ;
contine timpul curent convertit in an, luna, zi, ore, minute, secunde.
struct tm * localtime(time_t * timeptr);
converteste timpul continut intr-o variabila time_t in structura tm.
Probleme rezolvate
Problema 1. Sa se completeze o variabila de tipul tm cu informatiile corespunzatoare si sa se afiseze aceste informatii pe ecran. Se va completa mai intai o variabila tip time_t cu functia time() si apoi structura tip tm cu functia localtime(). Se va afisa timpul curent local si cu functia ctime(). Se va afisa si timpul GMT gmtime().Programul ce rezolva problema este urmatorul.
# include <stdio.h>
# include <time.h>
// functii de timp
int main()
Rezultatele rularii programului sunt cele de mai jos.
|