Prova al calcolatore Esercizio 1 (matrici, eccezioni, package)

Fondamenti di Informatica I (12 cfu)
Corsi di Laurea in Ingegneria Informatica e Automatica
e Ingegneria dei Sistemi Informatici
Sapienza Università di Roma
A.A. 2010-2011
Prova al calcolatore
Compito B - 24 giugno 2011 - Durata 2h 30m
Esercizio 1 (matrici, eccezioni, package)
Dimostrare la conoscenza dei concetti di manipolazione di matrici, eccezioni e gestione dei package
risolvendo il seguente esercizio.
Dati due vettori si vuole verificare la proprietà di ”uguaglianza insiemistica”. Due vettori soddisfano tale proprietà se contengono gli stessi valori indipendentemente dall’ordine in cui compaiono e
dal numero di occorrenze degli elementi.
Per es. i vettori 1 2 3 4 e 1 4 2 3 soddisfano la proprietà in quanto contengono gli
stessi valori (1, 2, 3, 4) anche se in ordine differente.
Scrivere una classe pubblica matrici.Eserc1 contenente un metodo statico
int controllaUguaglianza(int[][] mat, int[] simboli)
che, data una matrice quadrata di interi (n x n) mat e un vettore simboli di n valori distinti,
restituisca il numero di righe e di colonne che soddisfano la proprietà ”uguaglianza insiemistica”.
Esempio:
Considerando la matrice
1
2
3
4
2
4
1
3
3
1
4
3
4
3
2
1
e il vettore simboli
1 2
3 4
il metodo dovra’ restituire 6 in quanto la riga 4 e la colonna 3 sono le uniche a non soddisfare la
proprietà.
Se la dimensione del vettore non è compatibile con quella della matrice rilanciare l’eccezione non
verificata IllegalArgumentException (disponibile nel JDK) con il messaggio: ”Dimensioni errate”.
Nota: Assumere di avere sempre una matrice regolare (tutte le righe hanno la stessa dimensione).
Scrivere la soluzione in modo da poter compilare ed eseguire il programma di prova, contenuto in
ProvaEserc1.java, senza doverlo modificare.
Esercizio 2 (Ricorsione, Java Collections Framework ed Iteratori)
Dimostrare la conoscenza della tecnica della ricorsione e il Java Collections Framework risolvendo il
seguente esercizio.
Scrivere una classe pubblica Eserc2 contenente i seguenti metodi statici ricorsivi:
• List<Integer> fusioneOrdinata(List<Integer> l1, List<Integer> l2), che, date due liste
l1 ed l2 ordinate in ordine non crescente (in cui cioè il primo elemento della lista e’ sempre
quello a valore massimo), restituisce una nuova lista ordinata anche essa in ordine non crescente
contenente tutti gli elementi delle due liste.
Esempio: se l1=[12,6,5,3,3] ed l2=[5,4,3,1] il metodo dovrà restituire la lista [12,6,5,5,3,3,1].
• List<Integer> maggiori(Iterator<Integer> i, int n) che, dato un iteratore i (non necessariamente ordinato) ed un intero n, restituisce una nuova lista contenente tutti i valori di i
che sono strettamente maggiori di n, nello stesso ordine in cui compaiono in i.
Esempio: se l’iteratore fa riferimento agli elementi [12,5,22,54,21,19,20] e n=20, il metodo
dovrà restituire la lista [22,54,21].
Tutti i metodi implementati devono essere ricorsivi. Non è consentito l’uso di istruzioni
di ciclo.
Scrivere la soluzione in modo da poter compilare ed eseguire con successo il programma di prova,
contenuto in ProvaEserc2.java, senza doverlo modificare.
Esercizio 3 (strutture collegate lineari)
Dimostrare la conoscenza dei concetti di strutture collegate lineari (SCL) risolvendo il seguente
esercizio.
Scrivere una classe pubblica NodoAutovettura che rappresenti un nodo di una struttura collegata
lineare usata per memorizzare il tipo e la targa di una automobile. Ogni nodo contiene i campi
protetti targa (String) e tipo (String) e il campo next che rappresenta il riferimento al nodo
successivo.
Scrivere una classe pubblica ListaAutovetture per memorizzare un elenco di autovetture mediante una lista collegata basata sulla classe NodoAutovettura. La classe deve contenere una variabile
di istanza protetta di nome init con il riferimento al primo nodo della SCL e i seguenti metodi
pubblici:
• Costruttore a zero argomenti che crea una lista vuota.
• public void aggiungiInCoda(String targa, String tipo), che inserisce
l’autovettura targa, tipo in coda alla lista;
• public int trovaTipoAuto(String t), che restituisce il numero di autovetture del tipo t.
• public String[] elencaTarghe(), che restituisce un array con tutte le targhe delle autovetture nella lista, nello stesso ordine con cui sono memorizzate.
Due liste sono uguali se contengono le stesse autovetture (stesso tipo e stessa targa), nello stesso
ordine.
Scrivere la soluzione in modo da poter compilare ed eseguire con successo il programma di prova,
contenuto in ProvaEserc3.java, senza doverlo modificare.
Esercizio 4 (ereditarietà, late binding, JCF, RTTI)
Dimostrare la conoscenza dei concetti di ereditarietà, late binding, Java Collections Framework, e
RTTI (Run Time Type Information: classe Class, ecc.) risolvendo il seguente esercizio.
Definire un insieme di classi pubbliche per gestire dei filmati video (sia in streaming che su disco).
Tutte le classi si basano sulla classe astratta VideoStream che ha la seguente struttura:
• VideoStream (Classe astratta): rappresenta un generico stream video e contiene i seguenti
attributi protetti:
– name (String): il nome dello stream
– width (int): la larghezza del frame in pixel
– height (int): l’altezza del frame in pixel
– fps (int): numero di frame al secondo
Contiene inoltre i seguenti metodi:
– costruttore che inizializza tutti i campi della classe, nell’ordine specificato sopra.
– int frameSize() che restituisce la dimensione di memoria di un frame in bytes (calcolata
come width ∗ height ∗ 3).
– int getFPS() che restituisce il numero di frame al secondo
– abstract int getDuration() : che restituisce la durata del filmato
Aggiungere poi le seguenti ulteriori classi concrete:
• OnlineVideoStream: la classe rappresenta uno stream video che si visualizza on-line. Contiene
i seguenti attributi protetti:
– bitrate (int): che specifica il bitrate disponibile;
– numFrames (int): che specifica il numero totale di frames nel film;
Contiene inoltre i seguenti metodi:
– Un costruttore che prende i seguenti parametri: String name, int width, int height,
int fps e imposta i valori dei parametri ai corrispondenti campi d’istanza.
– Metodi accessori
1
per la lettura e modifica delle variabili d’istanza della classe:
∗ int getBitrate(), void setBitrate(int bitrate) per l’attributo bitrate.
1 I metodi set assegnano il valore del parametro alla corrispondente variabile d’istanza mentre (e ritornano void) mentre i get restituiscono
il valore della variabile d’istanza associata.
∗ int getNumFrames() e void setNumFrames(int numFrames) per l’attributo numFrames.
– La classe inoltre implementa il metodo astratto getDuration definito nella classe base:
il metodo deve ritornare la durata in secondi del film specificato, al framerate desiderato
secondo la formula numFrames*frameSize()/bitrate. 2
• DiskVideoStream: la classe rappresenta uno stream video memorizzato su file.
La classe ha i seguenti attributi protetti:
– filename (String): che specifica il nome del file associato al
– size (int): che specifica la dimensione del file in bytes;
Contiene inoltre i seguenti metodi:
– Un costruttore che prende tutti gli argomenti di VideoStream (nel medesimo ordine).
– Metodi accessori
1
∗ String getFilename(), void setFilename(String filename)
∗ int getSize(), void setSize(int size)
– La classe inoltre implementa il metodo astratto getDuration definito nella classe base: il
metodo deve ritornare la durata in secondi del film specificato secondo la formula
(size/frameSize())/fps.
• VideoStreamUtil: classe contenente i seguenti metodi statici pubblici
– int totalDuration(List<VideoStream> l ): restituisce la durata totale di una lista di
VideoStream.
– List<OnLineVideoStream> onLine(List<VideoStream> l ): restituisce una lista contenente solamente le istanze di tipo OnLineVideoStream contenute nella lista l;
Scrivere la soluzione in modo da poter compilare ed eseguire con successo il programma di prova,
contenuto in ProvaEserc4.java, senza doverlo modificare.
2 Affinche la formula sia valida si assume che tutti i frame del film vengono visualizzati e se c’é poca banda il film verra visualizzato piú
lentamente