Esercizio: Lista Circolare

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Esercizio: Lista Circolare"

Transcript

1 Esercizio: Lista Circolare Si realizzi in Java un gestore di una lista circolare. La dimensione minima della lista è 2 elementi (ed è anche la dimensione iniziale). La dimensione massima è 20 elementi. Il gestore della lista deve consentire di cercare, aggiungere e rimuovere elementi. Ogni elemento della lista contiene le informazioni su un frame, ossia l elemento base di un flusso di dati multimediali. Il frame può essere audio o video.

2 Esercizio: Lista Circolare Ogni frame audio è caratterizzato da: nome dello stream numero di sequenza (un intero positivo) bitrate (un intero positivo multiplo di 16) codifica (una String tipo MPEG Layer 3, Dolby AAC, ecc.) flag mono/stereo Ogni frame video è caratterizzato da: nome dello stream numero di sequenza (un intero positivo) bitrate (un intero multiplo di 24) standard (una String tipo PAL, HDTV, ecc.) codifica (una String tipo MPEG4, H.264, ecc.)

3 Esercizio: Lista Circolare Inserimento degli elementi: Ogni frame audio può essere inserito nella lista solo se appartiene allo stesso stream ed ha la medesima codifica di quelli già presenti. Analogamente, un frame video può essere inserito solo se ha medesimo nome dello stream, della codifica e dello standard rispetto agli altri elementi della lista. Inoltre, ad ogni frame inserito deve essere associato un numero di sequenza ottenuto incrementando di una unità il numero di sequenza dell ultimo frame dello stesso tipo inserito.

4 Esercizio: Lista Circolare La funzione di inserimento di un frame nella lista circolare deve inoltre garantire che partendo da un certo elemento, sia possibile percorrere l intera struttura osservando un andamento crescente dei numeri di sequenza dei frame dello stesso tipo partendo da qui, i frame hanno numero di sequenza crescente 6 7 n Frame Audio n Frame Video

5 Esercizio: Lista Circolare Ricerca degli elementi: La funzione di ricerca deve permettere la ricerca di un frame sulla base di almeno un parametro distintivo dell oggetto. Ad esempio, il numero di sequenza.

6 Analisi delle specifiche Lista: elenco dinamico di elementi. L attributo dinamico indica che la lista non ha numero fisso di elementi. Nel nostro esempio, sulla lista sono specificati vincoli e proprietà: il numero minimo (2) e massimo (20) di elementi le operazioni che è possibile svolgere sulla lista

7 Analisi delle specifiche La lista deve contenere degli elementi. Gli elementi della lista sono entità che contengono informazioni su altre entità dette Frame. In particolare, sono considerati due tipi specifici di Frame: i Frame Audio i Frame Video

8 Implementazione Dobbiamo implementare tre entità: 1. La lista 2. I nodi della lista 3. I frame, ossia le entità contenute nei nodi.

9 Il Frame Le entità di cui dobbiamo tenere traccia nella lista sono i frame. Sono definiti due tipi di frame, i quali condividono caratteristiche comuni. Frame Frame Audio Frame Video Li modelliamo perciò in Java come sottoclassi di una classe comune.

