Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Slides:



Advertisements
Presentazioni simili
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Advertisements

Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica
UD 3: “Le Liste” UD 4: “Pile e Code” UD 5: “Alberi e grafi”
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Esercizi su alberi binari
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su alberi binari di ricerca
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Corso di Informatica (Programmazione)
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Algoritmi e Strutture Dati IV. Heap e Code di Priorità
tipo astratto, implementazione, algoritmi
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Corso JAVA Lezione n° 11 Istituto Statale di Istruzione Superiore “F. Enriques”
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi.
Nota (rif. alla lezione precedente): Vector vs ArrayList Le classi generiche Vector e ArrayList sono sostanzialmente equivalenti, ma: I metodi.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Polimorfismo Significato Significato Varie famiglie Varie famiglie Polimorfismo in java Polimorfismo in java Polimorfismo di Sottotipo: Apparato in Java.
1 Un esempio con iteratore: le liste ordinate di interi.
Definizione di classi Capitolo 18 febbraio 2004 Definizione di classi.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
Esercitazione del 7 marzo 2008 Ereditarieta’. Esercizio: soluzione Implementare la seguente specifica che definisce un tipo di dato Libro.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
Primo Compitino Terzo Esercizio Implementare il tipo di dato astratto Table un oggetto di tipo Table ha due colonne e un numero variabile di righe.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Esercitazione sull’ ordinamento 20 maggio 2003
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
ADT 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 24 Introduzione ai.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 26 Esercizi F. Gasparetti, C. Limongelli Maggio 2011 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Verifica presenza di elementi comuni… N1 - Date due liste di stringhe scrivere un metodo che verifichi la presenza di elementi comuni ad entrambe La classe per le liste di stringhe: class NodoLista { public String info; public NodoLista next; public NodoLista(String s, NodoLista n) {info = s; next = n;} } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Verifica presenza di elementi comuni… Bisogna verificare che esiste almeno un elemento nella prima lista che è uguale ad un elemento nella seconda lista Verifica esistenziale sulla prima lista Verifica esistenziale sulla seconda lista Fissato un elemento della prima lista, verificare che sia presente nella seconda Il metodo isMember verifica se una stringa s è presente in una lista l Il metodo nodiComuni esegue la verifica sulla prima lista http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Il metodo isMember /* data una stringa e una lista verifica che la stringa sia presente in qualche nodo della lista: verfica esistenziale sulla seconda lista*/ public static boolean isMember(String s, NodoLista l){ boolean esiste; esiste = false; while (l!=null && !esiste){ if (s.equals(l.info)) esiste = true; l = l.next; } return esiste; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Verifica presenza di elementi comuni… Verifica esistenziale sulla prima lista public static boolean nodiComuni(NodoLista l1, NodoLista l2){ boolean comune; comune = false; while (l1 != null && !comune){ if (isMember(l1.info,l2)) comune = true; l1 = l1.next; } return comune; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Costruzione lista nodi comuni… N2 - Date due liste di stringhe restituire una nuova lista che contenga gli elementi comuni ad entrambe le liste date Algoritmo: Costruzione con un nodo generatore: Creo il primo nodo fittizio Finche’ ci sono elementi da esaminare nella prima lista se l’elemento che sto esaminando e’ presente nella seconda lista allora creo un nuovo nodo che lo contiene e attacco il nuovo nodo in coda alla lista che sto costruendo Restituisco il secondo nodo della lista costruita http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

…Costruzione lista nodi comuni… public static NodoLista listaNodiComuni (NodoLista l1, NodoLista l2){ NodoLista n,app; // costruzione con record generatore n = new NodoLista(null,null); app = n; while (l1 !=null){ if (isMember(l1.info,l2)){ app.next = new NodoLista(l1.info,null); app = app.next; } l1 = l1.next; return n.next; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Merge liste … N3 - Date due liste di stringhe, ordinate in modo non decrescente, scrivere un metodo merge che effettui l’operazione di fusione restituendo una nuova lista ordinata, contenente tutti gli elementi delle due liste L’algoritmo è identico all’algoritmo di fusione di due array ordinati, cambia solo la modialita’ di scansione delle sequenze di elementi Il confronto tra le stringhe viene realizzato dal metodo maggiore http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Il metodo per confrontare le stringhe Invece di implementare il confronto lessicografico tra stringhe come visto in precedenza, usiamo il metodo compareTo definito nella classe String: public static boolean maggiore(String s1, String s2){ boolean res; if (s1.compareTo(s2)<=0) // s1<=s2 res = false; else res = true; return res; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Merge liste … public static NodoLista mergeListe (NodoLista l1, NodoLista l2){ NodoLista n,app;//per la nuova lista n = new NodoLista(null, null); app = n; while(l1 !=null && l2 !=null) // se l1.info <= l2.info if (maggiore(l2.info,l1.info)){ //creo un nodo con il contenuto di l1 app.next = new NodoLista(l1.info,null); app = app.next; // mi posiziono sul prossimo nodo di l1 l1 = l1.next; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Merge liste … else{ //l1.info>l2 // creo un nodo con il contenuto di l2 app.next = new NodoLista(l2.info,null); app = app.next; // mi posiziono sul prossimo nodo di l1 l2 = l2.next; } // quando termina il while una delle due liste e' null http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Merge liste if (l1==null) while(l2!=null){ app.next = new NodoLista(l2.info,null); app = app.next; l2 = l2.next; } else while(l1!=null){ app.next = new NodoLista(l1.info,null); l1 = l1.next; return n.next; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Il metodo ricercaSequenza… N4 - Scrivere il metodo ricercaSequenza che, date due liste di stringhe la e lb, verifichi se esiste una sequenza di elementi in la corrispondente agli elementi in lb Esempio: data la = ( A B B C D E ) e lb = ( B B C ) la risposta dovrà essere true, mentre per la = ( A B B C D E ) e lb = ( A B C ) la risposta dovrà essere false http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Il metodo ricercaSequenza… Considero il generico elemento della lista la come la testa della lista che esamino attualmente. Due liste sono uguali se i primi nodi della lista la coincidono con tutti i nodi della lista lb Esempio: la = ( A B B C D E ) e lb = ( B B C ) Se analizzo la lista la a partire da B osservo che tutti I nodi della lista lb coincidono con i primi nodi di la Ricorsione su la http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Il metodo ricercaSequenza… Passo base la vuota  non ho individuato la sottosequenza Passo ricorsivo La sottosequenza viene individuata se i primi elementi di la coincidono con tutti gli elementi di lb oppure la sottosequenza viene individuata sulla lista che parte dal nodo successivo ad la http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Il metodo ricercaSequenza… public static boolean ricercaSequenza(NodoLista l1, NodoLista l2){ /* verifica esistenziale */ boolean trovata; if (l1 == null) trovata = false; else trovata = uguali(l1,l2) || ricercaSequenza(l1.next,l2); return trovata; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Il metodo uguali… Date due liste l1 e l2, verifica che i primi elementi di l1 siano uguali a tutti gli elementi di l2 Ricorsione su entrambe le liste Passo base: Se e’ terminata la scansione di l2 allora ho esaminato con successo tutti gli elementi true Se e’ terminata la scansione di l1 allora l1 non puo’ contenere tutti gli elementi di l2 quindi false N.B.: I due passi base vanno necessariamente in questo ordine Passo ricorsivo La ricerca ha successo se i primi due elementi delle liste sono uguali e se sono uguali le liste l1.next e l2.next http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

… Il metodo uguali… public static boolean uguali (NodoLista l1, NodoLista l2){ boolean sonouguali; /*passo base */ if (l2 == null) sonouguali = true; else if (l1 == null) sonouguali = false; /* passo ricorsivo */ sonouguali = l1.info.equals(l2.info) && uguali(l1.next,l2.next); return sonouguali; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Eliminazione dei doppioni da una lista N5 - Scrivere il metodo eliminaDoppioni che, data una lista di stringhe, restituisca una nuova lista ottenuta eliminando dalla lista data i doppioni Esempio: data elle = ( A A A B A B ) eliminaDoppioni(elle) restituisce la lista ( A B ) Tre versioni del problema Creazione della nuova lista in modo iterativo modificando quella originale Creazione della nuova lista in modo iterativo senza modificare quella originale (come richiesto) Creazione della lista in modo ricorsivo senza modificare quella originale http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Creazione iterativa di una lista che modifica quella originale … Per ogni nodo l della lista Si eliminano dal resto della lista (l.next) tutti i nodi che hanno il campo informazione uguale a l.info Eliminazione di tutti i nodi il cui campo informazione è uguale ad una data stringa (l.info). Bisogna tenere un puntatore che referenzia il nodo precedente a quello da eliminare l.info non è una stringa qualsiasi, bensì la stringa contenuta nel primo nodo della lista Il metodo elimina non passa come parametri attuali l.info e l.next, ma l.info e l. In questo modo il primo nodo – che non può essere eliminato - serve per inizializzare il puntatore al nodo precedente http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

…Creazione iterativa di una lista che modifica quella originale … //elimina tutte le occorrenze di s dalla lista l // il cui primo nodo contiene proprio s public static void elimina(String s, NodoLista l){ NodoLista succ,prec; prec = l; succ = l.next; while (succ != null){ if (s.equals(succ.info)){ prec.next = succ.next; succ = prec.next; } else { succ = succ.next; prec = prec.next; } } } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

…Creazione iterativa di una lista che non modifica quella originale … Il metodo elimina va applicato ad ogni nodo della lista (che via via viene modificata) public static void eliminaTutti(NodoLista l){ NodoLista app; while (l != null){ /* elimino tutti i doppioni di l.info dal resto della lista */ elimina(l.info,l); l = l.next; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

…Creazione iterativa di una nuova lista che modifica quella originale … Banalmente si applica il metodo eliminaTutti alla copia della lista data in input: public static NodoLista eliminaDoppioni(NodoLista l){ NodoLista n,app; //nuova lista con doppioni n = new NodoLista(null,null); app = n; while (l != null){ app.next = new NodoLista(l.info,null); app = app.next; l = l.next; } n = n.next; return eliminaTutti(n.next); http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Creazione ricorsiva di una lista che non modifica quella originale … Passo base lista vuota: tutta la lista e’ stata scandita Passo ricorsivo: vedo se il primo elemento e' gia' presente nel resto della lista che e’ stata creata eliminando tutti i doppioni. se e' gia’ presente restituisco la nuova lista senza il primo elemento altrimenti restituisco la lista nuova lista a cui e’ stato aggiunto in testa un nuovo nodo che contiene il primo elemento della lista che si sta esaminando http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Creazione ricorsiva di una lista che non modifica quella originale … public static NodoLista eliminaRIC(NodoLista l){ NodoLista app; app = null; if (l != null){ app = eliminaRIC(l.next); if (!isMember(l.info,app)) app = new NodoLista(l.info,app); } return app; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Altri esercizi I tipi astratti Coppia, Razionale, Complesso Rappresentazione dei tipi Coppia, Razionale, Complesso Rappresentazione compatta di matrici sparse http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Un altro esempio: i numeri razionali Consideriamo il tipo astratto Q dei numeri razionali, ricordando quanto già visto nel corso circa la classe Razionale Gli elementi a/b del dominio di interesse possono essere denotati da una coppia di numeri interi (a, b) a denota il numeratore della frazione, mentre b denota il denominatore Le operazioni del tipo Q sono le usuali operazioni : Addizione, Moltiplicazione, ecc. In effetti anche Coppia è un tipo astratto di dato che può essere opportunamente rappresentato da una classe Coppia http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Il tipo astratto Coppia . . . Il tipo astratto Coppia rappresenta il prodotto cartesiano di due domini I valori di tale tipo sono coppie di valori presi da due domini specificati Le operazioni associate sono semplicemente la costruzione il calcolo del valore della prima componente il calcolo del valore della seconda componente http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Il tipo astratto Coppia La specifica del tipo Coppia, con i suoi domini (tra cui quello di interesse) e le sue funzioni, è quindi la seguente Domini Coppia : dominio di interesse del tipo T1 : dominio dei valori che possono comparire come prima componente delle coppie T2 : dominio dei valori che possono comparire come seconda componente delle coppie http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Il tipo astratto Coppia Funzioni formaCoppia(T1 a, T2 b)   Coppia pre: nessuna post: RESULT è il valore corrispondente alla coppia la cui prima componente è a e la seconda è b primaComponente(Coppia c)   T1 post: RESULT è la prima componente della coppia c secondaComponente(Coppia c)   T2 post: RESULT è la seconda componente della coppia c http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Rappresentazione del tipo Coppia . . . La realizzazione del tipo astratto Coppia come una classe Java Coppia è immediata Rappresentiamo i valori del tipo astratto utilizzando due campi dati (variabili di istanza) di tipo opportuno per memorizzare le due componenti della coppia Schema realizzativo: utilizziamo lo schema realizzativo funzionale come illustrato precedentemente Interfaccia di classe: come visto definiamo un metodo per ciascuna delle funzioni del tipo astratto Realizziamo la funzione formaCoppia attraverso un costruttore http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Coppia public class Coppia { // rappresentazione dei valori protected Object c1; protected Object c2; // realizzazione delle funzioni del tipo astratto public Coppia (Object c1, Object c2) { // realizza formaCoppia this.c1 = c1; this.c2 = c2; } public Object primaComponente() { return c1; } public Object secondaComponente() { return c2; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Coppia Sebbene alcune segnature non sembrano strettamente funzionali o coincidenti con le funzioni del tipo di dato astratto, come ad esempio: Java: public Object primaComponente(); ADT: primaComponente(Coppia c)   T1 lo schema realizzativo del tipo di dato astratto è funzionale poiché i metodi della classe operano sui valori del tipo astratto e non eseguono operazioni di modifica di oggetti Java (oggetti di invocazione e parametri) che rappresentano tali valori http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Il tipo astratto Razionale . . . Un numero razionale è un numero reale ottenibile come rapporto tra due numeri interi, il secondo dei quali diverso da 0. Ogni numero razionale quindi può essere espresso mediante una frazione a/b. A questo punto possiamo definire il tipo di dato astratto Razionale riprendendo il tipo Coppia, notando che: I due domini T1 e T2 possono essere i due domini di valori che possono assumere numeratore e denominatore del numero razionale Le funzioni del tipo Razionale sono quelle classiche, ad esempio addizione e moltiplicazione. http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Il tipo astratto Razionale . . . Domini Razionale : dominio di interesse del tipo T1 : dominio dei valori che può assumere il numeratore T2 : dominio dei valori che può assumere il denominatore http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Il tipo astratto Razionale . . . Funzioni (1 di 2) formaRazionale(T1 a, T2 b)   Razionale pre: b non rappresenti 0 post: RESULT è il valore corrispondente al numero razionale a/b numeratore(Razionale q)   T1 pre: nessuna post: RESULT è il numeratore del razionale q denominatore(Razionale q)   T2 post: RESULT è il denominatore del razionale q . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Il tipo astratto Razionale . . . Funzioni (2 di 2) add(Razionale q1, Razionale q2) Razionale pre: nessuna post: RESULT è il numero razionale corrispondente alla somma dei due razionali rappresentati da q1 e q2 molt(Razionale q1, Razionale q2)   Razionale post: RESULT è il numero razionale corrispondente alla moltiplicazione dei due razionali rappresentati da q1 e q2 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Rappresentazione del tipo Razionale . . . L’implementazione della classe Razionale può essere basata su Coppia estendendo opportunamente le funzionalità di quest’ultima classe Rappresentiamo i valori del tipo astratto con oggetti Coppia Schema realizzativo funzionale Interfaccia di classe: definiamo un metodo per ciascuna delle funzioni del tipo astratto Realizziamo la funzione formaRazionale attraverso un costruttore http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Razionale class Razionale extends Coppia { public Razionale (Long c1, Long c2){ super (c1,c2); // richiama il costruttore di Coppia } public void simpl() { // semplifica il razionale long app, num, den; num = ((Long)(this.c1)).longValue(); den = ((Long)(this.c2)).longValue(); app = mcd(num,den); c1 = new Long(num / app); c2 = new Long(den / app); public String toString(){ simpl(); return primaComponente()+ "/" +secondaComponente(); } . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Razionale public Razionale add(Razionale q) { long a = ((Long)c1).longValue(); long b = ((Long)c2).longValue(); long c = ((Long)q.c1).longValue(); long d = ((Long)q.c2).longValue(); return new Razionale(new Long(a*d+b*c), new Long(b*d)); } public Razionale mult(Razionale q) { return new Razionale(new Long(a*c),new Long(b*d)); } . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Razionale private static long mcd(long x, long y){ long t,r; if ( x < y ) {/* se x < y li scambio */ t = x; x = y; y = t; } while ( y > 0 ) { r = x % y; y = r; return x; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Razionale Le due funzioni add e molt sono state implementate con uno schema funzionale, ovvero esse non modificano gli oggetti su cui esse vengono invocate. public Razionale add(Razionale q) { . . . return new Razionale(. . .); } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Il tipo astratto Complesso . . . I numeri complessi sono formati da due parti, una parte reale ed una parte immaginaria: a + ib Ancora una volta possiamo definire il tipo di dato astratto riprendendo il tipo Coppia, notando che: I due domini T1 e T2 possono essere i due domini di valori che possono assumere parte reale e parte immaginaria del numero complesso Le funzioni del tipo Complesso sono quelle classiche, ad esempio addizione, moltiplicazione, etc. http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Rappresentazione del tipo Complesso. . . Come per il Razionale, una classe che rappresenta il tipo astratto Complesso può essere basata sulle seguenti scelte: Rappresentiamo il dominio dei valori di interesse del tipo astratto con oggetti Coppia Schema realizzativo funzionale Interfaccia di classe: definiamo un metodo per ciascuna delle funzioni del tipo astratto Realizziamo la funzione formaComplesso attraverso un costruttore http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Complesso La specifica del tipo Complesso, con i suoi domini (tra cui quello di interesse) e le sue funzioni, è quindi la seguente Domini Complesso : dominio di interesse del tipo T1 : dominio dei valori che può assumere la parte reale di un numero complesso T2 : dominio dei valori che può assumere la parte immaginaria di un numero complesso T3 : dominio dei valori che può assumere il modulo di un numero complesso T4 : dominio dei valori che può assumere la fase di un numero complesso http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Complesso Funzioni (1 di 2) formaComplesso (T1 a, T2 b)   Complesso pre: nessuna post: RESULT è il valore corrispondente al numero complesso a+ib reale(Complesso c)   T1 post: RESULT è il valore corrispondente alla prima componente del numero complesso immaginaria(Complesso c)   T2 post: RESULT è il valore corrispondente alla seconda componente del numero complesso http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Complesso Funzioni (2 di 2) modulo(Complesso c)   T3 pre: nessuna post: RESULT è il valore corrispondente al modulo del numero complesso fase(Complesso c)   T4 post: RESULT è il valore corrispondente alla fase del numero complesso add(Complesso c1, Complesso c2)   Complesso post: RESULT è il valore che rappresenta il numero complesso somma dei numeri complessi c1 e c2 molt(Complesso c1, Complesso c2)   Complesso post: RESULT è il valore che rappresenta il numero complesso prodotto dei numeri complessi c1 e c2 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Complesso public class Complesso extends Coppia { // realizzazione delle funzioni del tipo astratto public Complesso(Double r, Double i) { super(r, i); } public Double reale() { return ((Double) c1).doubleValue(); public Double immaginaria() { return ((Double) c2).doubleValue(); } . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Complesso public Double modulo() { double re = ((Double) c1).doubleValue(); double im = ((Double) c2).doubleValue(); return new Double(Math.sqrt(re * re + im * im)); } public Double fase() { double ret; if (im >= 0) ret = Math.acos(re / modulo()); else ret = -Math.acos(re / modulo()); return new Double(ret); } . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Rappresentazione del tipo Complesso public Complesso add(Complesso cc) { double a = ((Double) c1).doubleValue(); double b = ((Double) c2).doubleValue(); double c = ((Double) cc.c1).doubleValue(); double d = ((Double) cc.c2).doubleValue(); return new Complesso(new Double(a+c), new Double(b+d)); } public Complesso mult(Complesso cc) { return new Complesso(new Double(a*c - b*d), new Double(b*c + a*d)); http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Esercizio Implementare il tipo di dato astratto Complesso basandosi sui valori di modulo e fase (insiemi T3 e T4 del ADT) piuttosto che parte reale e parte immaginaria (insiemi T1 e T2 del ADT) http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Matrici sparse . . . Ci sono dei casi in cui Ie caratteristiche dei valori di una matrice, che si utilizzano in un programma, consentono una memorizzazione più efficiente rispetto a quella tradizionale con array Ad esempio, per una matrice di interi in cui sia noto che la grande maggioranza degli elementi è uguale a zero, si potrebbero memorizzare i soli elementi diversi da zero Si usa il termine matrice sparsa . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . Matrici sparse Si usa il termine matrice sparsa per indicare una matrice in cui la gran parte degli elementi ha un valore prefissato (detto valore dominante) Per tali matrici si possono utilizzare rappresentazioni ad hoc, dette rappresentazioni compatte L'idea fondamentale di tali rappresentazioni è quella di memorizzare solo gli elementi con valore diverso dal valore dominante http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Esempio di matrice sparsa 16 3 15 2 21 1 11 8 5 4 Elemento dominante = 0 Ogni elemento con valore diverso dal dominante viene rappresentato da una terna Indice di riga Indice di colonna Valore dell’elemento http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

La rappresentazione compatta di una matrice sparsa... Queste terne sono a loro volta rappresentate mediante un array C di oggetti Terna con tre attributi: riga, colonna e valore Un indice lastValue rappresenta l’indice dell’ultima terna significativa di C C viene detta rappresentazione compatta di A http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

. . . La rappresentazione compatta di una matrice sparsa... Gli oggetti Terna di C vengono memorizzati in modo ordinato, ad esempio ordinando per riga e, nell'ambito delIa stessa riga, per colonna La prima terna di C è utilizzata per memorizzare le informazioni relative al numero di righe N ed il numero di colonne M di A, e nel campo relativo al valore, il valore dell' elemento dominante Se max è il numero di componenti di C, e m (con m < max) è il numero di elementi di A memorizzati in C, Ie informazioni ad essi relative sono rappresentate negli elementi di indice da 1 a m di C, e nelle eventuali componenti successive di C (cioè quelIe di indice maggiore di m) viene memorizzata terna di valori che non corrisponde ad alcuna componente delIa matrice A http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...La rappresentazione compatta di una matrice sparsa Esempio: la rappresentazione compatta della seguente matrice è 16 3 15 2 21 1 11 8 5 4 rig col val 4 6 1 8 2 3 11 21 15 5 16 7 9 lastValue = 6 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Quando conviene usare la rappresentazione compatta Quando la matrice è sufficientemente sparsa Sia A una matrice di m righe e n colonne Se maxA è il numero di elementi che si devono memorizzare esplicitamente, l’occupazione di memoria richiesta per rappresentare la matrice A in forma compatta è 3*(maxA+1) + 1 l’occupazione di memoria richiesta per rappresentare la matrice A in forma usuale è m*n La rappresentazione compatta risparmia memoria quando 3*(maxA+1) + 1< m*n … maxA < (m*n – 4)/3 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

La segnatura per il tipo matrice interface MatriceDiInteri { boolean isEmpty(); //post: restituisce true sse la matrice e' vuota //r=c=0 int numRighe(); //post: numero di righe della matrice int numColonne(); // post: numero di colonne della matrice int accedi(int r, int c); //pre: r,c>=0 //post: restituisce l'lemento in pos izione r,c void memorizza(int r, int c, int n); //post: memorizza l'elemento n in posizione r,c } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Due diverse implementazioni Matrice con array: rappresentazione di Java Matrice Compatta: rappresentazione efficiente di una matrice sparsa http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice con Array... Attributi class MatriceConArray implements MatriceDiInteri { private int[][] mat; private int nrighe; private int ncolonne; Il costruttore inizializza a 0 tutte le componenti public MatriceConArray (int r, int c) {//costruttore int i,j; this.mat = new int[r][c]; //inizializza a zero for (i=0; i<r; i++) for(j=0; j<c; j++) this.mat[i][j] = 0; this.nrighe = r; this.ncolonne = c; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice con Array... Metodi d’istanza public int numRighe(){ // post: numero di righe della matrice return this.nrighe; } public int numColonne(){ // post: numero di colonne della matrice return this.ncolonne; public boolean isEmpty() { // post: restituisce true sse la matrice // ha dimensioni nulle return (this.nrighe==0 && this.ncolonne==0); } . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice con Array public int accedi(int r, int c){ //pre: r,c>=0 //post:restituisce l’elemento in posizione r,c return this.mat[r][c]; } public void memorizza(int r, int c, int n){ //post:memorizza l'elemento n in posizione r,c this.mat[r][c] = n; } . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice con Array public String toString(){ int i,j; String res = ""; for (i=0; i<nrighe; i++){ for(j=0; j<ncolonne; j++) res = res + mat[i][j] +" "; res = res +"\n"; } return res; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Matrice Compatta: la classe terna ... Attributi class Terna { int riga; int colonna; int valore; Costruttore public Terna(int r, int c, int v){ riga = r; colonna = c; valore = v; } Metodi d’istanza public int getRiga(){ return riga; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice Compatta: la classe terna public int getColonna(){ return colonna; } public int getValore(){ return valore; public String toString(){ return (riga +" " + colonna +" " + valore); }//end class Terna http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Matrice Compatta... Costruttore: inizializza tutte le terne a 0 class MatriceCompatta implements MatriceDiInteri { private Terna[] info; private int dim; // dimensione dell'array private int lastValue; // dimensione effettiva // dell'array Costruttore: inizializza tutte le terne a 0 public MatriceCompatta (int dim, int rig, int col, int dom) { int i; this.info = new Terna[dim]; this.info[0] = new Terna(rig,col,dom); for(i = 1; i < dim; i++) this.info[i] = new Terna(0,0,0); this.dim = dim; this.lastValue = 0; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice Compatta public int numRighe() { // post: numero di righe della matrice return this.info[0].riga; } public int numColonne() { // post: numero di colonne della matrice return this.info[0].colonna; } public int getLastValue() { // post: dimensioni effettive della matrice return this.lastValue; } public boolean isEmpty() { //post: restituisce true sse la matrice // ha dimensioni nulle return (this.info[0].riga==0 && this.info[0].colonna==0); } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Matrice Compatta: il metodo accedi public int accedi(int r, int c) { //pre: r,c>=0 //post: restituisce l‘elemento in posizione r,c int i = 1, res; while (info[i].riga < r && i < this.lastValue) i++; //esco sulla riga r se esiste while (info[i].riga == r && info[i].colonna < c && i < this.lastValue) i++; //esco sulla colonna r se esiste if (info[i].riga == r && info[i].colonna == c) res = info[i].valore; else res = info[0].valore; return res; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Matrice Compatta: il metodo memorizza... public void memorizza(int r, int c, int n) { //pre: r,c>=0 //post: memorizza l'elemento n in posizione r,c // se c'e' spazio /* se si sostituisce un elemento diverso dal dominante con uno dominante, si devono shiftare tutti gli elementi in alto */ int i = 1, j; /* vedo se la componente da memorizzare esiste */ while (info[i].riga < r && i <= this.lastValue) i++; //esco sulla riga r se esiste while (info[i].riga == r && info[i].colonna < c && i <= this.lastValue) i++; http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice Compatta: il metodo memorizza... /* se il valore da memorizzare e' il dominante e se esiste gia' un valore nella matrice, allora devo eliminare la componente */ if (n == info[0].valore) { if (info[i].riga == r && info[i].colonna == c) { //elimino l'el. in posizione i for (j = i+1; j < this.dim; j++) info[j-1] = info[j]; this.lastValue = this.lastValue - 1; } /* se il valore da memorizzare e' dominante e se non esiste gia' un valore nella matrice, allora non devo fare niente */ http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice Compatta: il metodo memorizza... else { // n != info[0].valore /*il val. da memorizzare non e' dominante: se gia' esiste sovrascrivo altrimenti aggiungo */ if (info[i].riga == r && info[i].colonna == c) info[i].valore = n; // sovrascrivo else //aggiungo se c'e' posto if (this.lastValue == this.dim-1) System.out.println ("** Memorizzazione impossibile **"); else { for(j = this.lastValue; j >= i; j--) this.info[j+1] = this.info[j]; this.lastValue = this.lastValue + 1; info[i] = new Terna(r,c,n); } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice Compatta: il metodo toString public String toString() { int i; String res; res = ""; for (i=0; i<=lastValue; i++) res = res +(info[i].toString()) + "\n"; return res; } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Matrice Compatta: esempi d’uso... La classe UsaMatrici usa una MatriceConArray class UsaMatrici{ public static void main(String[] args){ MatriceConArray emme; emme = new MatriceConArray(4,6); System.out.println(emme.toString()); emme.memorizza(1,2,9); emme.memorizza(3,4,7); emme.memorizza(2,2,8); } http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Matrice Compatta: esempi d’uso... Esempio di esecuzione con MatriceConArray 0 0 0 0 0 0 0 0 9 0 0 0 0 0 8 0 0 0 0 0 0 0 7 0 Press any key to continue . . . http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

...Matrice Compatta: esempi d’uso... La classe UsaMatrici usa una MatriceCompatta class UsaMatrici{ public static void main(String[] args){ MatriceCompatta emme; emme = new MatriceCompatta(5,4,6,0); emme.memorizza(1,2,9); emme.memorizza(3,4,7); emme.memorizza(2,2,8); System.out.println(emme.toString()); }} http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Matrice Compatta: esempi d’uso... Esempio di esecuzione con MatriceCompatta 4 6 0 inserisco in riga 1, colonna 2 il valore 9 1 2 9 inserisco in riga 3, colonna 4 il valore 7 3 4 7 inserisco in riga 2, colonna 2 il valore 8 2 2 8 http://www.dia.uniroma3.it/~java/fondinf/ Esercizi

Esercizio Definire, secondo la segnatura MatriceDiInteri una classe concreta che rappresenta una matrice compatta usando una sequenza di terne (struttura collegata) invece di un array di terne http://www.dia.uniroma3.it/~java/fondinf/ Esercizi