Disponibili tutti i testi di esami assegnati negli ultimi anni. Come vedrete molti testi sono simili fra loro e quindi li ho raggruppati in tre categorie.
Quando vi esercitate non dimenticate mai di tenere d'occhio il tempo che impiegate. Ricordatevi che non è importante "cosa sapete fare" ma "cosa sapete fare IN DUE ORE"...
Ho provato a fare il compito "Calendari Esami" però ho riscontrato un problema quando devo accedere ad alcuni dati membro, ovvero: la mia classe "principale" sarà CorsoDiLaurea così fatta:
RispondiEliminaclass CorsoDiLaurea
{
public:
CorsoDiLaurea();
~CorsoDiLaurea();
void AddExam();
void AddStudent();
void PrintExam();
void DeleteStudentFromExam();
void AddStudentToExam();
private:
Esame* e[50];
Studente* s[500];
};
i dati membro saranno dati i cui tipi sono altre classi definite.
Se io per implementare un metodo della classe CorsoDiLaurea avessi bisogno di accedere ai dati membro delle altre classi come potrei fare?(per esempio: la classe Studente avrà come dato membro la matricola e io tramite Studente* s voglio accedere a matricola)
Ho provato ad accedere con le seguenti sintassi:
s[i].matricola -> ma mi dice che matricola non è stata definita;
s[i]->matricola -> ma per poter far funzionare il tutto mi obbliga a mettere i dati membro public.
Inoltre ho riscontrato lo stesso problema se volessi accedere anche al dato membro Studenti* iscritti della classe Esame, e quindi volendo usufruirne con il dato membro di CorsoDiLaurea Esame* e avrei i problemi precedentemente descritti con le sintassi:
e[i].iscritti e e[i]->iscritti.
La ringrazio anticipatamente per il suo aiuto e le auguro buone feste.
Basta che definisci delle funzioni get pubbliche e usi quelle per accedere ai dati privati. Ad esempio in Studente metterai il metodo pubblico string getMatricola() e poi accedi alla matricola dello studente i-esimo di in CorsoDiLaurea come s[i]->getMatricola().
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaConviene che segui cosa dice il testo e non fai le classi Rettilineo e Curva (che non sarebbero di grande utilita') ma definisci la struttura di una pista con l'array di bool come avevi correttamente pensato.
RispondiEliminaPer strutturare il programma devi fare il solito array di puntatori ad Automobile che ciclicamente farai avanzare (questo programma e' molto simile al labirinto che abbiamo visto a lezione). Per farli avanzare devi prima interrogare la pista per sapere se la posizione corrente e' curva o rettilineo e calcolare la nuova posizione di conseguenza.
Attento che, proprio perche' il metodo di automobile che la fa avanzare interagisce con pista e pista include le automobili, dovrai usare le dichiarazioni anticipate di classe e non le include standard quando scrivi le classi automobile e pista.
ma stavolta dovrò considerare sempre una matrice di bool o un semplice array?
Eliminaperchè se usassi un array le auto dovrebbero andare solo avanti ,quindi il metodo avanza dovrebbe spostare la x avanti di 1.
cosa intende quando dice che "potrebbe ad esempio descrivere il percorso come una collezione ordinata di tratti rettilinei e curve"?
inoltre come faccio a interagire col tempo?
devo usare qualche metodo particolare o usare la classe time?
Il modo piu' semplice di impostare il programma e' di mettere in pista un array di N booleani che rappresentano la sequenza di pezzi che formano la pista e che ad esempio avra' true per curve e false per rettilinei. Siccome i pezzi hanno tutti la stessa lunghezza, se la macchina si trova in posizione 220 tu sai che si trova nel pezzo 220/5 ossia il pezzo 4 e dall'array di cui sopra puoi vedere se si tratta di curva o rettilineo e calcolare la nuova posizione di conseguenza.
EliminaIl tempo non lo devi considerare, tu ragiona in termini di passi di simulazione, ogni volta che chiami il metodo che fa avanzare le macchine supponi che sia passato un secondo.
Salve professore vorrei chiederle un suggerimento sul testo dell'esercizio "Elezioni".Il testo dice:
RispondiElimina"Scrivete quindi un programma che all’avvio crea un’oggetto seggio e carica i dati di studenti e candidati (prevedete semplicemente nel costruttore di default la creazione di tre candidati e una decina di studenti)."
ma a quale costruttore di default si riferisce a quello di seggio?
dovremmo avere una cosa del tipo:
Candidato a("Mario","Rossi",0588765,123);
Candidato b("Mario","Giuo",0543765,324);
Candidato c("Giuseppe","Roi",0348765,135);
Candidato s[3]={a,b,c};
Seggio x(s,t); //t è un array di 10 studenti costruito come s
?
in attesa di risposta la ringrazio sin d'ora
e poi un altra cosa.il meccanismo che prevede se lo studente abbia già votato o meno potrebbe essere un semplice bool che scorre tutti gli studenti e restituisce true o false a seconda che abbiano votato o meno?
EliminaPer semplificare il compito ed evitarvi l'interazione con l'utente e metodi per l'aggiunta di studenti e candidati avevo pensato che il costruttore di default di Seggio poteva creare 3 candidati e 10 studenti senza interazione con l'utente ma con valori direttamente scritti nel codice. Conviene comunque fare sempre array di puntatori e creare gli oggetti con le new.
EliminaRiguardo il meccanismo per sapere se uno studente ha gia' votato la cosa piu' semplice e' inserire un flag bool in studente, inizialmente settato a false, che indica se lo studente ha gia' votato, e metodi per leggere e modificare questo flag.
Se io quindi volessi scrivere
EliminaCandidato a("Mario","Rossi",0588765,123);
Candidato b("Mario","Giuo",0543765,324);
Candidato c("Giuseppe","Roi",0348765,135);
Studente d(.......)
Studente e(...)
.
.
Studente o(....)
e poi assegnare al costruttore di Seggio direttamente i 3 candidati scritti
sopra e i 10 studenti scritti sopra dovrei usare quindi degli array di oggetti
e non dei puntatori a oggetti.
dovrei cioè scrivere la classe Seggio in questo modo:
class Seggio{
public:
Seggio(Candidato a[3],Studente b[10]);
void elencocandidati();
void vota();
void statistiche();
bool havotato(Studente *p);
private:
int voticandidato1,voticandidato2,voticandidato3,schedabianca,nulli;
Studente s[200];
Candidato c[10];
};
e fare poi l'assegnamento nel costruttore con:
Seggio::Seggio(Candidato a, etc..,Studente o){
c[0] = a;
c[1] = b;
.
.
s[0] = o;
}
Si, a parte il prototipo di Seggio che chiaramente non deve essere come hai scritto nella classe ma come hai scritto nell'implementazione, questa sarebbe una soluzione tecnicamente corretta.
EliminaResta comunque il difetto di fondo di creare un array di 200 oggetti studente anche se poi ne usi solo 10 e in un programma reale certamente non dovresti farlo.
un ultima domanda professore.
Eliminanell'esame invece chiamato "Gestione biblioteca digitale" il testo chiede "Per semplificare il debug create nel costruttore di default di Biblioteca un utente amministratore, due utenti generici e qualche libro che userete per testare le funzionalità".
sarebbe più convenevole scrivere:
int main(){
Amministratore a("admin","admin","Mario","Rossi");
Utentegen b("ciao","mario","Giuseppe","Ba");
Utentegen c("hello","world","Carlo","Fracci");
Libro d("Manzoni","Promessi sposi",123);
Libro e("Dante","Divina Commedia",345);
Libro f("Eco","Nome della rosa",877);
Biblioteca r(a,b,c,d,e,f);
string user, pwd;
while(true){
cout << "Username: ";
cin >> user;
cout << "Password: ";
cin >> pwd;
b.login(user, pwd);
}
}
oppure
int main(){
Biblioteca b;
b.Add(new Aministratore("admin","admin","Mario","Rossi"));
b.Add(new Utentegen("ciao","mario","Giuseppe","Ba"));
b.Add(new Utentegen("hello","world","Carlo","Fracci"));
b.Add(new Libro("Manzoni","Promessi sposi",123));
b.Add(new Libro("Dante","Divina Commedia",345));
b.Add(new Libro("Eco","Nome della rosa",877));
string user, pwd;
while(true){
cout << "Username: ";
cin >> user;
cout << "Password: ";
cin >> pwd;
b.login(user, pwd);
}
}
?
in attesa di una sua risposta mi scuso sin d'ora per l'insistenza e la ringrazio anticipatamente
Molto meglio la seconda opzione. La prima ha il difetto che inserisci nella classe un costruttore che non ha niente a che vedere con la gestione di biblioteche in generale ma che di fatto serve solo a testare il programma.
EliminaSalve professore, ho provato a fare il compito inerente la corsa automobilistica, e quando lei chiede: "Un ciclo si occuperà di fare avanzare le automobili di secondo in secondo fino al termine della competizione", mi chiedo come fare il ciclo che farà avanzare le automobili di secondo in secondo.
RispondiEliminaLa ringrazio anticipatamente.
Per fare avanzare di secondo in secondo la simulazione bisognerebbe fare un ciclo che chiama time ripetutamente e chiama il metodo del simulatore che fa avanzare tutte le macchine quando e' passato un secondo dall'ultimo avanzamento. Comunque non era questa la parte essenziale del compito. Un ciclo che faceva andare la simulazione senza aspettare un secondo fra un passo e l'altro andava piu' che bene.
EliminaSalve Professore, avrei qualche problema nell'impostazione del compito Elezioni. La parte del testo che riporterò in seguito mi da qualche problema:
EliminaDopo la creazione dell’oggetto il programma entra in un ciclo infinito in cui mostra una schermata che chiede la matricola e il codice di controllo (che è stato dato all’elettore al posto della tradizionale scheda elettorale cartacea), verifica che matricola e codice di controllo siano coerenti, stampa l’elenco dei candidati come elenco numerato, permette all’elettore di esprimere la sua preferenza mediante il numero del candidato (uno 0 come preferenza di candidato implica scheda bianca mentre un valore non valido verrà inteso come scheda nulla) e archivia il voto espresso in forma anonima.
Per la prima parte subito dopo il ciclo infinito avevo pensato di implementare un metodo della classe Seggio che in base alla matricola e al codice di controllo mi restituisca un puntatore a Studente in modo tale da poter usare questo puntatore per votare, ma mi accorgo che in questo modo escludo i Candidati che sono anch'essi studenti.
Avevo pensato anche a un'ulteriore classe Elettore che sfruttando il polimorfismo mi dava la possibilità di fare ciò che pensavo, però non penso sia la soluzione migliore.
La ringrazio anticipatamente.
Probabilmente hai in mente una soluzione piu' complessa del necessario. Per come la vedo io si potrebbe fare un metodo di seggio a cui passi una matricola e un codice di controllo e che ti restituisce il puntatore allo studente se c'e' corrispondenza e lo studente non ha ancora votato e NULL se se non c'e' corrispondenza o la matricola non esiste o lo studente ha gia' votato. Una volta che hai quel puntatore puoi chiamare un metodo di studente che marca lo studente come "gia' votato" e avviare la procedura di voto che deve essere tutta in Seggio e non in studente (il voto deve essere anonimo).
EliminaVista in questi termini non vedo i problemi che dici tu cosi' come non credo sia necessaria una classe Elettore.
Salve professore, nel compito inerente il gioco dell'oca avevo pensato di strutturare il mio progetto nel seguente modo:
RispondiEliminaClasse Gioco:
- Casella* c[50];
- Giocatore* g[3];
void Simula();
Classe Casella:
- int tipo;
- Giocatore* g;
Classe Giocatore:
- string nome;
- Casella* c[50]????
Il dubbio è sul dato membro del giocatore che riguarda le caselle.
Visto che poi il singolo giocatore avrà un metodo per lanciare i dadi che ogni iterazione mi dirà se il giocatore è arrivato al traguardo o meno, lei cosa mi consiglia di fare con il dato membro che riguarda le caselle del giocatore?
La ringrazio anticipatamente.
(Spero di essere stato chiaro perchè capisco che la mia domanda non è stata posta nel migliore dei modi)
Penso che la cosa piu' semplice sia di mettere in giocatore un int (fra 0 e 49) che mi permette di capire in che casella si trova quando deve calcolare la nuova posizione.
EliminaQuindi lei non mi consiglia di aggiungere fra i dati membro di Giocatore anche le 50 caselle?
EliminaIn questo modo avrò tutta la simulazione del gioco in void Gioco::Simula(), giusto? Compreso i controlli inerenti al tipo di casella e al fatto che questa sia occupata o meno, giusto?
Esatto, non c'e' nessun vantaggio a riportare le caselle come dati membri di ciascun giocatore. Nella Gioco::Simula() l'unica informazione che ti serve per determinare la nuova posizione di un giocatore e se ha vinto e' la sua la posizione iniziale.
EliminaSalve professore volevo chiederle un aiuto nell'esercizio sulla partita da Tennis.
RispondiEliminala funzione simula deve simulare il set con i relativi punteggi.io avevo pensato (e forse sbaglio) di creare una matrice di interi del tipo int m[i][j] dove in i metto i risultati del giocatore in casa e in j quelli del giocatore in trasferta e poi facendo la somma dei punteggi in i e in j stabilisco chi vince a seconda della somma maggiore.
con questa mia sistemazione però volevo capire di quanto devo fare grande l'array.cioè io come faccio a sapere di quanti set sarà la partita?devo forse usare un array dinamico?se si potrebbe scrivermi un pezzo di codice?
stesso problema quando devo stabilire il nome del giocatore che ha vinto.io ho scritto:
int main(){
Incontro i;
i.Add(new Giocatore("Mario","Rossi",25));
i.Add(new Giocatore("Luca","Neri",32));
i.simula();
come posso dentro simula far capire al programma che a vincere sono proprio Mario Rossi e Luca Neri se questi nomi li ho dichiarati nei costruttori fuori dal corpo della funzione simula?
in attesa di risposta la ringrazio sin d'ora
Ogni partita e' fatta da 3 set (a meno che uno dei due giocatori non vince i primi due e quindi il terzo non si gioca). Ciascun set puo' avere un numero in teria indefinito di giochi ma puoi tranquillamente ipotizzare che non ci saranno set con piu' di 20 giochi e quindi memorizzare i risultati in un array [20][2].
RispondiEliminaQuesto array potrebbe contenere i risultati parziali del set, ad esempio
0 0
0 1
0 2
1 2
1 3
1 4
2 4
3 4
3 5
3 6
ovviamente la sequenza dei risultati parziali deve essere compatibile con le regole del gioco (da 2-4 potrai passare solo a 3-4 o 2-5).
Dentro simula tu avrai riferimenti o puntatori ai giocatori e quindi avrai sempre modo di accedere ai nomi.
e se a simula passassi direttamente i giocatori una possibile implementazione potrebbe essere questa?
RispondiEliminanel main:
Inconto i;
Giocatore a("Mario","Rossi",25));
Giocatore b("Luca","Neri",32));
i.simula(a,b);
nella implementazione invece
void Incontro::simula(Giocatore &a,Giocatore &b){
if(puntia() > puntib())
return a;
else return b;
}
?
Tutto si puo' fare anche se non mi e' chiaro cosa fanno puntia() e puntib(). Comunque e' preferibile inserire gli oggetti giocatore (o loro puntatori) all'interno dell'incontro perche' i giocatori concettualmente sono parte integrante dell'incontro.
Elimina