📢 Nuovo Corso Bootstrap Completo disponibile!

Esercizi Union C++

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;
}