🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Esercizi Allocazione Dinamica C++

Codegrind Team•Jul 12 2024

Ecco degli esercizi semplici con soluzione per praticare le basi dell’allocazione dinamica in C++.

Esercizio 1

Allocare dinamicamente un intero e stamparne il valore.
#include <iostream>

int main() {
    int* ptr = new int;
    *ptr = 42;
    std::cout << "Valore dell'intero: " << *ptr << std::endl;
    delete ptr;
    return 0;
}

Esercizio 2

Allocare dinamicamente un array di interi e inizializzarlo con valori da 1 a 5.
#include <iostream>

int main() {
    int* arr = new int[5];
    for (int i = 0; i < 5; ++i) {
        arr[i] = i + 1;
    }
    for (int i = 0; i < 5; ++i) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }
    delete[] arr;
    return 0;
}

Esercizio 3

Allocare dinamicamente una matrice 3x3 e inizializzarla con valori incrementali.
#include <iostream>

int main() {
    int** matrix = new int*[3];
    for (int i = 0; i < 3; ++i) {
        matrix[i] = new int[3];
    }
    int val = 1;
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            matrix[i][j] = val++;
        }
    }
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
    for (int i = 0; i < 3; ++i) {
        delete[] matrix[i];
    }
    delete[] matrix;
    return 0;
}

Esercizio 4

Utilizzare l'allocazione dinamica per creare una copia di un array esistente.
#include <iostream>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int* copy = new int[5];
    for (int i = 0; i < 5; ++i) {
        copy[i] = arr[i];
    }
    for (int i = 0; i < 5; ++i) {
        std::cout << "copy[" << i << "] = " << copy[i] << std::endl;
    }
    delete[] copy;
    return 0;
}

Esercizio 5

Allocare dinamicamente una stringa e copiarvi una stringa esistente.
#include <iostream>
#include <cstring>

int main() {
    const char* original = "Ciao, mondo!";
    char* copy = new char[strlen(original) + 1];
    strcpy(copy, original);
    std::cout << "Copia della stringa: " << copy << std::endl;
    delete[] copy;
    return 0;
}

Esercizio 6

Allocare dinamicamente un array di strutture e inizializzarlo.
#include <iostream>

struct Punto {
    int x, y;
};

int main() {
    Punto* punti = new Punto[3];
    punti[0] = {1, 2};
    punti[1] = {3, 4};
    punti[2] = {5, 6};
    for (int i = 0; i < 3; ++i) {
        std::cout << "Punto " << i << ": (" << punti[i].x << ", " << punti[i].y << ")" << std::endl;
    }
    delete[] punti;
    return 0;
}

Esercizio 7

Utilizzare l'allocazione dinamica per gestire una lista collegata.
#include <iostream>

struct Nodo {
    int dato;
    Nodo* prossimo;
};

int main() {
    Nodo* testa = new Nodo{1, nullptr};
    testa->prossimo = new Nodo{2, nullptr};
    testa->prossimo->prossimo = new Nodo{3, nullptr};
    Nodo* current = testa;
    while (current) {
        std::cout << current->dato << " ";
        Nodo* daCancellare = current;
        current = current->prossimo;
        delete daCancellare;
    }
    std::cout << std::endl;
    return 0;
}

Esercizio 8

Allocare dinamicamente una matrice triangolare inferiore.
#include <iostream>

int main() {
    int n = 5;
    int** triangolare = new int*[n];
    for (int i = 0; i < n; ++i) {
        triangolare[i] = new int[i + 1];
        for (int j = 0; j <= i; ++j) {
            triangolare[i][j] = (i + 1) * (j + 1);
        }
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <= i; ++j) {
            std::cout << triangolare[i][j] << " ";
        }
        std::cout << std::endl;
    }
    for (int i = 0; i < n; ++i) {
        delete[] triangolare[i];
    }
    delete[] triangolare;
    return 0;
}

Esercizio 9

Utilizzare l'allocazione dinamica per creare una struttura dati per una coda.
#include <iostream>

struct Nodo {
    int dato;
    Nodo* prossimo;
};

class Coda {
private:
    Nodo* testa;
    Nodo* coda;

public:
    Coda() : testa(nullptr), coda(nullptr) {}

    void enqueue(int val) {
        Nodo* nuovoNodo = new Nodo{val, nullptr};
        if (coda) {
            coda->prossimo = nuovoNodo;
        } else {
            testa = nuovoNodo;
        }
        coda = nuovoNodo;
    }

    int dequeue() {
        if (!testa) {
            throw std::runtime_error("Coda vuota!");
        }
        int val = testa->dato;
        Nodo* daCancellare = testa;
        testa = testa->prossimo;
        if (!testa) {
            coda = nullptr;
        }
        delete daCancellare;
        return val;
    }

    ~Coda() {
        while (testa) {
            Nodo* daCancellare = testa;
            testa = testa->prossimo;
            delete daCancellare;
        }
    }
};

int main() {
    Coda coda;
    coda.enqueue(1);
    coda.enqueue(2);
    coda.enqueue(3);
    std::cout << "Dequeue: " << coda.dequeue() << std::endl;
    std::cout << "Dequeue: " << coda.dequeue

() << std::endl;
    std::cout << "Dequeue: " << coda.dequeue() << std::endl;
    return 0;
}

Esercizio 10

Utilizzare l'allocazione dinamica per creare una pila (stack).
#include <iostream>

struct Nodo {
    int dato;
    Nodo* prossimo;
};

class Pila {
private:
    Nodo* cima;

public:
    Pila() : cima(nullptr) {}

    void push(int val) {
        Nodo* nuovoNodo = new Nodo{val, cima};
        cima = nuovoNodo;
    }

    int pop() {
        if (!cima) {
            throw std::runtime_error("Pila vuota!");
        }
        int val = cima->dato;
        Nodo* daCancellare = cima;
        cima = cima->prossimo;
        delete daCancellare;
        return val;
    }

    ~Pila() {
        while (cima) {
            Nodo* daCancellare = cima;
            cima = cima->prossimo;
            delete daCancellare;
        }
    }
};

int main() {
    Pila pila;
    pila.push(1);
    pila.push(2);
    pila.push(3);
    std::cout << "Pop: " << pila.pop() << std::endl;
    std::cout << "Pop: " << pila.pop() << std::endl;
    std::cout << "Pop: " << pila.pop() << std::endl;
    return 0;
}