Table of Contents

Breviar 09 - Structuri-Enumerări-Uniuni

În acest laborator veţi învăţa să:

Structuri

Sintaxa definire a unei variabile de tip structură este următoarea:

struct { ... } variabilă;

Variabilele definite cu această sintaxă au un tip de dată anonim (nu se pot face atribuiri între ele). Putem rezolva mai elegant această problemă dacă definim un tip de dată structură cu următoarea sintaxă:

typedef struct { ... } TIP_STRUCTURĂ;
TIP_STRUCTURĂ variabila1, variabila2, vector_structuri[100]

Membrii unei structuri se accesează folosind operatorul . astfel:

typedef struct {
   int a, b;
   float c;
} TRIPLET;
 
TRIPLET t;
 
t.a = 5;

Două variabile de acelaşi tip structură se pot atribui una alteia, dar nu se pot compara între ele!

Enumerări

Folosite pentru a da nume simbolice. Sintaxa:

enum nume_enumeratie { val1, val2, val3, ... };

Exemplu:

#include <stdio.h>
 
int main() 
{ 
    int a, b, rez, op;
    enum operatii { adunare, scadere, inmultire };
    scanf("%d %d %d", &a, &b, &op);
    switch (op) {
        case adunare: rez = a + b; break; 
        case scadere: rez = a - b; break; 
        case inmultire: rez = a * b; break; 
    } 
    printf("%d\n", rez);
    return 0; 
}

Uniuni

Uniunile permit accesarea aceleiaşi zone din memorie ca fiind de mai multe tipuri de date. Toate elementele declarate într-o uniune ocupă aceeaşi zonă de memorie, dimensiunea ei fiind maximul dintre dimensiunile membrilor. Declararea unei uniuni are aceeaşi sintaxă cu declararea unei structuri. Exemplu:

union number { 
    long int l;
    struct {
        short int lo;
        short int hi;
    }
}; // permite accesarea acelorasi 4 bytes fie ca un intreg lung, fie ca 2 short int, prin obtinerea celor 2 jumatati componente

Un exemplu de folosire a uniunilor se găseşte mai jos:

#include <stdio.h>
 
union Data
{
    char a;
    int x;
    float f;
};
 
void print_union(union Data data) {
    printf("------UNION------\n");
    printf("data.a=%c\n", data.a);
    printf("data.x=%d\n", data.x);
    printf("data.f=%f\n", data.f);
}
 
int main() {
 
    union Data data;
 
    data.a = 'A';
    print_union(data);
 
    data.x = 42;
    print_union(data);
 
    data.f = 101.357;
    print_union(data);
    return 0;
}