Corso di Algoritmi e Strutture Dati Prova di laboratorio del 16

Commenti

Transcript

Corso di Algoritmi e Strutture Dati Prova di laboratorio del 16
Corso di Algoritmi e Strutture Dati
Prova di laboratorio del 16 luglio 2013
Informazioni tecniche sullo svolgimento della prova
Il tempo a disposizione per completare la prova è quattro ore.
Inizialmente entrare nella macchina ospite (la macchina fisica) con il nome utente esame e la password Esame2012.
Avviare la macchina virtuale GNU/Linux (icona “Linux” in alto a sinistra sul desktop). L’esame
si svolge in tale macchina virtuale, dove è anche disponibile l’editor jEdit. Si è automaticamente
accreditati nella macchina virtuale con il nome utente ”toor”, home directory /home/toor
Dentro la home directory suggeriamo di creare una sottocartella cognome nome
(esempio: dellamico mariagrazia) e realizzare lı̀ dentro il lavoro d’esame. Ciò renderà più facile
la creazione del file .zip da consegnare alla fine.
Evitare assolutamente di riavviare il computer durante l’esame, perchè in quel caso il lavoro
svolto viene perso. Se invece avviene uno spegnimento accidentale (es. manca la corrente elettrica),
viene mantenuto il lavoro fino all’ultimo salvataggio eseguito dall’editor; si raccomanda dunque di
eseguire spesso il salvataggio dei programmi durante la loro realizzazione.
Al termine della prova, sempre rimanendo nella macchina virtuale, occorre preparare un file
.zip o .tzg da consegnare, contenente tutti i sorgenti del programma. Il nome del file da consegnare
deve essere cognome nome.zip oppure cognome nome.tgz (esempio: dellamico mariagrazia.zip).
Il docente è disponibile a fornire chiarimenti su come procedere, se necessario.
La mancata indicazione del cognome e nome o la mancata consegna del file secondo le modalità indicate avranno come conseguenza l’annullamento della prova sostenuta, senza possibilità di recupero.
ATTENZIONE!!! A prova terminata non si deve per nessuna ragione eseguire “logout”, né chiudere la macchina virtuale, né spegnere o riavviare il computer: i docenti
passerano a ritirare gli elaborati su chiavetta USB. Lo spegnimento o il riavvio del computer
o della macchina virtuale possono causare la perdita completa del lavoro svolto.
1
Testo della prova
Un problema interessante da risolvere sulle mappe stradali è quello di stabilire, fissata una città sulla
mappa, quali sono le località comprese entro una certa distanza da quella città. Per esempio, una
persona residente a Genova potrebbe voler decidere di visitare altre località della riviera ma senza
andare oltre i 70 km dalla Superba sua residenza, onde non consumare troppa benzina. Sarebbe
molto utile disporre a tal fine di un programma in cui, dopo aver inserito una mappa stradale della
regione, sia possibile indicare una città di partenza e una distanza massima e ottenere l’elenco delle
città o paesi raggiungibili entro tale distanza prefissata.
Nell’elenco ottenuto ci si aspetta che non vi siano duplicati ma, per semplicità, non è richiesta alcuna
forma di ordinamento. Inoltre non è necessario indicare i cammini da percorrere per raggiungere le
località individuate.
La mappa stradale può essere facilmente rappresentata come un grafo non orientato con vertici
etichettati e archi pesati. I vertici rappresentano le località (es. città) e sono etichettati da nomi
(semplici stringhe di caratteri). Gli archi rappresentano vie di collegamento; il peso su un arco
rappresenta la distanza chilometrica tra le due località collegate dall’arco.
Naturalmente la possibile esistenza di cammini multipli tra due località e la possibile esistenza di
cicli nel grafo rendono meno facile del previsto risolvere questo problema.
Requisiti di realizzazione
Si implementi, come struct C++ e rispettando il principio di incapsulamento, il tipo di dato grafo
non orientato con vertici etichettati e archi pesati i cui nodi siano etichettati da stringhe di caratteri
e i cui pesi siano numeri interi. Si richiede di realizzare il grafo mediante l’approccio a liste di
adiacenza.
Le operazioni, da realizzare come member function della struct, sono le seguenti:
• Creazione di un grafo vuoto.
• Inserimento di un nuovo vertice etichettato.
L’etichetta da attribuire al nuovo vertice è una stringa passata come parametro alla funzione.
Il metodo restituisce false se l’etichetta è già presente nel grafo, e in tal caso nessun nuovo
vertice deve essere inserito.
• Inserimento di un nuovo arco pesato tra due vertici esistenti e distinti.
I due vertici sono identificati dalle loro etichette, passate come parametri alla funzione. Il peso
è anch’esso un parametro. Il metodo restituisce false se uno dei vertici non è presente nel
grafo, oppure se i due vertici coincidono; in tali casi nessun nuovo arco deve essere inserito.
• Visualizzazione del grafo, elencando, in corrispondenza di ciascuna etichetta di un vertice, le
etichette dei vertici adiacenti e le distanze chilometriche rispetto a questi (in pratica i pesi
degli archi).
• Visita limitata del grafo. Si tratta di una tradizionale visita del grafo che però non prosegue lungo i percorsi che eccedono la distanza massima prefissata. Questa funzione ha due
parametri: l’etichetta del vertice di partenza della visita e la distanza chilometrica massima
da considerare. Il risultato della funzione è la lista dei vertici che ricadono entro la distanza
stabilita, senza nessun particolare ordinamento ma senza duplicati (attenzione ai cicli...) e
senza visualizzazione; la visualizzazione del contenuto della lista sarà operata dal chiamante
(il main(), probabilmente).
2
È permesso utilizzare la libreria standard del C++, ad eccezione della STL (Standard Template
Library). Non è permesso ricorrere ad altre librerie.
La struct C++ implementata deve essere impiegata in un semplice programma C++. Tale programma deve svolgere, nell’ordine, le azioni seguenti:
1. Creazione del grafo acquisendo da standard input le informazioni sui vertici e sugli archi,
espresse nel formato seguente:
origine1 destinazione1 dist1
origine2 destinazione2 dist2
....
origineN destinazioneN distN
0
Per esempio:
arad zerind 75
arad timisoara 118
sibiu arad 140
zerind oradea 71
oradea sibiu 151
0
2. Un ciclo che permetta la scelta ripetuta tra le azioni seguenti:
• Visualizzazione testuale del grafo, che mostri l’elenco dei vertici con le rispettive etichette
e, per ciascun vertice, la relativa lista di adiacenza con i pesi degli archi.
• Elenco dei vertici che ricadono entro una certa distanza massima da un certo vertice. Sia
la distanza massima che il vertice di partenza sono acquisiti da standard input.
• Uscita dal programma.
Punteggi
• Grafo realizzato a lista di adiacenza, con operazioni di inserimento dei vertici, inserimento
degli archi e visualizzazione (magari non copiato dalle soluzioni che il docente ha messo su
Aulaweb):
Punteggio: 23.
• Come sopra, più operazione di visita tradizionale (senza limiti di distanza) che gestisce correttamente la presenza di cicli nel grafo:
Punteggio: 27.
• Come sopra, ma la visita è limitata entro una distanza massima:
Punteggio: 33.
3