Esercitazione su - PowerPoint PPT Presentation

1 / 30
About This Presentation
Title:

Esercitazione su

Description:

Title: Prima Esercitazione Author: Francesca Levi Last modified by: Francesca Levi Created Date: 2/11/2005 11:19:58 AM Document presentation format – PowerPoint PPT presentation

Number of Views:53
Avg rating:3.0/5.0
Slides: 31
Provided by: Frances173
Category:

less

Transcript and Presenter's Notes

Title: Esercitazione su


1
Esercitazione su
  • Vector

2
Vector
  • Permette di definire collezioni di dati
    generiche, che sono
  • in grado di memorizzare elementi di ogni
    sottotipo di Object
  • Definito nella classe java.util.Vector
  • memorizzano sequenze di oggetti di lunghezza
    variabile
  • possono memorizzare oggetti di tipo diverso,
    purche sottotipi
  • di Object, (es. String, Integer etc.), anche tra
    loro non omogenei

3
Specifica (alcuni metodi)
  • public Vector ()
  • \\EFFECTS crea un vettore vuoto
  • Notate che a differenza che per gli arrays non e
    necessario fissare al momento della creazione la
    dimensione
  • Ci sono anche altri costruttori tipo quelli degli
    arrays che permettono di creare un vettore vuoto
    ma con una certa capacita (dato numero di
    posizioni allocate ma vuote). Serve solo per
    avere implementazioni piu o meno efficienti (per
    ora lo ignoriamo)

4
Metodi simili a quelli dellarray
  • public int size ()
  • \\EFFECTS restituisce il numero di elementi
    presenti nel vettore
  • public Object elementAt (int index)
  • \\EFFECTS restituisce l'elemento di indice index
  • public void setElementAt (Object obj, int  index)
  • \\EFFECTS sostituisce obj all'oggetto della posiz
    ione index
  • Se index e fuori dal size del vettore viene
    sollevata una eccezione come per gli arrays

5
Metodi per aggiungere
  •  public void insertElementAt (Object obj, int inde
    x)
  • \\MODIFIESthis
  • \\EFFECTS inserisce obj nella posizione index e 
    sposta tutti gli
  •  elementi, da index in poi, di una posizione
  • public void addElement (Object obj)
  • \\MODIFIESthis
  • \\EFFECTS aggiunge una posizione alla fine che
    contiene obj 
  • La dimensione del Vector cambia, viene aggiunta
    una posizione
  • alla fine o in un dato punto

6
Metodi per rimuovere
  •  
  • public void removeElementAt (int index)
  • \\MODIFIESthis
  • \\EFFECTS rimuove l'oggetto presente nella posizi
    one index e sposta
  • all'indietro di una posizione tutti gli elementi s
    uccessivi
  • a quello rimosso
  • public boolean removeElement (Object obj)
  • \\MODIFIESthis
  • \\EFFECTS rimuove la prima occorrenza
    dell'oggetto obj se presente restituendo true,oppu
    re 
  • restituisce false
  • La dimensione del Vector cambia, viene
    ricompattato (non rimane una posizione vuota)

7
Esercizio Proposto
  • Definire una classe VectorOp che definisce alcune
    procedure stand-alone (metodi statici) che
    operano su Vector contenenti Integer
  • Il fatto che un Vector contenga Integer non e
    intrinseco nel tipo di dato (va messa una
    precondizione)

