Si dia la specifica del tipo di dato astratto Tabella.Una Tabella ha due colonne e un numero variabile di righe. Gli elementi della prima colonna sono nomi (stringhe) senza ripetizioni,gli elementi della seconda colonna sono numeri interi senza ripetizioni. E` non modificabile.
La specifica E’ l’interfaccia del tipo di dato astratto (per l’utente) Serve per astrarre dall’implementazione Non deve contenere riferimenti all’implementazione (che tra l’altro non c’è ancora) al fine di mascherarla
public class Tabella{ \\OVERVIEW\\OVERVIEW: una Tabella ha due colonne \\ed un numero variabile di righe; la \\prima colonna memorizza stringhe \\ e la seconda interi senza ripetizioni. \\ E’ non modificabile. public Tabella(){ \\EFFECTS\\EFFECTS: costruisce una nuova Tabella vuota} public int size(){ \\EFFECTS\\EFFECTS: restituisce il numero di righe di this }
public String get-first(int i) throws InvalidException { \\EFFECTS: restituisce la stringa della i-esima riga se \\EFFECTS \\ esiste, altrimenti solleva l’eccezione InvalidException} public int get-second(int i) throws InvalidException { \\EFFECTS: restituisce l’intero della i-esima riga se \\EFFECTS \\ esiste, altrimenti solleva l’eccezione InvalidException}
public Tabella add(String s,int i) throws InvalidException { \\EFFECTS: se s o i compaiono gia’ in this (nella prima o seconda \\EFFECTS \\colonna rispettivamente) solleva InvalidException, \\altrimenti restituisce una Tabella ottenuta aggiungendo \\la nuova riga (s,i) a this} } METODO PRODUTTORE: this e’ non modificabile
La rappresentazione private Pair[] coppie; Usiamo un array di coppie Per rappresentare le coppie tipo ausiliario Pair
Invariante I(c) = c.coppie != null & & per ogni 0 < = i< j < c.coppie.length (c.coppie[i] != null & & ! c.coppie[i].left. equals(c.coppie[j].left) & & c.coppie[i].rigth != c.coppie[j].right)
Funzione di astrazione alpha(c) = tabella che ha due colonne e c.coppie.length righe e tale che la riga i-esima e’ (c.coppie[i].left, c.coppie[i].right)
public class Tabella{ \\OVERVIEW\\OVERVIEW: una Tabella ha due colonne \\ed un numero variabile di righe; la \\prima colonna memorizza stringhe \\e la seconda interi senza ripetizioni. \\E` non modificabile. private Pair[] coppie; public Tabella(){ \\EFFECTS\\EFFECTS: costruisce una nuova Tabella vuota coppie=new Pair[0]; }
public int size(){ \\EFFECTS\\EFFECTS: restituisce il numero di righe di this return coppie.length ; } public String get-first(int i) throws InvalidException { \\EFFECTS: restituisce la stringa della i-esima riga se \\EFFECTS \\ esiste, altrimenti solleva l’eccezione InvalidException if (! 0<=i<coppie.length) throw new InvalidException(Tabella.gf); return coppie[i ].left; }
public int get-second(int i) throws InvalidException { \\EFFECTS: restituisce l’intero della i-esima riga se \\EFFECTS \\ esiste, altrimenti solleva l’eccezione InvalidException if (! 0<=i<coppie.length) throw new InvalidException(Tabella.gs); return coppie[i ].right; } }
public Tabella add(String s,int i) throws InvalidException { \\EFFECTS: se s o i compaiono gia’ in this (nella prima o seconda \\EFFECTS \\colonna rispettivamente) solleva InvalidException, \\altrimenti restituisce una Tabella ottenuta aggiungendo \\la nuova riga (s,i) a this} for (int j=0; j< coppie.length;j++) { if (coppie[j].left.equals(s) | | coppie[j].right==i) throw new InvalidException(Tabella.add);} Tabella nuovo=new Tabella(coppie.length+1); for (int j=0; j< coppie.length;j++) {nuovo.coppie[j]=coppie[j];} nuovo.coppie[coppie.length]=new Pair(s,i); return nuovo;} private Tabella (int n){ \\EFFECTS\\EFFECTS: costruisce una nuova Tabella vuota, la cui rappresentazione \\ è un array di dimensione n coppie= new Pair[n];} }