📢 Nuovo Corso Bootstrap Completo disponibile!

Esercizi Union in C

Ecco degli esercizi con soluzione per praticare l’uso delle union in C.

Esercizio 1: Definizione e Uso di una Union

Definire una union con diversi tipi di dati e assegnare un valore a ciascun membro.
#include <stdio.h>
union Dati {
int i;
float f;
char c;
};
int main() {
union Dati dato;
dato.i = 10;
printf("Intero: %d\n", dato.i);
dato.f = 3.14;
printf("Float: %f\n", dato.f);
dato.c = 'A';
printf("Char: %c\n", dato.c);
return 0;
}

Esercizio 2: Uso di Union per Risparmiare Memoria

Utilizzare una union per risparmiare memoria tra diversi tipi di dati.
#include <stdio.h>
#include <string.h>
union Dati {
int i;
float f;
char str[20];
};
int main() {
union Dati dato;
printf("Dimensione di union Dati: %lu\n", sizeof(dato));
dato.i = 10;
printf("Intero: %d\n", dato.i);
dato.f = 3.14;
printf("Float: %f\n", dato.f);
strcpy(dato.str, "Hello");
printf("Stringa: %s\n", dato.str);
return 0;
}

Esercizio 3: Union all’interno di una Struct

Definire una struct che contiene una union e accedere ai suoi membri.
#include <stdio.h>
#include <string.h>
struct Contenitore {
char tipo;
union {
int i;
float f;
char str[20];
} dato;
};
int main() {
struct Contenitore cont;
cont.tipo = 'i';
cont.dato.i = 100;
if (cont.tipo == 'i') {
printf("Intero: %d\n", cont.dato.i);
}
cont.tipo = 'f';
cont.dato.f = 3.14;
if (cont.tipo == 'f') {
printf("Float: %f\n", cont.dato.f);
}
cont.tipo = 's';
strcpy(cont.dato.str, "Ciao");
if (cont.tipo == 's') {
printf("Stringa: %s\n", cont.dato.str);
}
return 0;
}

Esercizio 4: Confronto tra Union e Struct

Confrontare la dimensione di una union e di una struct con gli stessi membri.
#include <stdio.h>
union DatiUnion {
int i;
float f;
char c;
};
struct DatiStruct {
int i;
float f;
char c;
};
int main() {
union DatiUnion u;
struct DatiStruct s;
printf("Dimensione di union: %lu\n", sizeof(u));
printf("Dimensione di struct: %lu\n", sizeof(s));
return 0;
}

Esercizio 5: Uso di Union per Conversione di Tipi

Utilizzare una union per convertire tra tipi di dati diversi.
#include <stdio.h>
union Convertitore {
int i;
float f;
};
int main() {
union Convertitore conv;
conv.i = 1078523331; // Bit pattern equivalente a 3.14 in float
printf("Intero: %d\n", conv.i);
printf("Float: %f\n", conv.f);
return 0;
}

Esercizio 6: Union per Archiviazione di Dati Eterogenei

Utilizzare una union per archiviare e accedere a dati eterogenei.
#include <stdio.h>
union Dati {
int intero;
float decimale;
char carattere;
};
void stampaDati(union Dati d, char tipo) {
if (tipo == 'i') {
printf("Intero: %d\n", d.intero);
} else if (tipo == 'f') {
printf("Float: %f\n", d.decimale);
} else if (tipo == 'c') {
printf("Carattere: %c\n", d.carattere);
}
}
int main() {
union Dati d;
d.intero = 100;
stampaDati(d, 'i');
d.decimale = 3.14;
stampaDati(d, 'f');
d.carattere = 'A';
stampaDati(d, 'c');
return 0;
}

Esercizio 7: Uso di Union con Array

Utilizzare una union con un array per accedere ai dati in modo diverso.
#include <stdio.h>
union Dati {
int interi[2];
float decimali[2];
};
int main() {
union Dati d;
d.interi[0] = 1;
d.interi[1] = 2;
printf("Interi: %d, %d\n", d.interi[0], d.interi[1]);
d.decimali[0] = 3.14;
d.decimali[1] = 6.28;
printf("Float: %f, %f\n", d.decimali[0], d.decimali[1]);
return 0;
}

Esercizio 8: Union con Enum per Tipo di Dato

Utilizzare una union con un enum per determinare il tipo di dato archiviato.
#include <stdio.h>
enum TipoDato { INTERO, DECIMALE, CARATTERE };
union Dati {
int intero;
float decimale;
char carattere;
};
void stampaDati(union Dati d, enum TipoDato tipo) {
switch (tipo) {
case INTERO:
printf("Intero: %d\n", d.intero);
break;
case DECIMALE:
printf("Float: %f\n", d.decimale);
break;
case CARATTERE:
printf("Carattere: %c\n", d.carattere);
break;
}
}
int main() {
union Dati d;
enum TipoDato tipo;
d.intero = 100;
tipo = INTERO;
stampaDati(d, tipo);
d.decimale = 3.14;
tipo = DECIMALE;
stampaDati(d, tipo);
d.carattere = 'A';
tipo = CARATTERE;
stampaDati(d, tipo);
return 0;
}

Esercizio 9: Accesso ai Membri di una Union con Puntatori

Utilizzare puntatori per accedere ai membri di una union.
#include <stdio.h>
union Dati {
int intero;
float decimale;
char carattere;
};
int main() {
union Dati d;
d.intero = 100;
int *pIntero = &d.intero;
printf("Intero tramite puntatore: %d\n", *pIntero);
d.decimale = 3.14;
float *pDecimale = &d.decimale;
printf("Float tramite puntatore: %f\n", *pDecimale);
d.carattere = 'A';
char *pCarattere = &d.carattere;
printf("Carattere tramite puntatore: %c\n", *pCarattere);
return 0
;
}

Esercizio 10: Uso di Union in una Funzione

Passare una union a una funzione e modificarne il contenuto.
#include <stdio.h>
union Dati {
int intero;
float decimale;
char carattere;
};
void modificaUnion(union Dati *d, int tipo) {
switch (tipo) {
case 0:
d->intero = 200;
break;
case 1:
d->decimale = 6.28;
break;
case 2:
d->carattere = 'B';
break;
}
}
int main() {
union Dati d;
modificaUnion(&d, 0);
printf("Intero: %d\n", d.intero);
modificaUnion(&d, 1);
printf("Float: %f\n", d.decimale);
modificaUnion(&d, 2);
printf("Carattere: %c\n", d.carattere);
return 0;
}