La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 26 Esercizi F. Gasparetti,

Presentazioni simili


Presentazione sul tema: "1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 26 Esercizi F. Gasparetti,"— Transcript della presentazione:

1 1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 26 Esercizi F. Gasparetti, C. Limongelli Maggio 2011

2 2 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;} }

3 3 … 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

4 4 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; }

5 5 … 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; }

6 6 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

7 7 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; } …Costruzione lista nodi comuni…

8 8 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

9 9 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; }

10 10 … 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; }

11 11 … 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

12 12 … 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); app = app.next; l1 = l1.next; } return n.next; }

13 13 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

14 14 … 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

15 15 … 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

16 16 … 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; }

17 17 … 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

18 18 … 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; else /* passo ricorsivo */ sonouguali = l1.info.equals(l2.info) && uguali(l1.next,l2.next); return sonouguali; }

19 19 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

20 20 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

21 21 …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; } } }

22 22 …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; }

23 23 …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); }

24 24 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

25 25 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; }

26 26 Altri esercizi  I tipi astratti Coppia, Razionale, Complesso  Rappresentazione dei tipi Coppia, Razionale, Complesso  Rappresentazione compatta di matrici sparse

27 27 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

28 28 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

29 29 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

30 30 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 pre: nessuna post: RESULT è la prima componente della coppia c  secondaComponente(Coppia c) T2 pre: nessuna post: RESULT è la seconda componente della coppia c

31 31 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

32 32 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; }

33 33 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

34 34 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.

35 35 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

36 36 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 pre: nessuna post: RESULT è il denominatore del razionale q ...

37 37 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 pre: nessuna post: RESULT è il numero razionale corrispondente alla moltiplicazione dei due razionali rappresentati da q1 e q2

38 38 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

39 39 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(); }...

40 40 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) { 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*c),new Long(b*d)); }...

41 41 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; x = y; y = r; } return x; }

42 42 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(...); }

43 43 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.

44 44 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

45 45 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

46 46  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 pre: nessuna post: RESULT è il valore corrispondente alla prima componente del numero complesso  immaginaria(Complesso c) T2 pre: nessuna post: RESULT è il valore corrispondente alla seconda componente del numero complesso... Rappresentazione del tipo Complesso

47 47  Funzioni (2 di 2)  modulo(Complesso c) T3 pre: nessuna post: RESULT è il valore corrispondente al modulo del numero complesso  fase(Complesso c) T4 pre: nessuna post: RESULT è il valore corrispondente alla fase del numero complesso  add(Complesso c1, Complesso c2) Complesso pre: nessuna post: RESULT è il valore che rappresenta il numero complesso somma dei numeri complessi c1 e c2  molt(Complesso c1, Complesso c2) Complesso pre: nessuna post: RESULT è il valore che rappresenta il numero complesso prodotto dei numeri complessi c1 e c2... Rappresentazione del tipo Complesso

48 48 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(); } Rappresentazione del tipo Complesso

49 49 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 re = ((Double) c1).doubleValue(); double im = ((Double) c2).doubleValue(); double ret; if (im >= 0) ret = Math.acos(re / modulo()); else ret = -Math.acos(re / modulo()); return new Double(ret); } Rappresentazione del tipo Complesso

50 50 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) { 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 - b*d), new Double(b*c + a*d)); }... Rappresentazione del tipo Complesso

51 51 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)

52 52 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...

53 53 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

54 54 Esempio di matrice sparsa  Elemento dominante = 0  Ogni elemento con valore diverso dal dominante viene rappresentato da una terna  Indice di riga  Indice di colonna  Valore dell’elemento

55 55 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

56 56 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

57 57 rappresentazione compatta di una matrice sparsa  Esempio: la rappresentazione compatta della seguente matrice è rigcolval lastValue = 6

58 58 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

59 59 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); //pre: r,c>=0 //post: memorizza l'elemento n in posizione r,c }

60 60 Due diverse implementazioni  Matrice con array: rappresentazione di Java  Matrice Compatta: rappresentazione efficiente di una matrice sparsa

61 61 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

62 62 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); }...

63 63 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){ //pre: r,c>=0 //post:memorizza l'elemento n in posizione r,c this.mat[r][c] = n; }...

64 64 con Array public String toString(){ int i,j; String res = ""; for (i=0; i

65 65 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; }

66 66 Compatta: la classe terna public int getColonna(){ return colonna; } public int getValore(){ return valore; } public String toString(){ return (riga +" " + colonna +" " + valore); } }//end class Terna

67 67 Matrice Compatta... 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; }

68 68 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); }

69 69 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; }

70 70 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++;

71 71 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 */ }

72 72 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); }

73 73 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; }

74 74 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); System.out.println(emme.toString()); }

75 75 Matrice Compatta: esempi d’uso...  Esempio di esecuzione con MatriceConArray Press any key to continue...

76 76 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()); }}

77 77 Matrice Compatta: esempi d’uso...  Esempio di esecuzione con MatriceCompatta inserisco in riga 1, colonna 2 il valore inserisco in riga 3, colonna 4 il valore inserisco in riga 2, colonna 2 il valore

78 78 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


Scaricare ppt "1 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 26 Esercizi F. Gasparetti,"

Presentazioni simili


Annunci Google