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.
giovedì 17 febbraio 2011
Testi di esami anni precedenti
Disponibili i testi di alcuni esami del 2008 e del 2009. Nei prossimi giorni pubblichero' alcune possibili soluzioni.
Salve, volevo chiederle se all'esame che si terrà giorno "28-02-2011" (ing. delle telecomunicazioni che hanno nel piano di studio Programmazione (8 CFU) o di ing. informatica che hanno Programmazione (5 CFU)), la prova sarà svolta al calcolatore o "su foglio di carta". Inoltre, essendo fuoricorso alla triennale e con cdl 083, è normale che mi dice che il mio corso di laurea non combacia con quello previsto nella pagina dell'esame (332)? Le chiedo ciò, in quanto ho nel piano di studi programmazione da 5 CFU ed è l'unico esame prenotabile che presenta tale descrizione.
L'esame del 28 e' "su carta", quello "al computer" sara' invece il 25. Se tu hai programmazione da 5CFU nel piano di studi puoi scegliere di fare l'esame come preferisci. Se vuoi fare quello al computer iscriviti sul portale a quello da 5CFU, e stampi cosi' lo statino, e mi avvisi che invece farai quello del 25 al computer con una email.
Salve, volevo chiederle una delucidazione. Ho effettuato l'overloading dell'operatore << per la classe B. Quando ho un oggetto di B e faccio ad esempio cout << b tutto funziona bene. Ho invece delle difficoltà invece quando b é un puntatore a B. Infatti se b é un puntatore a B, cout << b stampa l'indirizzo, mentre cout << *b non compila.
In base a quanto scrivi non c'e' alcun motivo per cui non debba funzionare. Posta il codice, o un link al codice, che vedo meglio dove puo' essere il problema.
Salve prof, riguardo al compito del LABIRINTO, stavo provando a fare il metodo muovi del ragno in maniera un pò più complicata rispetto a quella che ho trovato in una sua soluzione. Dato che il ragno deve mantenere memoria del movimento precedente, (cioè deve possibilmente evitare di tornare indietro) ho pensato di fare una funzione differenziata per ogni spostamento(nord,est,sud, ovest), memorizzare queste funzioni in un array di puntatori a funzioni, e richiamarle in un ciclo for deferenziando l'array di puntatori. Per quanto riguarda il movimento precedente vorrei mettere nella classe ragno un puntatore a funzione separato(*precfunz) a cui assegno di volta in volta il riferimento alla funzione utilizzata, così nel passo successivo verifico che se il puntatore a funzione *precfunz ha indirizzo uguale alla funzione cardinale(nord,est,sud,vest) attuale che sto tentando di utilizzare salta alla funzione successiva e se eventualmente nn riesce nel movimento alla fine dovrebbe eseguira la funzione puntata dal puntatore a funzione *precfunz. Spero di essere stato abbastanza chiaro. :) Ora mi chiedo se una cosa del genere sia fattibile...perchè ho provato a seguire le direttive e a implementare il tutto ma non riesco proprio , neanche a livello di assegnare nel costruttore di ragno le 4 funzioni cardinali all'array di puntatori.
la funzione direzione nord per esempio ha prototipo: void nord(Labirinto *);
mentre l'array di puntatori lo dichiaro come: void (*funz[4]) (Labirinto *);
poi nel costruttore di ragno assegno: funz[0]=nord; funz[1]=sud; ecc... ma dà l'errore: in Ragno.cpp: argument of type `void (Ragno::)(Labirinto*)' does not match `void (*)(Labirinto*)'
Dal punto di vista sintattico le cose non funzionano perche' probabilmente dai frammenti di codice intuisco che fai un po' di miscuglio fra funzioni esterne e metodi e relativi puntatori e questo non piace al compilatore. Da un punto di vista piu' ampio comunque si dovrebbe evitare di usare in generale puntatori a funzioni che, sebbene utilissimi in C, non sono essenziali in C++. Nel caso specifico, a parte il discorso sui puntatori a funzione, non credo che il tuo approccio sia corretto perche' non devi evitare che venga fatto due volte lo stesso movimento ma evitare che alla mossa successiva si annulli la precedente (se e' andato a est deve evitare di andare a ovest non ancora ad est...).
Le funzioni di cui ho scritto sono tutti metodi o puntatori della classe ragno, ma probabilmente non è corretto l'utilizzo che ne faccio... e quindi il compilatore non ritrova i tipi che si aspetta.
Per quanto riguarda l'esercizio, invece, l'approccio giusto dovrebbe essere quello di evitare che come prima mossa venga fatta quella opposta alla precente, quindi se per esempio il ragno si è spostato a nord al passo successivo l'opzione sud deve essere l'ultima possibile, e io invece per come ho fatto, risultava che la stessa mossa non poteva essere effetuata per due volte consecutive, ma chiaamente mi sbagliavo... Grazie professore
Salve, volevo chiederle se all'esame che si terrà giorno "28-02-2011" (ing. delle telecomunicazioni che hanno nel piano di studio Programmazione (8 CFU) o di ing. informatica che hanno Programmazione (5 CFU)), la prova sarà svolta al calcolatore o "su foglio di carta".
RispondiEliminaInoltre, essendo fuoricorso alla triennale e con cdl 083, è normale che mi dice che il mio corso di laurea non combacia con quello previsto nella pagina dell'esame (332)?
Le chiedo ciò, in quanto ho nel piano di studi programmazione da 5 CFU ed è l'unico esame prenotabile che presenta tale descrizione.
L'esame del 28 e' "su carta", quello "al computer" sara' invece il 25. Se tu hai programmazione da 5CFU nel piano di studi puoi scegliere di fare l'esame come preferisci.
RispondiEliminaSe vuoi fare quello al computer iscriviti sul portale a quello da 5CFU, e stampi cosi' lo statino, e mi avvisi che invece farai quello del 25 al computer con una email.
Salve, volevo chiederle una delucidazione.
RispondiEliminaHo effettuato l'overloading dell'operatore << per la classe B.
Quando ho un oggetto di B e faccio ad esempio
cout << b
tutto funziona bene. Ho invece delle difficoltà invece quando b é un puntatore a B.
Infatti se b é un puntatore a B, cout << b stampa l'indirizzo, mentre cout << *b non compila.
In base a quanto scrivi non c'e' alcun motivo per cui non debba funzionare. Posta il codice, o un link al codice, che vedo meglio dove puo' essere il problema.
RispondiEliminaAlla fine ho trovato il problema, avevo dimenticato un include.
RispondiEliminaSalve prof, riguardo al compito del LABIRINTO, stavo provando a fare il metodo muovi del ragno in maniera un pò più complicata rispetto a quella che ho trovato in una sua soluzione.
RispondiEliminaDato che il ragno deve mantenere memoria del movimento precedente, (cioè deve possibilmente evitare di tornare indietro) ho pensato di fare una funzione differenziata per ogni spostamento(nord,est,sud, ovest), memorizzare queste funzioni in un array di puntatori a funzioni, e richiamarle in un ciclo for deferenziando l'array di puntatori.
Per quanto riguarda il movimento precedente vorrei mettere nella classe ragno un puntatore a funzione separato(*precfunz) a cui assegno di volta in volta il riferimento alla funzione utilizzata, così nel passo successivo verifico che se il puntatore a funzione *precfunz ha indirizzo uguale alla funzione cardinale(nord,est,sud,vest) attuale che sto tentando di utilizzare salta alla funzione successiva e se eventualmente nn riesce nel movimento alla fine dovrebbe eseguira la funzione puntata dal puntatore a funzione *precfunz.
Spero di essere stato abbastanza chiaro. :)
Ora mi chiedo se una cosa del genere sia fattibile...perchè ho provato a seguire le direttive e a implementare il tutto ma non riesco proprio , neanche a livello di assegnare nel costruttore di ragno le 4 funzioni cardinali all'array di puntatori.
la funzione direzione nord per esempio ha prototipo:
void nord(Labirinto *);
mentre l'array di puntatori lo dichiaro come:
void (*funz[4]) (Labirinto *);
poi nel costruttore di ragno assegno:
funz[0]=nord;
funz[1]=sud; ecc... ma dà l'errore:
in Ragno.cpp: argument of type `void (Ragno::)(Labirinto*)' does not match `void (*)(Labirinto*)'
Dal punto di vista sintattico le cose non funzionano perche' probabilmente dai frammenti di codice intuisco che fai un po' di miscuglio fra funzioni esterne e metodi e relativi puntatori e questo non piace al compilatore.
RispondiEliminaDa un punto di vista piu' ampio comunque si dovrebbe evitare di usare in generale puntatori a funzioni che, sebbene utilissimi in C, non sono essenziali in C++.
Nel caso specifico, a parte il discorso sui puntatori a funzione, non credo che il tuo approccio sia corretto perche' non devi evitare che venga fatto due volte lo stesso movimento ma evitare che alla mossa successiva si annulli la precedente (se e' andato a est deve evitare di andare a ovest non ancora ad est...).
Le funzioni di cui ho scritto sono tutti metodi o puntatori della classe ragno, ma probabilmente non è corretto l'utilizzo che ne faccio... e quindi il compilatore non ritrova i tipi che si aspetta.
RispondiEliminaPer quanto riguarda l'esercizio, invece, l'approccio giusto dovrebbe essere quello di evitare che come prima mossa venga fatta quella opposta alla precente, quindi se per esempio il ragno si è spostato a nord al passo successivo l'opzione sud deve essere l'ultima possibile, e io invece per come ho fatto, risultava che la stessa mossa non poteva essere effetuata per due volte consecutive, ma chiaamente mi sbagliavo...
Grazie professore