Blog del corso di Programmazione (9 CFU) tenuto da Marco La Cascia presso l'Universita' di Palermo per il corso di laurea in Ingegneria Informatica e delle Telecomunicazioni. Tratta la programmazione a oggetti in Java.
venerdì 28 gennaio 2011
Testo esercitazione 10
Facendo seguito alla richiesta di alcuni di voi che chiedevano dove trovare esercizi sugli argomenti trattati a lezione pubblico in anticipo il testo dell'esercitazione 10. Come vedrete si tratta di un'esercitazione molto più corposa di quelle che lascio abitualmente e che certamente non potreste svolgere nelle sole 3 ore di esercitazione di martedì. Vi invito quindi a cominciare a svilupparla autonomamente prima di martedì.
Iscriviti a:
Commenti sul post (Atom)
il rettangolo si deve trovare sempre in uno spazio di 20x25 no? ed ogni carattere rappresenta per esempio 1cm quindi eventualmente il rettangolo potrebbe avere dimensione max 20x25 cm? .. sto facendo un esempio
RispondiEliminaEsatto, il rettangolo deve essere di dimensione e posizione tale da rientrare in uno spazio 20x25. La classe deve fare gli opportuni controlli di validita'. Ad esempio se e' 20x25 deve trovarsi in posizione particolare cioe' col vertice in basso a sinistra coincidente con l'origine dello spazio.
RispondiEliminasto implementando l'esercizio sette , con l'elenco dinamico , Studente **elenco; per quanto riguarda l'inizzializzazione dando una dimensione a tale lista , va tutto ok , mi sorgono dei problemi nel momento in cui voglio ridefinire la dimensione dell'elenco perché magari risulta essere pieno , qst è il codice del metodo :
RispondiEliminavoid Esame::setReSizeElenco(){ // aumenta la dimensione dell'elenco
int i;
if(DIM==0){
//elenco inizializzato con il costruttore di default
elenco = new Studente*[2];//do dimensione 2
elenco[0]=0; elenco[1]=0;
}
else {
Studente *tmp[DIM];
for(i=0 ; i<DIM ; i++){
tmp[i]=elenco[i];
delete elenco[i];
}
DIM*=2;
elenco = new Studente*[DIM];
for(i=0 ; i<(DIM/2) ; i++)elenco[i]=tmp[i];
for(i=(DIM/2); i<DIM; i++)elenco[i]=0;
}//fine else
}//fine metodo
mi sa che sbaglio qualcosina con la gestione della memoria
ho risolto , nn allocavo gli oggeti nel vettore di puntatori a Studenti tmp , non deallocavo il vettore di puntatori , non riallocavo gli oggetti , un pasticcio XD ,il codice corretto ( almeno mi funziona..) è questo :
RispondiEliminavoid Esame::setReSizeElenco(){ // aumenta la dimensione dell'elenco
int i;
if(DIM==0){
elenco = new Studente*[2];
elenco[0]=0; elenco[1]=0;
}
else {
Studente *tmp[DIM];
for(i=0 ; i<DIM ; i++){
tmp[i]=new Studente(*elenco[i]);
delete elenco[i];
}
delete []elenco;
DIM*=2;
elenco = new Studente*[DIM];
for(i=0 ; i<(DIM/2) ; i++)elenco[i]=new Studente(*tmp[i]);
for(i=(DIM/2); i<DIM; i++)elenco[i]=0;
}
}
C'e' qualcosa che non va indipendentemente dal fatto che funzioni o meno. Infatti crei il vettore tmp di dimensione DIM (che a quanto vedo non e' costante perche' dopo fai DIM*=2). In questo caso il comportamento e' imprevedibile perche' non saprai mai quanto veramente grande e' il vettore creato. Avresti dovuto usare la new per creare il vettore tmp di DIM puntatori a Studente.
RispondiEliminaPer il resto sembra ok.
DIM è un attributo di esame , indica la dimensione corrente dell'elenco , cmq allego il programma visto che oggi nn posso venire è nn posso farglielo vedere di presenza.
RispondiEliminahttp://www.megaupload.com/?d=TCJ03NVY
Se avessi voluto implementare il metodo print cn il polimorfimo come avrei dovuto fare?
Si, ho visto il codice e il problema e' quello che ti dicevo prima. Non puoi creare un array locale con dimensione non nota a tempo di compilazione. Se il gcc (che sta sotto il Dev) implementasse lo standard alla lettera neanche dovrebbe compilare.
RispondiEliminaLa riga Studente *tmp[DIM]; la devi sostituire con Studente** tmp = new Studente*[DIM]; e devi anche accertarti di eliminare la memoria puntata da tmp quando non ti serve piu'.
ok quindi :
RispondiEliminafor(..) delete tmp[i];
delete []tmp;
un qualcosa che rikieda meno righe di codice nn c'è? In questo modo alloco alloco un nuovo vettore di Studenti , faccio l'assegnazione , elimino il vecchio vettore di Studenti , ne raddopio la dimensione , lo rialloco e poi cancello il vettore di oggetti temporaneo..
Questo commento è stato eliminato dall'autore.
RispondiEliminaLa funzione setResizeElenco probabilmente la puoi scrivere in maniera piu' semplice senza bisogno di creare un vettore di oggetti temporaneo. Quello che devi ridimensionare e' infatti un vettore di puntatori e non un vettore di oggetti.
RispondiEliminaHo modificato il codice in questo modo :
RispondiEliminaStudente **tmp=new Studente*[DIM];
for(i=0 ; i<DIM ; i++)tmp[i]=elenco[i];
delete []elenco;
DIM*=2;
elenco = new Studente*[DIM];
for(i=0 ; i<(DIM/2) ; i++)elenco[i]=tmp[i];
for(i=(DIM/2); i<DIM; i++)elenco[i]=0;
il delete [] elenco è corretto? o avrei potuto ometterlo e scrivere direttamente elenco = new Studente*[DIM]?
Adesso il codice va bene, come vedi non c'era motivo di creare oggetti temporanei ma bastava gestire bene i vettori di puntatori.
RispondiEliminaHai fatto bene a fare la delete[] elenco altrimenti avevi un classico memory leak. In pratica il programma funzionava lo stesso ma ogni volta che facevi una resize lasciavi un blocco di memoria allocato ma non piu' utilizzato e la memoria, anche se e' tanta, prima o poi puo' anche finire...
ok ) , per quanto riguarda l'esercizio 9 ho un pò le idee confuse .. ad esempio nella classe palla devo mette le coordinate della sua posizione rispetto al tavolo ( immaginandolo come una matrice di NxM dimensioni?? con le buche nei vertici e a metà dei due lati)la velocità e la direzione cn cui viaggia?(dati che verranno modificati nel caso in cui la palla si trova nella casella di un altra palla e quindi cambia direzione? ,in quel caso cosa accadrebbe alla velocità?? devo suppore inoltre che le palle viaggino con velocità costante? o consiero una certa ACCELLERAZIONE? per esempio , mettiamo caso il biliardo sia grande 40larghezza X80altezza...e posiziono una sola palla in basso a sx accanto al vertice... suppondo abbia una direzione inIZIALE laterale -> ed una velocità costante di 10cm/s .. quindi in un ciclo( un unità di tempo ) la palla di spostera di 10 caselle verso destra? (supposto che ogni casella della matrice misuri 1cm) .. èqst il ragionamento da seguire?
RispondiEliminamentre la classe tavolo avrà come attributi la sua dimensione e un vettore di 9 puntatori a oggetti palla? ... + tutti i vari metodi..
poi il tiro nell'unità di tempo deve avvenire simultaneamente per le 3 palle ? oppure una palla per volta?
Non conviene usare una matrice di caselle per rappresentare il tavolo. E' piu' semplice lavorare in coordinate continue per cui ogni palla ha posizione e velocita' e a ogni passo di simulazione questi attributi vengono modificati (la posizione viene ricalcolata in base alla velocita' e la velocita' viene ridotta a causa dell'attrito).
RispondiEliminaHo pubblicato una possibile soluzione semplificata del problema che non tiene conto di possibili urti fra palle ma solo di urti fra palla e sponda.