🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Esercizi Union C++

Codegrind Team•Jul 12 2024

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