8
public class VectorOp \\OVERVIEW fornisce
procedure stand-alone per manipolare Vectors
di Integer public static int min(Vector
v) \\REQUIRES v non e null e contiene
Integer \\EFFECTS restituisce il minimo di v, 0
se e vuoto if (v.size()0)
return 0 int min((Integer)
v.elementAt(0)).intValue() for
(int i1 i lt v.size() i) int
x ((Integer) v.elementAt(i)).intValue()
if (x lt min) minx
return min
NOTA uso del Cast!
9
public static boolean search(Vector v,int
x) \\REQUIRES v non e null e contiene
Integer \\EFFECTS restituisce true se x
appartiene a v, false altrimenti for (int j0
j lt v.size() j) int y((Integer)
v.elementAt(j)).intValue() if (xy) return
true return false public static Vector
inc(Vector v,int x) \\REQUIRES v non e null e
contiene Integer \\EFFECTS restituisce il Vector
ottenuto incrementando ogni elemento di x
Vector nuovonew Vector() for (int j0 j lt
v.size() j) int y ((Integer)
v.elementAt(j)).intValue() nuovo.addElement(new
Integer(yx) ) return nuovo
10
public static Vector reverse(Vector
v) \\REQUIRES v non e null e contiene
Integer \\EFFECTS restituisce il Vector
ottenuto invertendo gli elementi di v Vector
nuovonew Vector() for (int jv.size()-1 j gt0
j--) nuovo.addElement( v.elementAt(j) ) \\
cast non necessario return nuovo public
static void remove(Vector v,int x) \\REQUIRES v
non e null e contiene Integer \\MODIFIES
v \\EFFECTS elimina tutte le occorrenze di x in
v for (int j0 j lt v.size() j) int y
((Integer) v.elementAt(j)).intValue() if
(yx) v.removeElementAt(j )
11
public static Vector sort(Vector v) \\REQUIRES
v non e null e contiene Integer \\EFFECTS
restituisce il Vector ottenuto mettendo gli
elementi di v in ordine \\ crescente Vector
nuovonew Vector() \\ vettore che viene
mantenuto ordinato if (v.size()0) return
nuovo for (int i0 ilt v.size()i) int
y((Integer) v.elementAt(i)).intValue() \\
elemento di v da inserire boolean
trovatofalse int j0 while (j lt nuovo.size()
!trovato) \\ scorre nuovo cercando il punto
giusto int w((Integer) nuovo.elementAt(j)).intVa
lue() if (w gt y) nuovo.insertElementAt(new
Integer(y),j) trovatotrue else j if (!
trovato) nuovo.addElement(new Integer(y)) ret
urn nuovo
12
Commenti
  • Quando usare Vector o Array?
  • Array piu efficienti
  • Vector utile quando bisogna implementare
  • strutture dati di lunghezza variabile
  • Esempio pila (Stack) di interi
  • Mantiene gli elementi per ordine di inserimento
    (LIFO)

13
Quali operazioni?
  • isEmpty() serve per testare se la pila e vuota
  • top() serve per leggere lelemento al top della
    pila, ovvero lultimo inserito
  • pop() rimuove lultimo elemento inserito (al top
    della pila)
  • push (int x) inserisce x nella pila al top

14
Specifica (INTERFACCIA PUBBLICA)
public class Stack \\ OVERVIEW uno Stack e
una collezione di interi organizzati per ordine
di inserimento con una politica LIFO. E
modificabile public Stack () \\ EFFECTS
costruisce uno Stack Vuoto public boolean
isEmpty() \\ EFFECTS se this e vuoto
restituisce true, altrimenti false public int
top() \\ REQUIRES this non e vuoto \\
EFFECTS restituisce lultimo elemento inserito
NOTA specifica parziale (eccezioni?)
15
Modificatori
public void pop() \\ REQUIRES this non e
vuoto \\ MODIFIES this \\ EFFECTS se this non
e vuoto rimuove lultimo elemento
inserito public void push (int x) \\
MODIFIES this \\ EFFECTS inserisce x nella
pila (al top)
16
Implementazione
  • Rappresentazione usiamo un Vector per
    implementare la pila, lultimo elemento inserito
    e lultimo elemento (top della pila)
  • Chiaramente dovremo usare un Vector di Integer
  • Implementiamo i metodi di conseguenza
  • Nota limplementazione deve essere nascosta
    (usiamo variabili private)

17
Implementazione
public class Stack \\ OVERVIEW uno Stack e
una collezione di interi organizzati per ordine
di inserimento con una politica LIFO. E
modificabile private Vector pila
\\rappresentazione privata public Stack ()
\\ EFFECTS costruisce uno Stack vuoto pilanew
Vector() public boolean isEmpty() \\
EFFECTS se this e vuoto restituisce true,
altrimenti false if (pila.size()0) return
true return false
18
public int top() \\REQUIRES this non e
vuoto \\ EFFECTS restituisce lultimo elemento
inserito Integer xpila.elementAt(pila.size()-1))
return x.intValue() public void pop()
\\REQUIRES this non e vuoto \\ MODIFIES
this \\ EFFECTS rimuove lultimo elemento
inserito pila.removeElementAt(pila.size()-1))
public void push (int x) \\ MODIFIES this \\
EFFECTS inserisce x nella pila pila.addElement(n
ew Integer(x))
19
Interfaccia Pubblica
  • Ricordiamo che tutto il codice che usa Stack
    deve essere scritto usando solo interfaccia
    pubblica (non vede che e implementata con un
    Vector)
  • Esempio procedura stand-alone che rimpiazza gli
    ultimi due elementi inseriti con la loro somma

