Ecco degli esercizi con soluzione per praticare l’utilizzo delle union in C++.
Esercizio 1: Introduzione alle Union
Creare una `union` che può contenere un intero, un float o un carattere. Utilizzare la union per assegnare e stampare ciascun valore.
#include <iostream>
union MyUnion { int i; float f; char c;};
int main() { MyUnion u;
u.i = 42; std::cout << "Intero: " << u.i << std::endl;
u.f = 3.14f; std::cout << "Float: " << u.f << std::endl;
u.c = 'A'; std::cout << "Carattere: " << u.c << std::endl;
return 0;}
Esercizio 2: Dimensione delle Union
Determinare e stampare la dimensione di una `union` che contiene un intero, un float e un carattere.
#include <iostream>
union MyUnion { int i; float f; char c;};
int main() { std::cout << "Dimensione della union: " << sizeof(MyUnion) << " byte" << std::endl; return 0;}
Esercizio 3: Union con Struct
Creare una `union` che contiene una struct e un array di caratteri. Utilizzare la union per assegnare e stampare i valori della struct e dell'array di caratteri.
#include <iostream>#include <cstring>
struct Point { int x; int y;};
union MyUnion { Point p; char str[8];};
int main() { MyUnion u;
u.p = {10, 20}; std::cout << "Point: (" << u.p.x << ", " << u.p.y << ")" << std::endl;
strcpy(u.str, "Hello"); std::cout << "Stringa: " << u.str << std::endl;
return 0;}
Esercizio 4: Anonymous Union
Utilizzare un `anonymous union` all'interno di una struct per memorizzare dati alternativi.
#include <iostream>
struct MyStruct { union { int i; float f; };};
int main() { MyStruct s; s.i = 42; std::cout << "Intero: " << s.i << std::endl;
s.f = 3.14f; std::cout << "Float: " << s.f << std::endl;
return 0;}
Esercizio 5: Union con Funzioni Membro
Aggiungere funzioni membro a una `union` per assegnare e stampare i valori dei suoi membri.
#include <iostream>
union MyUnion { int i; float f;
void setInt(int value) { i = value; }
void setFloat(float value) { f = value; }
void print() { std::cout << "Intero: " << i << ", Float: " << f << std::endl; }};
int main() { MyUnion u; u.setInt(42); u.print(); u.setFloat(3.14f); u.print(); return 0;}
Esercizio 6: Union e Array
Utilizzare una `union` per memorizzare alternativamente un array di interi e un array di float. Stampare i valori degli array.
#include <iostream>
union MyUnion { int intArray[4]; float floatArray[4];};
int main() { MyUnion u;
u.intArray[0] = 1; u.intArray[1] = 2; u.intArray[2] = 3; u.intArray[3] = 4; std::cout << "Array di interi: "; for (int i = 0; i < 4; ++i) { std::cout << u.intArray[i] << " "; } std::cout << std::endl;
u.floatArray[0] = 1.1f; u.floatArray[1] = 2.2f; u.floatArray[2] = 3.3f; u.floatArray[3] = 4.4f; std::cout << "Array di float: "; for (int i = 0; i < 4; ++i) { std::cout << u.floatArray[i] << " "; } std::cout << std::endl;
return 0;}
Esercizio 7: Uso Pratico delle Union
Creare una `union` per rappresentare un indirizzo IP che può essere IPv4 o IPv6. Implementare l'assegnazione e la stampa di entrambi i tipi di indirizzo.
#include <iostream>#include <iomanip>
union IPAddress { uint32_t ipv4; uint8_t ipv6[16];};
int main() { IPAddress ip;
ip.ipv4 = 0xC0A80001; // 192.168.0.1 in esadecimale std::cout << "IPv4: " << std::hex << std::setw(8) << std::setfill('0') << ip.ipv4 << std::endl;
uint8_t ipv6Addr[16] = {0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34, 0x00, 0x00}; std::copy(std::begin(ipv6Addr), std::end(ipv6Addr), std::begin(ip.ipv6)); std::cout << "IPv6: "; for (const auto& byte : ip.ipv6) { std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte) << " "; } std::cout << std::endl;
return 0;}
Esercizio 8: Union e CompatibilitĂ con C
Creare una `union` compatibile con C che rappresenta un valore che può essere un intero, un float o una stringa. Utilizzare la union in un programma C++.
#include <iostream>#include <cstring>
extern "C" { union MyUnion { int i; float f; char str[20]; };}
int main() { MyUnion u;
u.i = 42; std::cout << "Intero: " << u.i << std::endl;
u.f = 3.14f; std::cout << "Float: " << u.f << std::endl;
strcpy(u.str, "Hello, World!"); std::cout << "Stringa: " << u.str << std::endl;
return 0;}