Lezione 6
Lezione 6
Puntatori come data membri

In questa sesta lezione affronteremo il problema dell'implementazione di una classe Vettore, rappresentante un generico vettore double e vedremo come questa classe abbia delle proprietà migliori dell'analoca struttura introdotta nella seconda lezione.

ESERCIZIO 6.0 - Creazione della classe Vettore :
Implementare una classe che abbia come membri un intero (dimensione del vettore) ed un puntatore a double (puntatore alla zona di memoria dove sono immagazzinati i dati). Questa è una versione migliorate della struttura Vettore realizzata nella lezione 2.
Implementare:
  1. Un costruttore di default, che assegni valori nulli alla lunghezza del vettore ed al puntatore.
  2. Un costruttore che abbia come argomento un intero: questo deve creare un vettore di lunghezza uguale all'intero e tutte le componenti nulle (usando un new per allocare la memoria necessaria).
  3. Un distruttore: deve chiaramente deallocare con delete[] la zona di memoria allocata con new.
  4. Dei metodi per inserire e leggere i valori della componenti: questi metodi devono controllare che l'indice delle componenti richieste sia compatibile con la lunghezza del vettore.
Si verifichi che una classe realizzata in questo modo si comporta in modo strano se usiamo l'operatore di assegnazione. Questo è un problema generico quando abbiamo classi con puntatori come data membri: bisogna assicurarsi che ciascuna istanza della classe abbia la sua propria zona di memoria.
Affinché la classe si comporti in maniera consistente, è necessario implementare anche:
  1. un costruttore che abbia come argomento un altro vettore (copy constructor): deve creare una copia del vettore argomento.
  2. l'overloading dell'operatore di assegnazione, assicurandosi che i dati vengano copiati dal vettore di partenza a quello di arrivo.

Brevi Richiami
Header file della classe

Programma di test

Copy constructor

Operatore di assegnazione

Il puntatore this

ESERCIZIO 6.1 - Da struttura a classe (da consegnare):
Creare una classe VettoreDati derivata da Vettore, che implementi i metodi necessari per svolgere l'esercizio 2.2. In particolare la classe deve implementare:
  1. Un construttore che legga N elementi da un file (simila alla funzione read).
  2. Metodi per stampare il vettore di dati su terminale o su di un file (due versioni che effettuano l'overload della funzione print).
  3. Un metodo che effettua l'ordinamento del vettore di dati

Verificare l'ordine di complessità dell'algoritmo di ordinamento realizzato: eseguire il codice leggendo un numero N di valori dal file /home/comune/labTNDS_aa1112_materiale/lezione2/data.txt, variando N, da qualche centinaia a qualche decina di migliaia e valutandone il tempo di esecuzione. Costruire una tabella con la differenza tra il valore misurato e quello calcolato assumendo una dipendenza:
t = aN2 + bN

Brevi Richiami
Ordine di complessità dell'ordinamento.

ESERCIZIO 6.2 - Quicksort:
Se l'algoritmo di ordinamento realizzato nell'esercizio precedente è di ordine 2, provare la seguente versione di quicksort e verificare che il tempo di ordinamento è quasi lineare con N.

Brevi Richiami
Implementazione di quicksort



ESERCIZIO 6.3 - Statistica:
Aggiungere alla classe VettoreDati metodi utili per l'analisi statistica del contenuto del vettore, in particolare metodi per calcolare:
  • media
  • varianza
  • deviazione standard
  • mediana (il numero a metà della serie ordinata dei valori del vettore)
  • coefficiente di correlazione rispetto ad un altro vettore di dati.

Manipolazione di dati con la classe vector

Back to Home Page