Esercitazioni
del corso di Laboratorio di Programmazione e Calcolo
n. 5
Array e Puntatori
Attenzione: il programma di questa esercitazione verra'
valutato
Procedure preliminari
- controllate che nella HOME
directory sia presente il file con i vostri nomi
- create un sottodirettorio es_5
- spostatevi in es_5 Solo
i files contenuti in /home/did.../es_5 verranno presi in
considerazione!
- copiate
nella directory es_5 i file CorpoCeleste.h e
CorpoCeleste.cc che avete scritto durante le scorse
esercitazioni
- usate emacs per creare
il codice del programma richiesto (esempio: emacs esercit_5.cpp &):
ricordatevi che ogni programma dovra'
iniziare con una riga di commento in cui indicherete i
nomi dei componenti del gruppo presenti
all'esercitazione
- il programma verra' valulatato se
funziona (compilazione, linking e corretta esecuzione
secondo quanto richiesto) e in base alla chiarezza con
cui e' scritto (inserite alcuni commenti nel
testo e organizzate iterazioni e selezioni in maniera
chiara)
Obiettivo dell'esercitazione
L'esercitazione
vuole aiutarvi ad acquisire una maggiore familiarita' con
- l'uso degli array
- l'uso dei puntatori
- l'uso dell'istruzione new (e
della corrispondente istruzione delete)
In particolare dovrete mettere in evidenza le modalita' di
creazione e di distruzione degli oggetti istanziati in maniera
dinamica e confrontarle con il comportamento di gestione
della memoria che gia' conoscete.
Il testo dell'esercitazione
Costruire un programma main che
- riempia
un array di double e un
array di oggetti
CorpoCeleste;
- ne stampi su video l'elenco con le caratteristiche
- scorra gli array e ne visualizzi il contenuto utilizzando l'indice dell'array oppure il puntatore
- riempia un vettore puntatori a double e di puntatori a oggetti di tipo CorpoCeleste.
- ne stampi su video l'elenco con le
caratteristiche
- scorra gli array e ne visualizzi il contenuto utilizzando l'indice dell'array oppure il puntatore
Se scrivete anche il valore del puntatore (a double e a
CorpoCeleste) e del puntatore di puntatore, potete valutare quanto
e' "grande" (cioe' quanto spazio occupa in memoria) un double o un
oggetto di tipo CorpoCeleste.
Una volta costruito il programma richiesto
- valutate che cosa accade se
memorizzate un oggetto istanziato
in uno scope
- valutate che cosa accade se memorizzate il puntatore ad un oggetto
istanziato in uno scope
- utilizzate l'allocazione
dinamica della memoria ( istruzione new ) per
istanziare gli oggetti all'interno di uno scope e valutate
il diverso comportamento rispetto al caso precedente
- istanziate anche i vettori
(di double, di oggetti CorpoCeleste, di puntatori a double e
puntatori a CorpoCeleste) e valutatene il diverso comportamento
Inserite nel programma le
istruzioni delete
richieste (devono corrispondere alle istruzioni new ) e
valutate, tramite l'uso del distruttore intelligente, il diverso
comportamento della distruzione degli oggetti istanziati in
maniera dinamica.
Osservazioni
1) Per
rendere piu' esplicito il ruolo del Distruttore, e' utile
implementare il Distruttore in forma intelligente, con un
messaggio che avverta l'utente dell'avvenuta distruzione.
2) Per
permettere di istanziare un Corpoceleste o un vettore di
oggetti di tipo CorpoCeleste, e' necessario introdurre il
costruttore senza parametri, che viene spesso utilizzato. In
CorpoCeleste.h e’
implementato tale costruttore: verificare che se non
e’ presente il Costruttore senza parametri, non e’
possibile istanziare un vettore di oggetti di tipo
CorpoCeleste
Se volete, potete implementare
un Costruttore intelligente, con un messaggio che vi aiuti a
capire che cosa sta succedendo e come viene gestita la memoria.
3)
Per permettervi di scrivere una stringa in funzione di
un indice di un for (ad esempio "Ausi_1", "Ausi_2", ecc.) ad
esempio per assegnare un diverso nome agli oggetti
CorpoCeleste istanziati in un loop, puo' essere utile la
seguente serie di istruzioni
#include
<string> // da aggiungere,
all'inizio del programma,
#include
<sstream> // agli altri include
gia' presenti
........
ostringstream os ; // os e' un nome
a vostra scelta
os << i ;
// i e' il numero, gia' esistente,
// che si vuole
scrivere come carattere
string s = os.str(); // ora s contiene
i come carattere.
// Ad
esempio, se il valore di i era 3 ora s vale "3"