10 La classe Frame public abstract class Frame { protected String nomestream, codifica; protected int sequencenum, bitrate; public int getbitrate() { return bitrate; public String getcodifica() { return codifica; public String getnomestream() { return nomestream; public int getsequencenum() { return sequencenum; public void setsequencenum(int sequencenum) { this.sequencenum = sequencenum;

11 La sottoclasse AudioFrame public class AudioFrame extends Frame { private boolean isstereo; public AudioFrame(String nomestream, String codifica, int bitrate, boolean stereo) throws FrameException { if ((bitrate % 16!= 0) (bitrate <= 0)) throw new FrameException("wrong audio bitrate"); this.nomestream = nomestream; this.codifica = codifica; this.bitrate = bitrate; isstereo = stereo; public boolean isstereo() { return isstereo;

12 Il Nodo Il nodo è l elemento che costituisce la lista. Ciascun nodo contiene: L oggetto Frame che deve descrivere Il riferimento al nodo successivo node frame node frame next node next node

13 La classe Nodo public class Nodo { private Frame framedata; private Nodo nextnodo; public Nodo(Frame frame) { framedata = frame; public Nodo getnextnodo() { return nextnodo; public void setnextnodo(nodo nextnodo) { this.nextnodo = nextnodo; public Frame getframedata() { return framedata;

14 La classe Lista public class ListaCircolare { private Nodo lastelement; private int nsequencevideoframe, nsequenceaudioframe; private String codificaaudio, codificavideo, stream; public ListaCircolare(Frame firstelement, Frame secondelement) throws ListException { [corpo del costruttore vedi slide successive]

15 La Lista costruttore (1) public ListaCircolare(Frame firstelement, Frame secondelement) throws ListException { if (! firstelement.getnomestream().equalsignorecase( secondelement.getnomestream() ))) throw new ListException("Frame di stream diversi"); lastelement = new Nodo(secondElement); Nodo temp = new Nodo(firstElement); lastelement.setnextnodo(temp); temp.setnextnodo(lastelement);

16 La Lista costruttore (1) Nodo lastelement Nodo temp Frame secondelement nextnodo Fame firstelement nextnodo

17 La Lista costruttore (2) if (firstelement instanceof VideoFrame) { if (secondelement instanceof VideoFrame) { if (!firstelement.getcodifica().equalsignorecase(secondelement.getcodifica() )) throw new ListException("Codifiche video incompatibili"); firstelement.setsequencenum(1); secondelement.setsequencenum(2); nsequencevideoframe = 2; nsequenceaudioframe = 0; else { firstelement.setsequencenum(1); secondelement.setsequencenum(1); nsequencevideoframe = 1; nsequenceaudioframe = 1; codificavideo = firstelement.getcodifica(); codificaaudio = secondelement.getcodifica();

18 La Lista costruttore (3) else { if (secondelement instanceof VideoFrame) { firstelement.setsequencenum(1); secondelement.setsequencenum(1); nsequencevideoframe = 1; nsequenceaudioframe = 1; codificavideo = secondelement.getcodifica(); codificaaudio = firstelement.getcodifica(); else { if (!firstelement.getcodifica().equalsignorecase(secondelement.getcodifica() )) throw new ListException("Codifiche audio incompatibili"); firstelement.setsequencenum(1); secondelement.setsequencenum(2); nsequencevideoframe = 0; nsequenceaudioframe = 2;

19 La Lista inserimento Frame public void insertframe(frame f) throws ListException { if (f instanceof VideoFrame) { if (! f.getcodifica().equalsignorecase(codificavideo)) throw new ListException("Codifica video non compatibile"); f.setsequencenum(++nsequencevideoframe); else { if (! f.getcodifica().equalsignorecase(codificaaudio)) throw new ListException("Codifica audio non compatibile"); f.setsequencenum(++nsequenceaudioframe); Nodo nuovonodo = new Nodo(f); nuovonodo.setnextnodo(lastelement.getnextnodo()); lastelement.setnextnodo(nuovonodo); lastelement = nuovonodo;

20 La Lista inserimento Frame Nodo lastelement Frame secondelement nextnodo Frame firstelement nextnodo Nodo nuovonodo Nodo lastelement Frame f nextnodo

21 La Lista metodo di ricerca public VideoFrame searchvideoframe(int sequencenum) { if (sequencenum > nsequencevideoframe) return null; else { VideoFrame result = null; Nodo temp = lastelement; boolean prosegui = true; while (prosegui) { try { result = (VideoFrame)temp.getNextNodo().getFrameData(); if (result.getsequencenum() == sequencenum) prosegui = false; catch (ClassCastException e) { temp = temp.getnextnodo(); if (temp == lastelement.getnextnodo()) prosegui = false; return result;

22 ArrayList La classe ArrayList implementa un array dinamico, a cui è possibile aggiungere elementi senza che sia stabilita una dimensione massima in pratica, esibisce il comportamento di una lista. Rispetto a Vector (classe del package java.util), i metodi non sono synchronized e pertanto sono più veloci non dovendo garantire la mutua esclusione nell accesso ai dati gestiti dall istanza di Vector ArrayList gestisce internamente un array di Object: possono essere quindi inseriti oggetti di qualunque tipo

23 ArrayList - svantaggi Internamente, ArrayList si poggia su un array classico : nel caso siano inseriti elementi in eccesso, viene generato un nuovo array di dimensioni maggiori in cui sono copiati i valori dell array iniziale per poi aggiungere i nuovi dati. Tale processo può diventare pesante per liste che variano frequentemente ed in maniera significativa Il metodo get(int index) restituisce l elemento in posizione index: essendo però la lista formata da elementi di classe Object, l elemento ritornato è di classe Object e può essere ricondotto alla classe reale (se diversa da Object) attraverso un cast esplicito. Ciò però richiede la conoscenza della classe dell elemento estratto!

24 ArrayList accesso agli elementi ArrayList list = new ArrayList(); Integer numero = new Integer(10); String nome = new String( Diego"); list.add(numero); list.add(nome); Integer recuperanumero = (Integer)list.get(0); String recuperanome = (String)list.get(1); if (list.get(0) instanceof Integer) System.out.println( Numero!"); else System.out.println( Nooooo"); if (list.get(1) instanceof String) System.out.println( Nome! ); else System.out.println( Nooooo );

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList Esempio su strutture dati dinamiche: ArrayList 1 ArrayList Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione

Dettagli

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList Esempio su strutture dati dinamiche: ArrayList 1 ArrayList! Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione

Dettagli

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList Esempio su strutture dati dinamiche: ArrayList 1 ArrayList Gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione e rimane immutato.

Dettagli

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList Esempio su strutture dati dinamiche: ArrayList Fondamenti di Informatica L-B 1 ArrayList Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito

Dettagli

Alberi Binario in Java

Alberi Binario in Java Alberi Binario in Java Realizzare un albero binario di ricerca. L albero binario è di ricerca se esiste una relazione di ordinamento tra i valori dei nodi (valori comparabili). In particolare, dato un

Dettagli

GESTIONE DEGLI ERRORI

GESTIONE DEGLI ERRORI GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori L approccio classico consiste nell inserire controlli (if else..) per cercare di intercettare a priori

Dettagli

Polimorfismo parametrico vs polimorfismo per inclusione

Polimorfismo parametrico vs polimorfismo per inclusione Polimorfismo parametrico vs polimorfismo per inclusione Esercizio Definire il tipo di dato Stack con operazioni Push( element ) Pop() Non forzare una specifica implementazione Non forzare un tipo specifico

Dettagli

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Dicembre Alcune Soluzioni

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Dicembre Alcune Soluzioni COMPITO DI LABORATORIO DI PROGRAMMAZIONE 2001-2002 10 Dicembre 2001 Alcune Soluzioni ESERCIZIO 1. Si consideri il seguente frammento di codice in linguaggio Java: int[][] a = new int[n][n]; for (int i

Dettagli

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 18 - Vettori Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it Corso di

Dettagli

Prova d Esame Compito A

Prova d Esame Compito A Domanda 1 A) Si richiede di analizzare le seguenti sezioni di codice. Il candidato indichi il risultato dell esecuzione del main. public class Father { private static int counter=0; private int code; public

Dettagli

Implementazione ADT: Alberi

Implementazione ADT: Alberi Implementazione ADT: Alberi Livelli di astrazione 2001/2002 1 Esercitazione 5 (E6): alberi (tree) albero struttura dati fondamentale, soprattutto per le operazioni di ricerca tipi di albero con radice

Dettagli

La classe java.lang.object

La classe java.lang.object La classe java.lang.object In Java: Gerarchia di ereditarietà semplice Ogni classe ha una sola super-classe Se non viene definita esplicitamente una super-classe, il compilatore usa la classe predefinita

Dettagli

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione Alberi Strutture dati: Alberi Strutture gerarchiche di dati Esempi Il file system di un sistema operativo L organigramma di un azienda Alberi generali, alberi n-ari, alberi binari, Ogni nodo ha un unico

Dettagli

Laboratorio 9 ( Java 4 ) Classe astratta per BFS su grafo

Laboratorio 9 ( Java 4 ) Classe astratta per BFS su grafo Laboratorio 9 ( Java ) Classe astratta per BFS su grafo Testo esercitazione Scaricare il file EseBFS.zip, scompattarlo ed analizzare le classi in esso contenute con particolare attenzione alla classe astratta

Dettagli

Programmazione a oggetti

Programmazione a oggetti Programmazione a oggetti Quanti oggetti, tra di loro parlando, fanno programmi. Pilu Crescenzi [email protected] Università di Firenze Programmazione a oggetti p.1/32 Cosa è un oggetto Una scatola software

Dettagli

Diagramma delle classi UML

Diagramma delle classi UML Università di Roma La Sapienza, Facoltà di Ingegneria Corso di PROGETTAZIONE DEL SOFTWARE (Ing. Gestionale) Prof. Giuseppe De Giacomo, A.A. 2001-02 SOLUZIONE ESAME DEL 25/06/2002 Roma, 23 giugno 2003 1

Dettagli

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1. OO in Java: classi astratte, interfacce, classi interne Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro [email protected] Programmazione,

Dettagli

Progettazione del Software

Progettazione del Software Progettazione del Software Simulazione di esame Domenico Fabio Savo Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Sapienza Università di Roma Anno Accademico 2015/2016

Dettagli

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso

Dettagli

Esercitazione n 2. Obiettivi

Esercitazione n 2. Obiettivi Esercitazione n 2 Obiettivi Progettazione di una applicazione Java Utilizzo di classi come schemi Utilizzo di costruttori Utilizzo di stringhe Uguaglianza tra oggetti Utilizzo di classi come componenti

Dettagli

Uguaglianza e copia di oggetti

Uguaglianza e copia di oggetti Uguaglianza e copia di oggetti Sommario 1. Classi Object e Class 2. Uguaglianza superficiale e uguaglianza profonda 3. Copia superficiale e copia profonda 4. Uguaglianza e copia in classi derivate 1 La

Dettagli