Seconda prova in itinere di Laboratorio di Algoritmi e Strutture Dati – Prof Carlo Blundo Anno Accademico 2001/2002 – Matricole 6, 7, 8 e 9 Cognome e Nome: Numero di Matricola: Spazio riservato alla correzione 1 /10 2 /20 3 /20 4 /50 totale /100 Non usare altri fogli, usare solo lo spazio sottostante. Fogli differenti da questo non saranno presi in considerazione per la correzione. 1. Vero/Falso [10 punti] Indicare quali dei seguenti frammenti di programma sono corretti. Non è necessario giustificare la risposta. 1 2 3 4 5 6 7 8 9 10 template <class T, U> class prima; template <class T, typename U> class seconda; template <class Z> terza; template <class A, typename A> class quarta; template <class W> class quinta { typedef int W; ..... }; class sesta { friend sesta& operator=(const sesta&); .... }; class settima { private: int a; settima() {a=0}; … … . }; class ottava { public: explicit ottava(string&); … .. }; class nona { int v = 0; ......... }; int uno=9; template <int uno, typename K, class U> class decima ; Pag. 1 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com Seconda prova in itinere di Laboratorio di Algoritmi e Strutture Dati – Prof Carlo Blundo Anno Accademico 2001/2002 – Matricole 6, 7, 8 e 9 2. Dijkstra [20 punti] [ 5 punti] Si illustri a cosa serve l’algoritmo di Dijkstra e le strutture dati su cui si basa. [10 punti] Codificare, usando pseudocodice oppure codice C++, l’algoritmo di Dijkstra (anche ISS e Relax). [ 5 punti] Indicare, giustificando la risposta, quale è la complessitàdell’algoritmo proposto. Pag. 2 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com Seconda prova in itinere di Laboratorio di Algoritmi e Strutture Dati – Prof Carlo Blundo Anno Accademico 2001/2002 – Matricole 6, 7, 8 e 9 Template di classi [20 punti] Data la seguente rappresentazione interna del template di classe vettore unsigned int _size; unsigned int _capacity; T* _vett; // numero di elementi nel vettore // numero di elementi che possiamo inserire nel vettore senza // dover riallocare l’area di memoria puntata da _vett // puntatore ad un array di _capacity elementi di tipo T implementare i metodi void insert(const T& val, unsigned int ind); // inserisce l'elemento val alla posizione ind void push_back(T& val); // inserisce l'elemento val alla fine del vettore Pag. 3 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com Seconda prova in itinere di Laboratorio di Algoritmi e Strutture Dati – Prof Carlo Blundo Anno Accademico 2001/2002 – Matricole 6, 7, 8 e 9 4. Progetto - Gestione di una banca dati di offerte di lavoro [50 punti] L'agenzia LAVORO PER TUTTI gestisce una banca dati di richieste ed offerte di lavoro. Gli utenti della banca dati possono essere sia persone in cerca di occupazione (un bel giro di parole per dire disoccupati… .) che aziende in cerca di manodopera. Ogni persona in cerca di occupazione deve compilare un questionario in cui specifica le proprie generalità, il tipo di lavoro richiesto e le sedi di lavoro che gli sono gradite. Un azienda in cerca di manodopera, invece, deve indicare le qualifiche professionali delle persone che intende assumere e le sedi di lavoro. Per ciascuna sede e qualifica deve, inoltre, indicare il numero di posti disponibili. Il programma di gestione della banca dati deve consentire di assegnare i lavori alle persone rispettando le preferenze espresse (in altre parole, ogni persona può accettare al più un lavoro, mentre ogni azienda non può assumere più persone del numero di posti disponibili) e massimizzando il numero di persone occupate. Progettare ed implementare un programma C++ che gestisca la banca dati. Il programma deve assegnare il maggior numero di lavori possibile. I dati relativi alle richieste di lavoro vengono letti dai file Richieste, contenente le richieste non ancora processate, e RichiesteInevase, contenente le vecchie richieste rimaste inevase. Analogamente, i dati relativi alle offerte di lavoro vengono letti dai file Offerte e OfferteInevase. La lista dei lavori assegnati va inserita nel file LavoriAssegnati. Dopo aver assegnato il maggior numero di lavori possibili, le richieste di lavoro non assegnate devono essere registrate nel file RichiesteInevase, così come le offerte di lavoro non soddisfatte vengono registrate nel file OfferteInevase. Il formato dei file Richieste ed Offerte è descritto in seguito (il formato dei file OfferteInevase e RichiesteInevase è analogo). Parte da sviluppare in aula: [20 punti] Indicare sia le strutture dati utilizzare per risolvere il problema (come il problema può essere rappresentato da strutture dati che conoscete) che l’algoritmo principale utilizzato per ottenere la soluzione del problema (nome dell’algoritmo e cosa prende in input). [25 punti] Scrivere in C++, utilizzando la libreria LEDA, l’algoritmo principale utilizzato per ottenere la soluzione del problema (non preoccupatevi di implementare la parte di Input/Output). [ 5 punti] Indicare, giustificando la risposta, quale è la complessitàdell’algoritmo proposto. NON è possibile usare gli algoritmi forniti dalla libreria LEDA per risolvere il problema. In caso la vostra soluzione richieda l'uso di classi non "standard" (che non fanno parte di STL o LEDA), scrivere l'interfaccia delle classi usate. Pag. 4 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com Seconda prova in itinere di Laboratorio di Algoritmi e Strutture Dati – Prof Carlo Blundo Anno Accademico 2001/2002 – Matricole 6, 7, 8 e 9 Formato dell'input. I dati dei questionari sono raccolti in due file chiamati Richieste ed Offerte. Nel file Richieste sono raccolti i dati delle persone in cerca di lavoro. Ogni persona ha compilato il seguente modulo: NOME: Mario COGNOME: Rossi LUOGO E DATA DI NASCITA: Salerno, 25/12/70 RESIDENZA: Via Roma 111, Salerno RECAPITO TELEFONICO: 089/123456 TIPO DI LAVORO RICHIESTO: (segnare con una X le qualifiche desiderate) Programmatore Sistemista Esperto Reti Esperto Sicurezza Web Master Commerciale Addetto Pubbliche Relazioni Dirigente SEDE DI LAVORO PREFERITA: (Indicare da una a tre cittàitaliane) Nel file Offerte sono raccolti i dati delle aziende che offrono lavoro. Per ogni azienda esiste un modulo compilato come segue: NOME: Sun Italia INDIRIZZO: Via Isonzo, Roma (RM) RECAPITO TELEFONICO: 06/1122000 DISPONIBILITÀ POSTI: (Elencare per ogni qualifica le sedi ed i posti disponibili) Programmatore Sistemista Esperto Reti Esperto Sicurezza Web Master Commerciale Addetto Pubbliche Relazioni Dirigente Questi dati sono memorizzati nei file Richieste ed Offerte secondo le seguenti regole: il segnale di fine campo è rappresentato dal carattere '\n'; il segnale di fine record è rappresentato dal carattere '@'. Inoltre, nei files RichiesteInevase e OfferteInevase sono conservate tutte le richieste non ancora soddisfatte. Il loro formato è uguale ai file Richieste ed Offerte rispettivamente. Formato dell'output. Il programma deve restituire, nel file LavoriAssegnati, l'elenco delle assegnazioni delle persone ai posti di lavoro (potete utilizzare il formato che preferite) ed inserire tutte le richieste non soddisfatte nei file RichiesteInevase e OfferteInevase. Pag. 5 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com Seconda prova in itinere di Laboratorio di Algoritmi e Strutture Dati – Prof Carlo Blundo Anno Accademico 2001/2002 – Matricole 6, 7, 8 e 9 Pag. 6 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com Seconda prova in itinere di Laboratorio di Algoritmi e Strutture Dati – Prof Carlo Blundo Anno Accademico 2001/2002 – Matricole 6, 7, 8 e 9 Pag. 7 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com