Conversioni di tipo fra sottoclasse e superclasse

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Conversioni di tipo fra sottoclasse e superclasse"

Transcript

1 Conversioni di tipo fra sottoclasse e superclasse Può esserci la necessità di memorizzare un riferimento di una sottoclasse in un riferimento a superclasse. È possibile? Abbiamo visto l invocazione del metodo push di uno Stack di Object a cui era passata come parametro una stringa: s.push("pippo"); È possibile perché String è sottoclasse di Object. Analogamente è possibile memorizzare un riferimento ad un oggetto di tipo ContoRisparmio in un riferimento di tipo ContoBancario, che è una superclasse. In generale è possibile memorizzare un qualsiasi riferimento a oggetto in un riferimento di tipo Object che è la superclasse universale. La conversione di tipo è automatica. (par. 10.5) Consideriamo questi riferimenti: ContoRisparmio cr = new ContoRisparmio(2); ContoBancario cb = cr; Object ogg = cr; Abbiamo tre riferimenti diversi che vedono la stessa area di memoria. cr cb ogg saldo 0 tassointeresse 2 Attenzione. Ogni riferimento può usare solo i metodi della sua classe: cb.deposito(500); cb può modificare il saldo, però non può usare aggiungiinteresse. Con il riferimento ogg (di Object) si possono usare solo i metodi di Object (come tostring, equals, e pochi altri). Ciò nonostante può essere utile usare un riferimento della superclasse Object. 1

