- Esercizio 1: Definizione e Uso di una Union
- Esercizio 2: Uso di Union per Risparmiare Memoria
- Esercizio 3: Union all’interno di una Struct
- Esercizio 4: Confronto tra Union e Struct
- Esercizio 5: Uso di Union per Conversione di Tipi
- Esercizio 6: Union per Archiviazione di Dati Eterogenei
- Esercizio 7: Uso di Union con Array
- Esercizio 8: Union con Enum per Tipo di Dato
- Esercizio 9: Accesso ai Membri di una Union con Puntatori
- Esercizio 10: Uso di Union in una Funzione
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;}