20
public static void sum (Stack p) \\REQUIRES p
contiene almeno due elementi \\MODIFIES
p \\EFFECTS rimpiazza gli ultimi due elementi
inseriti in p con la loro somma int primo,
secondo primo p.top() p.pop() secondo
p.top() p.pop() p.push(primosecondo) Notat
e che non accede alla variabile pila di tipo
Vector, usa solo linterfaccia pubblica!
21
Commenti
  • Sarebbe piu facile scrivere il codice accedendo
    direttamente alla rappresentazione del tipo di
    dato, e.g.
  • private Vector pila //la
    rappresentazione
  • ESEMPIO
  • Integer primo, secondo
  • primo (Integer) p.pila.elementAt(p.pila.size()-
    1)
  • secondo (Integer) p.pila. elementAt(p.pila.size()
    -2)
  • p.pila.removeElementAt(p.pila.size()-1)
  • p.pila.setElementAt(primo.intValue()secondo.intVa
    lue(),p.pila.size(0-1)

22
Ma.
  • Questo approccio e metodologicamente sbagliato
  • Mantenere limplementazione nascosta
  • permette di
  • -garantire proprieta del tipo di dato
  • -rendere il codice che lo usa indipendente dalla
    sua implementazione

23
Esempio
  • Se il tipo di dato dovesse essere riprogettato
  • (lo implemento p.e. con una lista concatenata
    invece che con un Vector)
  • Tutto il codice scritto usando linterfaccia
    pubblica continuerebbe a funzionare
  • Al contrario se accedesse alla rappresentazione
    dovrebbe essere riprogettato

24
Esercizio Proposto
  • Definire una classe Abbonato i cui oggetti
    descrivono le informazioni relative ad un
    abbonato al telefono nome (di tipo String ) e
    numero di telefono (int)
  • Con i seguenti costruttori e metodi

25
public class Abbonato public Abbonato(String
s,int n) \\EFFECTS crea un nuovo abbonato
con nome s \\ e numero n public String
nome() \\EFFECTS restituisce il nome di
this public int numero() \\EFFECTS
restituisce il numero di this \\ metodo
overridden public boolean equals(Object
o) \\REQUIRES o e di tipo Abbonato \\EFFECTS
restituisce true se this ed o sono
uguali
26
  • Definire una classe Elenco i cui elementi sono di
    tipo Abbonato
  • Gli Abbonati sono mantenuti allinterno
    dellElenco in modo ordinato
  • rispetto al nome,
  • ESEMPIO (Francesca, 2867) lt (Marco, 133)
  • Inoltre i numeri di telefono nellelenco sono
    tutti diversi
  • Per Elenco vengono forniti metodi per
  • -cercare allinterno dellelenco
    il numero di telefono a partire dal nome
  • - inserire un nuovo Abbonato
  • - rimuovere un Abbonato
  • - cambiare il numero di telefono

27
public class Elenco public Elenco()
\\EFFECTS crea un nuovo elenco vuoto public
int cercanum(String s) \\EFFECTS restituisce
il numero di telefono del primo abbonato
presente in this che ha nome s, altrimenti
restituisce 0 public void inserisci(String s)
\\MODIFIES this \\EFFECTS aggiunge un
nuovo Abbonato allelenco (this) con nome s e
con un nuovo numero di telefono
28
public void rimuovi(String s) \\MODIFIES
this \\EFFECTS rimuove dallelenco (this)
tutti gli abbonati con nome s public int
cambia(String s, int x) \\MODIFIES this
\\EFFECTS se nellelenco compare labbonato
(s,x), rimpiazza il numero x con un nuovo
numero di telefono y e lo restituisce public
String toString() \\EFFECTS restituisce una
stringa che contiene la sequenza di \\abbonati
di this
29
Implementazione suggerimenti
  • Nella classe Elenco usare
  • una variabile statica per memorizzare il
    primo numero di telefono disponibile
    (inizializzata inizialmente ad 1), tipo come
    abbiamo fatto in classe per gestire il numero di
    matricola
  • una variabile distanza di tipo Vector per
    memorizzare gli abbonati
  • (sfruttando il fatto che Abbonato e
    sottotipo di Object)
  • Attenzione lordinamento va mantenuto (il Vector
    e ordinato) e sfruttato (p.e. per la ricerca)

30
Al solito
  • In parallelo il testing delle due classi
  • Usa solo linterfaccia pubblica
Write a Comment
User Comments (0)
About PowerShow.com