2 Aggiungiamo a ContoBancario il seguente metodo che permette di trasferire denaro da un conto ad un altro: (par. 10.5) public class ContoBancario{... public void trasferiscia (ContoBancario altro, double denaro) { this.prelievo(denaro); altro.deposito(denaro); //fine CB Esempio. ContoBancario padre = new ContoBancario(5000); ContoBancario figlio = new ContoBancario(); padre.trasferiscia(figlio, 300); Controlliamo con una stampa il saldo di entrambi: System.out.println (padre.rendisaldo());//4700 System.out.println (figlio.rendisaldo());//300 Con l invocazione del metodo padre.trasferiscia(figlio, 300); abbiamo: this.prelievo(300); //this=padre altro.deposito(300); //altro=figlio Supponiamo ora che padre debba trasferire denaro ad un conto di tipo ContoRisparmio: ContoRisparmio cliente = new ContoRisparmio(2); Possiamo fare: padre.trasferiscia(cliente,200); L istruzione padre.trasferiscia(cliente,200); è corretta perché il metodo trasferiscia si aspetta di ricevere come parametro un riferimento a CB e invece riceve un riferimento (cliente) a CR che è una sottoclasse: viene eseguita una conversione automatica. Il compilatore controlla solo che il riferimento di trasfersicia, se non è di tipo CB, sia di tipo classe derivata da CB. Avviene quindi la conversione di un tipo ad un tipo superiore: ContoBancario altro cliente 2

3 Ciò è analogo a quanto avviene quando si assegna ad una variabile reale un valore intero: double a = 25; In realtà nei tipi base avviene una cosa diversa perché il valore 25 (32 bit in complemento a 2) viene memorizzato in una sequenza di 64 bit con mantissa, esponente. Attenzione. Il metodo trasferiscia invoca il metodo deposito: public void trasferiscia (ContoBancario altro, double denaro) { this.prelievo(denaro); altro.deposito(denaro); Ma qualedeposito? Il parametro altro contiene un riferimento di tipo ContoRisparmio. Polimorfismo Quindi sarà deposito di ContoRisparmio: il metodo con cui si paga una tassa ad ogni versamento. Polimorfismo Il termine polimorfismo (deriva dal greco πολιµορφίσµος) significa molte forme. Nel trasferimento di denaro viene attivato: il metodo deposito di CB, quando il parametro è figlio il metodo deposito di CR, quando il parametro è cliente. La stessa operazione versare denaro viene eseguita in modi diversi che dipendono dal tipo dell oggetto che viene effettivamente usato come parametro implicito. Polimorfismo Quando trasferiscia viene invocato, il riferimento passato ad altro vede un oggetto di tipo CR. CB: altro CR: cliente 3

4 Polimorfismo L interprete Java sa che in altro c è un riferimento a CR e quindi invoca deposito di CR. Il compilatore può solo verificare la possibilità che ciò possa avvenire. La scelta di quale sia effettivamente il riferimento viene fatta durante l esecuzione del programma, vale a dire, solo quando il metodo viene invocato. (par. 10.6) Polimorfismo La scelta pertanto non è fatta in base al tipo del riferimento, altro è definito di tipo CB, ma in base al tipo dell oggetto che è realmente memorizzato in altro e che è di tipo CR. Il metodo ha lo stesso nome ma ha forme diverse. Il metodo deposito di CR, infatti, sovrascrive il metodo deposito di CB. Sovraccarico e polimorfismo Sovraccarico. Si parla di sovraccarico quando in una classe un metodo o un costruttore ha diverse scritture e possiede quindi parametri diversi. Esempio: in ContoBancario abbiamo due costruttori, uno senza parametro e uno con parametro il metodo println possiede parametri diversi a seconda del tipo base. Sovraccarico e polimorfismo È il compilatore che sceglie quale metodo invocare, prima che il programma venga eseguito. Si parla di selezione anticipata (early binding o anche binding statico). Sovraccarico e polimorfismo Polimorfismo. Si parla di polimorfismo quando un metodo ha comportamenti diversi in relazione al tipo realmente memorizzato nel parametro implicito. Esempio: nel metodo trasferiscia l utilizzo del metodo deposito di CB oppure di CR. Sovraccarico e polimorfismo È l interprete JVM che decide durante l esecuzione del programma quale metodo deve essere scelto. Si parla di selezione posticipata (late binding o anche binding dinamico). Il compilatore controlla solo che il riferimento sia di tipo classe o sottoclasse. 4

5 Conversione inversa Conversione inversa Si può fare la conversione inversa, vale a dire memorizzare un riferimento a superclasse in un riferimento a sottoclasse? È possibile fare una forzatura, cast, analogamente a quanto avviene per i tipi base. La conversione però ha senso solo se nel riferimento a superclasse è effettivamente memorizzato un riferimento a sottoclasse; in caso contrario si ha un errore. Esempio. Conversione inversa ContoRisparmio cr = new ContoRisparmio(2); ContoBancario cb = cr; ContoRisparmio cr2 = (ContoRisparmio)cb; //cast Senza cast il compilatore segnala errore: i tipi sono incompatibili. Conversione inversa Se però cb (sul quale si fa il cast) non contiene un riferimento a cr, durante l esecuzione la JVM lancia l eccezione ClassCastException. Come fare per essere sicuri che un riferimento contenga un riferimento valido per l oggetto e non commettere un errore? Conversione inversa Per essere sicuri che un riferimento contenga un riferimento valido per quell oggetto, si può usare l operatore instanceof. Sintassi. variabileoggetto instanceof Nomeclasse L operatore instanceof è booleano: restituisce true, se la variabile è del tipo NomeClasse, false altrimenti. Conversione inversa Esempio. Vogliamo essere sicuri che il riferimento cb contiene un riferimento a cr prima di eseguire l assegnazione a cr2, possiamo scrivere: if(cb instanceof ContoRisparmio) cr2 = (ContoRisparmio)cb; 5

6 Interfacce e riutilizzo del codice La classe OperasuNumeri contiene metodi per eseguire il calcolo della somma, del massimo e del numero di un elenco di dati inseriti (reale). (classe DataSet par. 6.4 e par. 9.1) public class OperasuNumeri{ private double s; private double max; private int cont; /* costruttore: inizializza la somma a zero, il massimo con l'estremo inferiore, il contatore dei numeri a zero */ public OperasuNumeri(){ s = 0; max = - Double.MAX_VALUE; cont = 0; //fine costruttore /* metodo aggiungi : aggiunge un valore alla volta aggiornando il valore della somma, del massimo e del contatore dei valori inseriti */ public void aggiungi(double x){ s = s + x; if(max < x) max = x; cont++; //fine aggiungi /* metodo somma : restituisce la somma dei valori inseriti */ public double somma(){ return s; /* metodo massimo : restituisce il massimo dei valori inseriti */ public double massimo(){ return max; /** metodo quanti : restituisce il numero di valori inseriti */ public int quanti(){ return cont; //fine classe OperasuNumeri Consideriamo la classe ContoBancario e supponiamo di avere voler gestire una banca rappresentata da un certo numero di conti bancari e di voler calcolare quanti soldi ci sono in totale nella banca (somma). 6

7 Supponiamo anche di voler sapere quanti sono i conti gestiti dalla banca (contatore) e quale è il conto bancario che ha il saldo maggiore (massimo). Avendo a disposizione la classe OperasuNumeri, possiamo riscriverla adattandola agli oggetti di tipo ContoBancario. Dovremo però fare qualche modifica. public class OperasuContoBancario{ private double s; private ContoBancario max; private int cont; /* non mettiamo alcun costruttore, quindi si attivera' quello di default */ /* Il massimo che cerchiamo e' il conto corrente che possiede il saldo maggiore */ public void aggiungi (ContoBancario x){ s = s + x.rendisaldo(); if(cont==0 max.rendisaldo() < x.rendisaldo()) max = x; //fine if /* quando cont = 0 si inizializza max con il primo conto bancario: valutazione pigra dei predicati */ cont++; public ContoBancario massimo(){ return max;... // altri metodi: quanti, somma... //fine OperasuContoBancario In maniera analoga potremo dover risolvere un altro problema in cui si vuole trovare quale oggetto, in un elenco di oggetti, ha il valore massimo in uno dei suoi dati. Esempio. Dato un borsellino contenente delle monete vogliamo sapere quale è la somma totale e quale è la moneta con il valore più elevato. Dovremo scrivere una classe OperasuMonete? Vediamo di risolvere il problema in altro modo. Dato un insieme di oggetti possiamo stabilire cosa si intende per misura di quell oggetto; vogliamo poi risolvere il problema di trovare l oggetto che ha la misura più grande. Esempi. Dato un insieme di Pile trovare la Pila che contiene più elementi (quantità di elementi). Dati dei numeri complessi trovare quello il cui modulo è maggiore (valore del modulo). Abbiamo bisogno di definire una proprietà astratta: essere misurabile. 7

8 Abbiamo visto che in Java per definire una proprietà astratta si usa una interfaccia con la quale si esprimono funzionalità comuni alle classi che la realizzano. Nell interfaccia si dichiarano le firme dei metodi che rappresentano le funzionalità. Le classi che realizzano l interfaccia dovranno costruire il codice per tutti i metodi dell interfaccia. Definiamo pertanto l interfaccia Misurabile per definire la proprietà di: avere una misura public interface Misurabile{ // metodo che rappresenta una misura double estraimisura(); // Object altridati(); Possiamo voler aggiungere un metodo altridati per poter rappresentare altre informazioni sugli oggetti misurabili. Esempio: il nome del correntista il cui conto bancario è il massimo; una caratteristica (figura) della moneta che ha il valore più grande il numero della Pila con maggior elementi. Lo scopo è quello di non aver più bisogno di scrivere la classe OperasuContoBancario (e classi analoghe per risolvere problemi analoghi). Per prima cosa dovremo dichiarare che ContoBancario realizza l interfaccia Misurabile e stabilire cosa intendiamo per misura di un conto bancario. Stabiliamo che la misura per CB è il valore del saldo. public class ContoBancario implements Misurabile{... public double estraimisura(){ return saldo; public Object altridati(){ return nome; //fine ContoBancario Però dobbiamo ancora fare delle modifiche sulla classe che esegue la somma e trova il massimo, in modo da poterla riutilizzare nella soluzione di problemi analoghi. La classe OperasuContoBancario eseguiva le operazioni per il calcolo della somma, del numero di elementi inseriti e trovava l elemento max: il conto bancario con il saldo maggiore. 8

9 Un altra classe avrebbe trovato come max la moneta con il valore più grande, oppure la Pila con il maggior numero di elementi. Dobbiamo allora di costruire una classe per gestire questi oggetti misurabili. Costruiamo una classe OperasuOggetti che gestisca le operazioni su oggetti le cui classi realizzano l interfaccia Misurabile. public class OperasuOggetti{ private double s; private Misurabile max; private int cont;...//costruttore public void aggiungi(misurabile x){ s = s + x.estraimisura(); if(cont==0 max.estraimisura()< x.estraimisura()) max = x; //fine if cont++; //fine aggiungi public Misurabile massimo(){ return max;...//metodi quanti, somma //fine OperasuOggetti Questa classe potrà essere utilizzata dagli oggetti la cui classe che realizza Misurabile. Questo è un esempio di polimorfismo. Il metodo estraimisura è polimorfo. Con l invocazione del metodo x.estraimisura() otteniamo diversi comportamenti. La classe ContoBancario realizza estraimisura restituendo il saldo. Un altra classe realizerà estraimisura restituendo un valore double con il significato di misura in quella classe. Sarà l interprete Java che, durante l esecuzione, vede quale riferimento è memorizzato in x ed attiva il metodo della classe corrispondente. In realtà x non ha un suo tipo di dato: x è di tipo interfaccia. 9

10 Con l interfaccia Misurabile abbiamo trasferito agli oggetti una caratteristica dei numeri: avere un valore; con i numeri possiamo eseguire somme, trovare un massimo, rappresentare una misura. I numeri possono anche essere messi in ordine. Possiamo anche ordinare oggetti? Prima di tutto ci dobbiamo chiedere se ha senso confrontare oggetti. Lo abbiamo appena fatto cercando il massimo, quindi i confronti possono avere significato. Esempio. Vogliamo mettere in fila dei conti bancari in modo che siano in ordine da quello con saldo minimo a quello con saldo massimo. Vogliamo mettere in fila dei numeri complessi in modo che siano secondo l ordine crescente del loro modulo (reale). Cosa significa per oggetti il dire: l oggetto1 è minore (maggiore o uguale) dell oggetto2? Abbiamo già visto con le stringhe che non possiamo confrontare i riferimenti. Dobbiamo pensare ad una proprietà: essere confrontabile. Esempio. Per la classe Complex può essere il modulo: è un valore reale, esiste un ordine. Nella classe ContoBancario potrebbe essere il saldo, un numero reale, e pensare un ordine dal più povero al più ricco; oppure potrebbe essere il numero di conto, numero intero: dal cliente che per primo ha aperto un conto all ultimo che lo ha attivato. Per la classe Studente potrebbe essere la matricola, numero intero, oppure il nome, una stringa e sappiamo che le stringhe hanno un ordine. Nel pacchetto java.lang c è un interfaccia che rappresenta la proprietà astratta essere confrontabile : l interfaccia Comparable: (par. 13.8) public interface Comparable{ int compareto(object other); Il metodo compareto restituisce un valore intero. La classe String realizza Comparable: s1.compareto(s2) con s1, s2 di tipo String. Interfaccia Comparable Siano a e b due oggetti di una classe che realizza Comparable, si ha: < 0 a precede b a.compareto(b) = 0 a è uguale a b > 0 a segue b Che cosa significano i termini precede, segue, uguale, dipende dalle scelte che facciamo nelle classi. 10

11 Interfaccia Comparable Esempio. Consideriamo la classe Studente con i campi nome e matricola; stabiliamo un confronto in base alla matricola. Nella classe Studente, che realizza Comparable, dobbiamo costruire il metodo compareto con il codice per esprimere il significato di confronto tra studenti. Interfaccia Comparable public int compareto(object altrostud) {Studente altro = (Studente)altrostud; int valore; if(this.matricola < altro.matricola) valore = -1; else if(matricola > altro.matricola) valore = 1; else valore = 0; return valore; //fine CompareTo Interfaccia Comparable Abbiamo dovuto fare il cast: Studente altro = (Studente)altrostud; perché altrostud non possiede il campo matricola, dato che è Object. Possiamo fare altro.matricola perché siamo nella classe Studente. Vediamo la classe ContoBancario che implementa due interfacce. Interfaccia Comparable public class ContoBancario implements Misurabile, Comparable{... // metodi: estraimisura, altridati public int compareto(object altro){ ContoBancario cb =(ContoBancario)altro; if(this.saldo < cb. saldo) return -1; if(this. saldo > cb. saldo) return 1; return 0; //fine compareto //fine CB /* non e strutturato: tre return, ma e chiaro */ Interfaccia Comparable Possiamo anche confrontare stringhe, ad esempio ordinare gli studenti per nome (purché diversi): public int compareto(object altro){ Studente altrostud = (Studente)altro; return nome.compareto(altrostud.nome); dove nome è this.nome e compareto è quello delle stringhe. Interfaccia Comparable Ora che sappiamo cosa significa confrontare oggetti, possiamo metterli in ordine: public static void ordlineare ( ContoBancario a[]){ ContoBancario sc; //ciclo su i //ciclo su k if(a[i].compareto(a[k]) > 0) //scambiare a[i] con a[k] 11

12 Interfaccia Comparable Se dobbiamo ordinare elementi di tipo Complex o Studente dobbiamo riscrivere l ordinamento. Possiamo fare meglio? All ordinamento basta avere degli oggetti che siano confrontabili, vale a dire oggetti la cui classe realizzi Comparable. In maniera analoga a quanto fatto con Misurabile, andiamo a definire una variabile di tipo Comparable e scriviamo un ordinamento per oggetti qualunque. Interfaccia Comparable public static void ordlineare( Comparable a[]){ //ordinamento per oggetti "confrontabili" Comparable sc; for(int i=0; i<a.length-1; i++) for(int k=i+1; k<a.length; k++) if(a[i].compareto(a[k])> 0){ sc = a[i]; a[i] = a[k]; a[k] = sc; //fine if Sovrascrivere il metodo equals Sovrascrivere il metodo equals Consideriamo un array di numeri, ci interessa sapere se ci sono oppure no degli elementi ripetuti nella sequenza; esempio a = (1, 3, 2, 7, 3, 4) il 3 è ripetuto a = (1, 2, 4, 7, -5, 0) sono tutti diversi avremo un algoritmo del tipo: algoritmo boolean distinti (array a) def. variabili diversi logico i, k intero Sovrascrivere il metodo equals diversi vero i 0 mentre i < a.length -1 e diversi eseguire per k = i+1 fino a a.length-1 eseguire se a[i] == a[k] allora diversi falso //fineif //fineper i i+1 //finementre restituire diversi // fine algoritmo Sovrascrivere il metodo equals Possiamo fare una cosa simile con gli oggetti? La superclasse Object possiede un metodo per verificare se due oggetti sono uguali: public boolean equals(object ob){ return (this == ob); Il confronto this==ob restituisce vero o falso. Il confronto precedente è fatto tra riferimenti, quindi per gestire oggetti uguali andiamo a sovrascrivere il metodo equals (come nella classe String). (par ) 12

13 Sovrascrivere il metodo equals Confrontiamo in base al numero di conto bancario: public class ContoBancario{... public boolean equals(object ob){ ContoBancario ac =(ContoBancario)ob; if(this.numeroconto == ac.numeroconto) return true; else return false; //fine equals //fine CB Sovrascrivere il metodo equals In CB possiamo anche scegliere di usare compareto invece di equals: a.compareto(b) == 0 corrisponde a a.equals(b) vero Non per tutti gli oggetti può aver senso cercare l ordine, mentre l uguaglianza è una caratteristica degli oggetti. Esercizio. Costruire un metodo per verificare se in un array di oggetti ci sono elementi ripetuti. Lista concatenata Struttura di dati lista concatenata La struttura di dati array memorizza i dati in maniera consecutiva in memoria e l accesso ai dati viene fatto tramite un indice. L attribuzione dello spazio viene fatta a livello di compilazione e quindi la dimensione dei dati è fissa (anche se poi si usa il raddoppio). Per poter costruire una sequenza di informazioni con una dimensione non fissata a priori è necessario agire in maniera diversa: durante l esecuzione del programma e con locazioni non necessariamente consecutive. Lista concatenata Per poter costruire una sequenza di informazioni non consecutive è necessario che ogni dato della struttura memorizzi un informazione per collegarsi all elemento successivo Consideriamo una nuova modalità di memorizzare i dati in cui l accesso non avviene più tramite un indice, ma tramite un indirizzo di memoria. Si costruisce una struttura di dati collegata, chiamata lista concatenata o catena. Lista concatenata Ogni nodo (anello) di una lista concatenata oltre all informazione memorizza il riferimento dell elemento successivo: avremo bisogno di un nodo con le caratteristiche del record per poter rappresentare due (o più) campi di tipo diverso: dato: info riferimento: next 13

14 Lista concatenata Il nodo sarà composto da : l informazione: un elemento di tipo base o un oggetto (l informazione che possiamo memorizzare anche nell array); il riferimento sarà un riferimento ad un nodo (un riferimento ad un elemento dello stesso tipo del nodo). Si intuisce che le definizione del nodo sarà un po particolare: dobbiamo definire il tipo del nodo, ma al suo interno dobbiamo usare quel tipo per definire il campo riferimento. Lista concatenata Poiché vi si accede tramite un riferimento le informazioni memorizzate non sono più necessariamente contigue in memoria, come nell array. Lista concatenata Supponiamo di voler costruire una struttura di dati lista concatenata per rappresentare una sequenza di interi. Sintassi. Definizione del nodo: class ElemIntero{ int info; //dato ElemIntero next; //riferimento Lista concatenata Come possiamo gestire l accesso per la classe ElemIntero? 1) classe public, elementi private: si devono costruire i metodi per accesso e modifica dei campi; 2) controllo di pacchetto (nessuna specifica) sia per la classe che per i campi: l accesso ai campi è tramite il nome; 3) classe interna privata e nessuna specifica sui campi. Adottiamo questa scelta. (par. 14.2) Lista concatenata Rappresentiamo un TDA su lista concatenata public class TDAsuListaConc{... //metodi per gestire il TDA... //classe interna private class ElemIntero{ int info; ElemIntero next; //fine classe ElemIntero Lista concatenata Quale vantaggio e quale sicurezza comporta questa scelta? Essendo privata la classe non è visibile dall esterno: quindi si rispettano per i suoi campi le direttive dell incapsulamento. Essendo interna e non specificando l accesso i suoi campi sono visibili internamente alla classe che realizza il TDA e si possono utilizzare direttamente, senza dover scrivere in ElemIntero i metodi di accesso e di modifica per i campi. 14

15 Confronto tra array e lista concatenata Confronto tra array e lista concatenata Mettiamo a confronto le due strutture di dati per ciò che riguarda: accesso elemento successivo inserimento e cancellazione dimensione spazio di memoria Accesso: lista concatenata L accesso è sequenziale: per accedere ad un dato si deve scorrere la lista facendo una scansione lineare. Di fatto si esegue una ricerca nella struttura esaminando i nodi fino a trovare il valore cercato: sia a di tipo ElemIntero, cerchiamo se a.info è uguale ad un valore x, iniziando dal primo elemento della struttura fino all ultimo elemento della struttura. Non si può ritornare indietro: si può solo vedere in avanti. Accesso: lista concatenata L accesso al campo informazione si ottiene con: a.info inizio La struttura è accessibile da un riferimento inizio che vede il primo nodo. Si può anche gestire la struttura con un primo elemento privo di informazione: nodo vuoto. x Accesso: array L accesso è diretto: per accedere ad un dato si utilizza l indice dell array x Se v è il nome dell array, v[i] rappresenta l accesso all i-esimo elemento: nel nostro esempio x coincide con v[3]. Con l accesso diretto non c è un ordine da rispettare: v[3], v[0], v[5], : si può tornare indietro. Successivo: lista concatenata Ogni nodo, tranne l ultimo, contiene nel campo next la referenza (indirizzo di memoria) al nodo successivo. Se a è di tipo ElemIntero e a vede un nodo della lista, per passare al nodo successivo si memorizza in a il riferimento al nodo successivo: a = a.next; //riferimento a.next a 15

16 Successivo: array Dato un elemento nella posizione i, v[i], il successivo (se i v.length-1) si trova nella posizione i+1; per passare al successivo si fa: v[++i] oppure i = i+1; uso di v[i] v[i] v[i+1] Inserimento e cancellazione: lista concatenata Per inserire un nuovo nodo si deve: 1) costruire il nuovo nodo 2) agganciarlo nella posizione voluta con assegnazioni sui riferimenti 1) costruzione del nuovo nodo: ElemIntero nuovo = new ElemIntero(); nuovo.info = x; 2) per poterlo agganciare bisogna sapere dove. Inserimento e cancellazione: lista concatenata Bisogna trovare una posizione nella lista, dopo la quale effettuare l inserimento del nuovo nodo: questa posizione si ottiene facendo la scansione lineare alla ricerca di un valore z (campo info) che dovrà essere presente nella lista. Inserimento e cancellazione: lista concatenata Per cancellare un nodo (successivo) bisogna assegnare ad un riferimento next il valore del riferimento successivo: a.next = a.next.next; z a x nuovo.next=a.next a.next=nuovo a Inserimento e cancellazione: array Per inserire un nuovo dato nella i-esima posizione si deve: 1) aumentare la lunghezza dell array, se l array è pieno: costruire un nuovo array w 2) copiare i valori fino alla posizione i nel nuovo array, inserire il nuovo elemento, copiare i rimanenti valori (copiare dall ultimo fino all i-esimo sul successivo e poi inserire). 2 bis) se non serve la posizione intermedia, si può aggiungere il nuovo dato alla fine. Inserimento e cancellazione: array Per cancellare un dato dalla i-esima posizione si deve: 1) ricopiare gli elementi a partire dalla posizione i+1 sul precedente 1 bis) se l elemento da togliere è unico e non interessa l ordine, si può copiare l ultimo sull i-esimo posto. 16

17 Dimensione: lista concatenata La dimensione non è fissata: non c è un limite sulla dimensione massima, l unico limite è lo spazio di memoria: non bisogna mai ridimensionare una lista concatenata. Si può gestire male la memoria e occuparla tutta: se viene esaurita la memoria disponibile la JVM interrompe l esecuzione segnalando: OutOfMemoryError Dimensione: array L array è a dimensione fissa. Possiamo risolvere il problema con la tecnica del raddoppio, riassegnando il riferimento della nuova area di memoria al vecchio riferimento. Anche in questo caso il limite è lo spazio di memoria complessivo (OutOfMemoryError). Spazio di memoria: lista concatenata La lista concatenata occupa più spazio: ogni nodo è composto da due campi: l informazione il riferimento Se anche l informazione è un oggetto, il nodo è composto da due riferimenti, uno dei quali vede l elemento successivo e l altro l oggetto. Spazio di memoria: array L array occupa meno spazio: c è solo l informazione che deve essere memorizzata Conclusione. L array richiede spostamento di dati (O(n)) nel caso di inserimento e cancellazione, che per la lista sono O(1); possiede invece accesso diretto, che è O(1), mentre la lista accesso sequenziale, che è O(n). Pertanto il tipo di problema suggerirà quale struttura di dati sia più idonea: molti accessi e poche modifiche oppure pochi accessi e molte modifiche. Lista concatenata Se la lista concatenata non ha una dimensione massima dobbiamo però individuarne la fine: un valore di riferimento dal quale non si acceda ad alcun nodo. Tale valore ènull. Pila su lista concatenata Vogliamo ora realizzare il TDA Pila di interi su una lista concatenata: dovremo realizzare gli assiomi: verifica se la Pila è vuota guarda la testa inserisci in testa estrai la testa inizio 17

18 Pila su lista concatenata Dobbiamo avere un riferimento al primo nodo per poter accedere alla struttura di dati: ElemIntero primo; Dobbiamo rappresentare la situazione: Pila vuota. Se la Pila è vuota, non c è alcun elemento nella Pila, quindi primo non contiene nulla : primo = null; Pila su lista concatenata Dobbiamo inserire un elemento in testa: 1) costruiamo un elemento: ElemIntero nuovo = new ElemIntero(); nuovo.info = valore; 2) agganciamo nuovo in testa: nuovo deve diventare la nuova testa: nuovo.next = primo; //aggancio alla Pila primo = nuovo; //nuovo diventa la testa Pila su lista concatenata Queste assegnazioni valgono anche quando si inserisce il primo elemento, partendo da lista vuota: nuovo.next = primo; //aggancio alla Pila primo = nuovo; //nuovo diventa la testa Quando la lista è vuota, primo = null; quindi la prima assegnazione memorizza null nel campo nuovo.next: il primo elemento è anche l ultimo. La seconda assegnazione lo fa diventare il primo elemento della lista. Pila su lista concatenata Dobbiamo estrarre la testa: se la Pila non è vuota: primo = primo.next; se la Pila è vuota: lanciamo l eccezione EmptyStackException Se nella Pila c è un solo elemento, con l istruzione precedente si vuota la Pila: infatti, primo.next=null (l unico è anche l ultimo), pertanto primo diventa null e quindi la Pila è vuota. Pila su lista concatenata Dobbiamo guardare la testa: se la Pila non è vuota: primo.info; se la Pila è vuota: lanciamo l eccezione EmptyStackException Vediamo pertanto la classe che realizza una Pila di interi su una lista concatenata. Pila su lista concatenata public class PilaListaConc { // Pila di interi realizzata con // lista concatenata private ElemIntero primo = null; public boolean vuota() {// isempty() if(primo == null) return true; else return false; 18

19 Pila su lista concatenata public void inserisci (int elem) { // push ElemIntero nuovo = new ElemIntero(); nuovo.next= primo; nuovo.info=elem; primo = nuovo; Pila su lista concatenata public void estrai() {// pop if (!vuota() ) primo = primo.next; else throw new EmptyStackException(); public int testa () {// top if (!vuota() ) return primo.info; else throw new EmptyStackException(); Pila su lista concatenata /** Classe interna: la classe e' privata ma le sue variabili d'istanza sono visibili ai metodi della classe PilaListaConc */ private class ElemIntero { int info; ElemIntero next; //fine PilaListaConc Complessità delle operazioni della Pila Vogliamo calcolare la complessità delle operazioni che riguardano la realizzazione degli assiomi della Pila. Le prestazioni dipendono dalla struttura di dati e non dal TDA. Caso1. Il tempo di esecuzione di ogni operazione su una Pila realizzata con array di dimensioni fisse è costante: abbiamo solo un numero costante di assegnazioni, confronti e ritorno di valore. Il tempo non dipende dalla dimensione n della struttura dati: quindi O(1). Complessità delle operazioni della Pila Caso2. Nella realizzazione con array ridimensionabile, l unica cosa che cambia è l operazione inserisci (push). La realizzazione con array ridimensionabile alcune volte richiede un tempo O(n): tale tempo è necessario per copiare tutti gli elementi nel nuovo array, all interno del metodo raddoppio. il ridimensionamento viene fatto ogni n operazioni Complessità delle operazioni della Pila Cerchiamo di valutare il costo medio: questo metodo di stima si chiama analisi ammortizzata delle prestazioni asintotiche. Per ogni elemento inserito il costo è O(1) Quando l array è pieno il ridimensionamento comporta un ciclo con costo O(n): n inserimenti a costo O(1) 1 inserimento a costo O(n) 19

20 Complessità delle operazioni della Pila Con la notazione O-grande valgono le seguenti relazioni: O(1) = c O(n) = c n n O(1) = c n = O(n) O(n) + O(n) = 2 c n = O(n) O(n)/O(n) = c n/c n = 1 = O(1) Complessità delle operazioni della Pila Pertanto: costomedio = (n O(1) + 1 O(n)) / (n+1) = = (O(n) + O(n)) / (n+1) = = O(1) Distribuendo il tempo, speso per il ridimensionamento, in parti uguali su tutte le operazioni push si ottiene ancora O(1). Le operazioni sono tutte O(1), tranne push che è O(1) in media. Complessità degli assiomi della Pila sulle due strutture di dati lista concatenata array 1) isempty: if( ) O(1) O(1) 2) pop: primo=primo.next O(1) sp O(1) 3) top: restituisce un valore O(1) O(1) Strutture di dati per numeri e oggetti 4) push: nuovo + O(1) raddoppio O(1) 2 assegnazioni in media Strutture di dati per numeri e oggetti Come abbiamo portato agli oggetti le proprietà dei numeri (Misurabile, Comparable) così utilizziamo le strutture di dati per memorizzare sia numeri che oggetti: array di numeri e array di oggetti, lista concatenata di numeri e lista concatenata di oggetti. In realtà dovremmo dire: array e lista concatenata di riferimenti a oggetti. Infatti la struttura di dati gestisce i riferimenti per le operazioni di inserimento, cancellazione, ecc. Array numeri oggetti Numeri e oggetti campi 20

21 Lista concatenata numeri Numeri e oggetti Strutture di dati per numeri e oggetti Quando vogliamo capire come funziona una struttura di dati o cosa fa un TDA, ci basta trattare numeri. Quando vogliamo gestire un problema più generale ed utilizzare gli oggetti, aggiungiamo al TDA e alla struttura di dati le caratteristiche dell oggetto. oggetti Strutture di dati per numeri e oggetti Quando abbiamo introdotto la struttura dati array, l abbiamo vista per gestire interi (reali). Siamo poi passati a considerare array su oggetti. Per memorizzare informazioni che riguardavano degli studenti abbiamo introdotto la classe Stud, per accedere al campo matricola dell i-esimo studente dobbiamo individuare la posizione e poi il campo, tramite un metodo di accesso: corso23[i].matricola() Strutture di dati per numeri e oggetti Se vogliamo costruire una lista concatenata per informazioni di tipo Stud dovremo definire il nodo: class ElemStud{ Stud info; ElemStud next; e per accedere al campo matricola da un riferimento a che vede il nodo: a.info.matricola() 21

Conversioni di tipo fra sottoclasse e superclasse

Conversioni di tipo fra sottoclasse e superclasse Conversioni di tipo fra sottoclasse e superclasse Conversioni di tipo fra sottoclasse e superclasse Può esserci la necessità di memorizzare un riferimento di una sottoclasse in un riferimento a superclasse.

Dettagli

Interfacce per il riutilizzo del codice

Interfacce per il riutilizzo del codice Interfacce per il riutilizzo del Nelle SoluzioniLab3 c è una classe di nome Operasunumeri con la quale si esegue il calcolo della somma, del massimo e del numero di dati inseriti. public class Operasunumeri{

Dettagli

Coda su lista concatenata

Coda su lista concatenata Cosa studiare nel libro Capitolo 7: tutto tranne Argomenti avanzati 7.2 e 7.5 Capitolo 8: solo 8.5, 8.6, 8.7, 8.8 e Argomenti avanzati 8.1 Capitolo 9: tutto fino a 9.6 (escluso) Capitolo 10: tutto fino

Dettagli

Stampare una Pila. Stampare una Pila. Stampare una Pila. Stampare una Pila

Stampare una Pila. Stampare una Pila. Stampare una Pila. Stampare una Pila Stampare una Pila Stampare una Pila Quando si stampa un Pila gli elementi appaiono nell ordine inverso a quello di inserimento; inoltre la Pila si vuota. Supponiamo di avere introdotto nella Pila i valori

Dettagli

Stampare una Pila. Stampare una Pila. Stampare una Pila. Stampare una Pila. Pila o Stack

Stampare una Pila. Stampare una Pila. Stampare una Pila. Stampare una Pila. Pila o Stack Stampare una Pila Stampare una Pila Quando si stampa un Pila gli elementi appaiono nell ordine inverso a quello di inserimento; inoltre la Pila si vuota. Supponiamo di avere introdotto nella Pila i valori

Dettagli

Array. Walter Didimo

Array. Walter Didimo Array Walter Didimo Un problema ricorrente Gli strumenti di programmazione che abbiamo visto sin qui non sono ancora sufficienti per risolvere tutti i problemi di base Consideriamo ad esempio il seguente

Dettagli

Trasformare array paralleli in array di record

Trasformare array paralleli in array di record Trasformare array paralleli in array di record Un array è una struttura di dati omogenea: gli elementi dell array sono tutti dello stesso tipo (che è il tipo dell array). A volte è necessario gestire informazioni

Dettagli

Trasformare array paralleli in array di record

Trasformare array paralleli in array di record Trasformare array paralleli in array di record Un array è una struttura di dati omogenea: gli elementi dell array sono tutti dello stesso tipo (che è il tipo dell array). A volte è necessario gestire informazioni

Dettagli

Trasformare array paralleli in array di record

Trasformare array paralleli in array di record Trasformare array paralleli in array di record Trasformare array paralleli in array di record Un array è una struttura di dati omogenea: gli elementi dell array sono tutti dello stesso tipo (che è il tipo

Dettagli

Casi di prova. Il problema dell ordinamento. Casi di prova. Casi di prova. Casi di prova

Casi di prova. Il problema dell ordinamento. Casi di prova. Casi di prova. Casi di prova Casi di prova Casi di prova Quando si vuole testare un algoritmo si devono costruire vari casi di prova. Invece di eseguire il programma più volte si può costruire un file di dati contenente tutti i casi

Dettagli

Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals()

Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals() Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals() Ereditarietà (Inheritance) RIASSUMIAMO DALLA SCORSA

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 09 ADT: Lista, Pila, Coda A. Miola Marzo 2007 http://www.dia.uniroma3.it/~java/fondinf2/ ADT: Lista, Pila, Coda 1 Contenuti Tipo

Dettagli

SOMMARIO STACK. STACK: specifica STACK

SOMMARIO STACK. STACK: specifica STACK SOMMARIO STACK Pila (stack): una struttura dati lineare a cui si può accedere soltanto mediante uno dei suoi capi per memorizzare e per estrarre dati. Specifica (descrizione). Implementazione (realizzazione).

Dettagli

Esempi in Java di program.ne O-O

Esempi in Java di program.ne O-O Esempi in Java di program.ne O-O Ereditarietà Polimorfismo statico e dinamico Esercitazione laboratorio Interfaccia Comparable e Comparator 1 Gerarchia di ereditarietà Persona IS_A Docente Studente Tecnico

Dettagli

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05 Strutture dati Il che cosa e il come Il che cosa ed il come Struttura dati: descrive come sono organizzati i dati e come sono realizzate le operazioni su di essi (cioe come si accede ai dati) Specifica

Dettagli

Bank account. private double balance; 11/2/2011

Bank account. private double balance; 11/2/2011 Il Linguaggio Java Ereditarietà Bank account class BankAccount { public BankAccount() { balance = 0; } public void deposit(double amount) { balance += amount; } public void withdraw(double amount) { balance

Dettagli

LINKEDLIST: implementazione iteratore. LINKEDLIST: iteratore INNERITERATOR INNERITERATOR

LINKEDLIST: implementazione iteratore. LINKEDLIST: iteratore INNERITERATOR INNERITERATOR LINKEDLIST: iteratore Il metodo iterator() restituisce un oggetto iteratore sulla lista per scandire gli elementi in sequenza a partire dall inizio della lista. public Iterator iterator() { return new

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

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi. In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi. 1 strutture dati (astratte) Una struttura dati astratti consiste di uno o più insiemi con delle operazioni

Dettagli

Le liste. Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132

Le liste. Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132 Le liste Prof. Francesco Accarino IIS Sesto San Giovanni Via Leopardi 132 Le Liste Le liste non sequenziali (concatenate) sono costituite da elementi che vengono memorizzati in memoria centrale non uno

Dettagli

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni Esercizio 1 Dire quale è la complessità temporale del seguente metodo, espressa con notazione asintotica O(.) (con la migliore

Dettagli

Ad esempio, creazione di una lista di numeri interi e di una lista di oggetti di tipo Persona:

Ad esempio, creazione di una lista di numeri interi e di una lista di oggetti di tipo Persona: List e LinkedList La classe List consente di creare un array dinamico di oggetti di un certo tipo, specificato in fase di dichiarazione dell oggetto lista. Si dice che l array è dinamico nel senso

Dettagli

Programmazione in Java (I modulo) Lezione 20: Ereditarietà

Programmazione in Java (I modulo) Lezione 20: Ereditarietà Programmazione in Java (I modulo) Lezione 20: Ereditarietà Ereditarietà (Inheritance) Il programmatore definisce una classe generale In seguito definisce una classe più specifica Aggiungo soltanto nuovi

Dettagli

Fondamenti di informatica T-1 (A K) Esercitazione 9: array

Fondamenti di informatica T-1 (A K) Esercitazione 9: array Fondamenti di informatica T-1 (A K) Esercitazione 9: array AA 2018/2019 Tutor Lorenzo Rosa lorenzo.rosa@unibo.it 2 Esercitazione 9 Introduzione al calcolatore e Java Linguaggio Java, basi e controllo del

Dettagli

tipi di dato astratti

tipi di dato astratti tipi di dato astratti A. FERRARI ADT Un tipo di dato astratto o ADT (Abstract Data Type) è un tipo di dato le cui istanze possono essere manipolate con modalità che dipendono esclusivamente dalla semantica

Dettagli

Istruzioni di selezione in Java 1

Istruzioni di selezione in Java 1 Le istruzioni del programma Istruzioni di selezione in Java Corso di laurea in Il controllo del flusso del programma Istruzioni condizionali o di selezione Istruzioni di ripetizione Espressioni condizionali

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

Istruzioni di selezione in Java 1

Istruzioni di selezione in Java 1 Ordine di esecuzione Istruzioni di selezione in Java Corso di laurea in Comunicazione digitale Nei metodi l ordine di esecuzione delle istruzioni è sequenziale se non specificato altrimenti Alcune istruzioni

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

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO CENTRO STUDI ULISSE Via Buccino, n. 22 - C.a.p. 84018 - Scafati (SA) Tel. Fax. 081.19970299-339.2365416-349.4152010 E-mail: info@centrostudiulisse.it - www.centrostudiulisse.it OCA JAVA 7 SE PROGRAMMER

Dettagli

TIPO DI DATO ASTRATTO

TIPO DI DATO ASTRATTO TIPO DI DATO ASTRATTO Tipo di dato astratto Esempio: Vogliamo rappresentare un sistema di prenotazione di esami universitari. Dati immagazzinati: prenotazioni esami Operazioni supportate: prenota(esame,

Dettagli

Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61

Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61 Capitolo 5 Array e collezioni c 2005 Pearson Education Italia Capitolo 5-1 / 61 Sommario: Array e collezioni 1 Array Array di oggetti Lunghezza di un array Accesso agli elementi di un array Array e cicli

Dettagli

ALGORITMI E STRUTTURE DATI

ALGORITMI E STRUTTURE DATI Esercitazioni del corso di: ALGORITMI E STRUTTURE DATI Tutor: Francesca Piersigilli email: francesca.piersigilli@unicam.it Strutture dati elementari Tecniche di organizzazione dei dati: scelta della struttura

Dettagli

Java. Java : compilatore e interprete. Programma Java. Java Virtual Machine. Il linguaggio Java è un linguaggio di programmazione ad alto livello

Java. Java : compilatore e interprete. Programma Java. Java Virtual Machine. Il linguaggio Java è un linguaggio di programmazione ad alto livello Java Il linguaggio Java è un linguaggio di programmazione ad alto livello algoritmo: astrazione della realtà linguaggio di programmazione: astrazione del processore variabile e tipo: astrazione della locazione

Dettagli

Java. Java : compilatore e interprete. Programma Java. Java Virtual Machine. Token. Alfabeto

Java. Java : compilatore e interprete. Programma Java. Java Virtual Machine. Token. Alfabeto Java Il linguaggio Java è un linguaggio di programmazione ad alto livello algoritmo: astrazione della realtà linguaggio di programmazione: astrazione del processore variabile e tipo: astrazione della locazione

Dettagli

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object Programmazione orientata agli oggetti La classe, metodi e classi final, this 1 La classe Negli esempi fatti nella prima parte del corso abbiamo definito alcune classi, per esempio Counter e Orologio, senza

Dettagli

Liste concatenate e allocazione dinamica

Liste concatenate e allocazione dinamica Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2018/2019 Argomenti del Corso Ogni lezione consta di una spiegazione assistita da slide, e seguita

Dettagli

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object Programmazione orientata agli oggetti La classe, metodi e classi final, this 1 La classe Negli esempi fatti nella prima parte del corso abbiamo definito alcune classi, per esempio Counter e Orologio, senza

Dettagli

Riuso di classi. Ereditarietà. Ereditarietà. Spesso si ha bisogno di classi simili

Riuso di classi. Ereditarietà. Ereditarietà. Spesso si ha bisogno di classi simili Riuso di classi Spesso si ha bisogno di classi simili Si vuole cioè riusare classi esistenti per implementare attributi e metodi leggermente diversi Non è pratico copiare la classe originaria e modificarne

Dettagli

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73 Capitolo 9 Tipi enumerativi, tipi generici e interfacce c 2005 Pearson Education Italia Capitolo 9-1 / 73 Sommario: Tipi enumerativi, tipi generici e interfacce 1 Definizione di tipi enumerativi La classe

Dettagli

Ereditarietà (ultima)

Ereditarietà (ultima) Ereditarietà (ultima) Classi astratte Un ibrido tra classi e interfacce Hanno alcuni metodi implementati normalmente, altri astratti Un metodo astratto non ha implementazione abstract class AccountTransaction...

Dettagli

Ereditarietà (ultima)

Ereditarietà (ultima) Ereditarietà (ultima) Classi astratte Un ibrido tra classi e interfacce Hanno alcuni metodi implementati normalmente, altri astratti Un metodo astratto non ha implementazione abstract class AccountTransaction

Dettagli

Array. Definizione e utilizzo di vettori

Array. Definizione e utilizzo di vettori Array Definizione e utilizzo di vettori Array (1/2) Un array o vettore rappresenta un insieme di elementi dello stesso tipo. Sintassi per la creazione di un array: tipo_elementi[] nome; nome = new tipo_elementi[numero_elementi];

Dettagli

14 - Metodi e Costruttori

14 - Metodi e Costruttori 14 - Metodi e Costruttori 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

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

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa E16 Esercizi Strutture Collegate e Oggetti C. Limongelli Maggio 2012 1 Contenuti q Verifiche universali ed esistenziali su strutture

Dettagli

Definizione di classi. Walter Didimo

Definizione di classi. Walter Didimo Definizione di classi Walter Didimo Definizione di classi Fino ad ora abbiamo imparato a: creare oggetti da classi già pronte usare gli oggetti creati, invocando metodi la creazione e l uso di oggetti

Dettagli

Indice. Prefazione. 3 Oggetti e Java 53

Indice. Prefazione. 3 Oggetti e Java 53 Prefazione xv 1 Architettura dei calcolatori 1 1.1 Calcolatori e applicazioni 1 1.1.1 Alcuni esempi di applicazioni 3 1.1.2 Applicazioni e interfacce 4 1.2 Architettura dei calcolatori 7 1.2.1 Hardware

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 04 Introduzione ai Tipi astratti di dato A. Miola Febbraio 2007 http://www.dia.uniroma3.it/~java/fondinf2/ Introduzione ADT 1

Dettagli

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I) Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I) Ing. Gianluca Caminiti Sommario ( OOP ) Programmazione Object-Oriented Incapsulamento, Ereditarietà, Polimorfismo Richiami

Dettagli

Le liste con array. Rimuovere la perla rossa costringe a spostare molte altre perle. Dove mettere la perla verde se si è esaurito il filo?

Le liste con array. Rimuovere la perla rossa costringe a spostare molte altre perle. Dove mettere la perla verde se si è esaurito il filo? Liste Linkate Le liste con array Volendo usare una metafora, l implementazione delle liste tramite array è come infilare le perle (gli oggetti della lista) in un filo di lunghezza predefinita. E chiaro

Dettagli

Fondamenti di Informatica I

Fondamenti di Informatica I Sapienza Università di Roma, Facoltà di Ingegneria Corso di Fondamenti di Informatica I Canale 1 (A-K) Anno Accademico 2009-2010 Corso di Laurea in Ingegneria Informatica Docente: Camil Demetrescu Esercitatore:

Dettagli

Esercizi di Algoritmi e Strutture Dati

Esercizi di Algoritmi e Strutture Dati Esercizi di Algoritmi e Strutture Dati Moreno Marzolla marzolla@cs.unibo.it Ultimo aggiornamento: 3 novembre 2010 1 Trova la somma/1 Scrivere un algoritmo che dati in input un array A[1... n] di n interi

Dettagli

Si usano quando serve accesso rapido sia in lettura che in scrittura su un insieme non ordinato

Si usano quando serve accesso rapido sia in lettura che in scrittura su un insieme non ordinato Le tavole hash È il modo con cui sono realizzati gli HashSet Si usano quando serve accesso rapido sia in lettura che in scrittura su un insieme non ordinato Principio base Gli array hanno le caratteristiche

Dettagli

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 16 Tipi riferimento e stringhe. Carla Limongelli.

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 16 Tipi riferimento e stringhe. Carla Limongelli. Corso di Laurea Ingegneria Civile Fondamenti di Informatica Dispensa 16 Tipi riferimento e stringhe Carla Limongelli Maggio 2010 Definizione di metodi 1 Contenuti Tipi riferimento Stringhe e oggetti String

Dettagli

Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I {

Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I { Interfacce Una interfaccia è un astrazione per un insieme di funzioni pubbliche delle quali si definisce solo la segnatura, e non le istruzioni. Un interfaccia viene poi implementata da una o più classi

Dettagli

Calcolare x n = x x x (n volte)

Calcolare x n = x x x (n volte) Calcolare x n = x x x (n volte) Abbiamo bisogno di: una variabile ris in cui ad ogni iterazione del ciclo si ha un risultato parziale, e che dopo l ultima iterazione contiene il risultato finale; una variabile

Dettagli

Java. Java: compilatore e interprete. Programma Java. Java Virtual Machine. Token. Alfabeto

Java. Java: compilatore e interprete. Programma Java. Java Virtual Machine. Token. Alfabeto Java Java: compilatore e interprete Il linguaggio Java è un linguaggio di programmazione ad alto livello - algoritmo: astrazione della realtà - linguaggio di programmazione: astrazione del processore -

Dettagli

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa E17. C. Limongelli Maggio 2012

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa E17. C. Limongelli Maggio 2012 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa E17 C. Limongelli Maggio 2012 1 Contenuti q Definizione di classi con ereditarietà q Uso di tipi di dati astratti q Ricorsione

Dettagli

Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java

Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java AA 2018/2019 Tutor Lorenzo Rosa lorenzo.rosa@unibo.it 2 Programma Introduzione al calcolatore e Java Linguaggio Java, basi e

Dettagli

Corso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Questionario di autovalutazione 4

Corso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Questionario di autovalutazione 4 Corso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Questionario di autovalutazione 4 Domanda n. 1 Argomento: Rappresentazione dell'informazione Domanda: Il numero binario

Dettagli

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1 Operazioni sulle liste Definiamo una serie di procedure e funzioni per operare sulle liste. Usiamo liste di interi per semplicità, ma tutte le operazioni sono realizzabili in modo del tutto analogo su

Dettagli

Programmazione II Compitino (Vers. B)

Programmazione II Compitino (Vers. B) Programmazione II Compitino (Vers. B) 15 gennaio 2015 Cognome Jackson Nome Michael Matricola 696969 Anno di corso 1 Nei seguenti quesiti, quando vi è richiesto di scrivere un programma, potete limitarvi

Dettagli

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object Programmazione orientata agli oggetti La classe, metodi e classi final, this 1 La classe Negli esempi fatti nella prima parte del corso abbiamo definito alcune classi, per esempio Counter e Orologio, senza

Dettagli

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari 7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa

Dettagli

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati Paolo Torroni Dipartimento di Elettronica, Informatica e Sistemistica Università degli Studi di Bologna Anno Accademico 2008/2009 Sommario

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java. Prof. Angela Bonifati

Algoritmi di Ricerca. Esempi di programmi Java. Prof. Angela Bonifati Passaggio dei parametri in Java Nel seguente esempio public class parametri2 public static void main(string args[]) int x = 1; int y; double d[] = new double[2]; d[0] = 25; y= metodo1(d, x); System.out.println("Il

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Classi astratte. Nella gerarchia delle classi, potrebbe essere utile prevedere un supertipo generale per le classi che si usano. Ad esempio: Figura

Classi astratte. Nella gerarchia delle classi, potrebbe essere utile prevedere un supertipo generale per le classi che si usano. Ad esempio: Figura Classi astratte Nella gerarchia delle classi, potrebbe essere utile prevedere un supertipo generale per le classi che si usano. Ad esempio: Figura Rettangolo getarea() Quadrato getarea() getarea() Cerchio

Dettagli

Subtype Polymorphism. Conversioni di tipo. Conversioni di tipo. Subtyping. Conversioni di tipo. Interfacce e subtype polimorfismo

Subtype Polymorphism. Conversioni di tipo. Conversioni di tipo. Subtyping. Conversioni di tipo. Interfacce e subtype polimorfismo Subtype Polymorphism Interfacce e subtype polimorfismo Tipi, sottotipi e conversioni di tipo Polimorfismo e dinamic dispatch Conversioni di tipo Variabile: locazione con un tipo associato Tipo della variabile

Dettagli

Java Gli array. Array

Java Gli array. Array Java Gli array 1 Gli array In generale un array è una sequenza di locazioni di memoria, che contengono entità dello stesso tipo, e a cui si può fare riferimento con un nome comune Le entità che compongono

Dettagli

Paradigmi della PO. Incapsulamento. Ereditarietà. Polimorfismo. Software per TLC - AA 2008/2009 1

Paradigmi della PO. Incapsulamento. Ereditarietà. Polimorfismo. Software per TLC - AA 2008/2009 1 Incapsulamento Paradigmi della PO Ereditarietà Polimorfismo Software per TLC - AA 2008/2009 1 Incapsulamento Una classe contiene dati e metodi Filosofia Ai dati si accede solo attraverso i metodi I metodi

Dettagli

Fondamenti di Informatica L-B Esercitazione n 5 Java: Interfaccia Comparable, Array

Fondamenti di Informatica L-B Esercitazione n 5 Java: Interfaccia Comparable, Array Fondamenti di Informatica L-B Esercitazione n 5 Java: Interfaccia Comparable, Array A.A. 2007/08 Tutor: Barbara Pettazzoni barbara.pettazzoni@studio.unibo.it Interfaccia Comparable L altra volta abbiamo

Dettagli

Fondamenti di Informatica T-1

Fondamenti di Informatica T-1 Fondamenti di Informatica T-1 Interfaccia Comparable e Collezioni Tutor: Allegra De Filippo allegra.defilippo@unibo.it a.a. 2015/2016 Fondamenti di Informatica T-1 Allegra De Filippo 1 / 22 Interfaccia

Dettagli

Programmazione a oggetti

Programmazione a oggetti Programmazione a oggetti Quanti oggetti, tra di loro parlando, fanno programmi. Pilu Crescenzi piluc@dsi.unifi.it Università di Firenze Programmazione a oggetti p.1/32 Cosa è un oggetto Una scatola software

Dettagli

Corso sul linguaggio Java

Corso sul linguaggio Java Corso sul linguaggio Java Modulo JAVA7 B1 Gestione di liste 1 Prerequisiti Programmazione base in Java Utilizzo di classi e oggetti Tecnica di allocazione dinamica Gestione di liste Classificazione delle

Dettagli

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas Classi e oggetti A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas Oggetti La programmazione orientata agli oggetti, OOP (Object-Oriented Programming),

Dettagli

Programmazione M.A. Alberti. Comunicazione digitale AA 2009/ Classi in Java 1. Le classi in Java. Oggetti. Classi. Classi. Visibilità dei dati

Programmazione M.A. Alberti. Comunicazione digitale AA 2009/ Classi in Java 1. Le classi in Java. Oggetti. Classi. Classi. Visibilità dei dati Oggetti Le classi in Java Corso di laurea in Un oggetto è definito dal suo stato - descrive le sue caratteristiche comportamento - quello che può fare Ad esempio: il modello di una moneta Una moneta può

Dettagli

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa 17. A. Miola Gennaio 2012

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa 17. A. Miola Gennaio 2012 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 17 A. Miola Gennaio 2012 1 Contenuti q Array paralleli q Array e oggetti q Ricerca sequenziale q Ricerca binaria q Fusione di sequenze

Dettagli

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti: Liste concatenate Collezione ordinata di nodi head tail next next next next element element element element Ø Anna Carlo Paolo Simona ciascun nodo contiene due riferimenti: - un riferimento "element" a

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

Programmazione orientata agli oggetti. Ivan Lanese

Programmazione orientata agli oggetti. Ivan Lanese Programmazione orientata agli oggetti Ivan Lanese Argomenti Programmazione orientata agli oggetti Classi Oggetti Costruttori Scrivere grosse applicazioni La gran parte delle applicazioni sono GROSSE Windows

Dettagli

Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio

Concetti Base Encapsulation ed Ereditarietà Programmare con l Ereditarietà. Java: Ereditarietà. Damiano Macedonio Dipartimento di Informatica, Università degli Studi di Verona Corso di Programmazione per Bioformatica Introduzione Ereditarietà in Sintesi È uno dei concetti chiave della programmazione orientata agli

Dettagli

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2. Dispensa E09. C. Limongelli Marzo 2008

Altri Esercizi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2. Dispensa E09. C. Limongelli Marzo 2008 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa E09 Altri Esercizi C. Limongelli Marzo 2008 http://www.dia.uniroma3.it/~java/fondinf2/ Altri Esercizi 1 Contenuti!Definizione

Dettagli

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente Liste doppie Liste: semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente Rappresentazione grafica semplice: doppia: Gli

Dettagli

Struttura di dati lista concatenata

Struttura di dati lista concatenata Struttura di dati lista concatenata Lista concatenata Consideriamo una nuova modalità di memorizzare i dati in cui l accesso non avviene più tramite un indice, che individua la posizione del dato nella

Dettagli

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java Programmazione Orientata agli Oggetti in Linguaggio Java Ereditarietà e Polimorfismo: Polimorfismo - d Regole Sintattiche e Semantiche versione 1.2 Questo lavoro è concesso in uso secondo i termini di

Dettagli

Fondamenti di Informatica T-1 Modulo 2

Fondamenti di Informatica T-1 Modulo 2 Fondamenti di Informatica T-1 Modulo 2 1 Obiettivi di questa esercitazione 1. Array e funzioni 2. Array e funzioni ricorsive 3. Array e confronto di array 2 Esercizio 1 Creare un programma che legga da

Dettagli

Realizzare classi. Cosa abbiamo fatto finora. Realizzare classi. Realizzare classi. Realizzare classi. Realizzare classi

Realizzare classi. Cosa abbiamo fatto finora. Realizzare classi. Realizzare classi. Realizzare classi. Realizzare classi Cosa abbiamo fatto finora Abbiamo visto: tipi di dato base (numeri, booleani e caratteri) oggetti e riferimenti a oggetti di un tipo già definito (String e Rectangle) strutture di controllo (sequenza,

Dettagli

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà L ereditarietà è il meccanismo attraverso cui viene implementata la relazione di specializzazione (is-a). L ereditarietà è il meccanismo attraverso cui una classe (derivata) eredita da un altra classe

Dettagli

Introduzione alla Programmazione in Java attraverso un esempio commentato

Introduzione alla Programmazione in Java attraverso un esempio commentato Corso di Studi in Informatica Programmazione 1 corso B prof. Elio Giovannetti Introduzione alla Programmazione in Java attraverso un esempio commentato Programmazione 1 B - a.a. 2002-03 53 Modello di memoria

Dettagli

16 - Ereditarietà, tipi e gerarchie

16 - Ereditarietà, tipi e gerarchie 16 - Ereditarietà, tipi e gerarchie 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

Dettagli

16 - Ereditarietà, tipi e gerarchie

16 - Ereditarietà, tipi e gerarchie 16 - Ereditarietà, tipi e gerarchie 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

Dettagli