• Non ci sono risultati.

Tipi di dato e strutture dati

N/A
N/A
Protected

Academic year: 2022

Condividi "Tipi di dato e strutture dati"

Copied!
8
0
0

Testo completo

(1)

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Tipi di dato e strutture dati

Specifica e realizzazione di strutture informative come classi

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Che cos’è un tipo di dato?

• Tutti i linguaggi di programmazione tipati forniscono tipi ed operatori predefiniti

• Linguaggi di programmazione come Pascal, C o Java consentono all’utente di definirne di nuovi

Cos’è un tipo?

Insieme di valori + operatori

+

0, 1, 2, …, , …

Interi



,  

Booleani

 

I tipi di dato sono modelli matematici

(2)

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Specifica: la sintassi

Consiste nel definire nuovi identificatori:

• nome del tipo definito:

Es. Stack

• nomi e tipi degli operatori

Es.

NewStack: void → Stack Push: TipoEl, Stack → Stack Top: Stack → TipoEl Pop: Stack → Stack IsEmpty: Stack → Boolean

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Specifica: la semantica

Consiste nel definire il significato/

comportamento degli operatori

Equazionalmente:

IsEmpty(NewStack()) = true IsEmpty(Push(e, s)) = false Top(Push(e, s)) = e Pop(Push(e, s)) = s

Specifica: la semantica

Consiste nel definire il significato/

comportamento degli operatori

Con pre e post-condizioni

NewStack(): Post: produce una pila vuota IsEmtpty(s): Post: true se s = ∅, false altrimenti Push(e, s): Post: ritorna la pila ottenuta aggiungendo

e ad s come el. emergente Top(s): Pre: s ≠ ∅; Post: ritorna l’emergente Pop(s): Pre: s ≠ ∅; Post: ritorna s meno

l’emergente

(3)

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Interfacce in Java

Stack {



IsEmpty();

// Post: true se la pila è vuota, false altr.



 

Push(Object newitem);

// Post: aggiunge newitem come emergente Object Top();

// Pre: la pila non è vuota

// Post: ritorna l’emergente senza rimuoverlo



 

Pop();

// Pre: la pila non è vuota

// Post: rimuove l’emergente dalla pila }

manca NewStack: sarà il costruttore

s: Stack è this:

dunque non viene mai menzio-

nato

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Il significato dell’ astrazione

Posso conoscere allora il valore dell’ emergente:

Top(s) = ?

Top(s) = e La pila s è vuota:

IsEmpty(s) = ? IsEmpty(s)

= false

Utente

Il significato dell’ astrazione

Vorrei sapere come sono organizzati gli el.

Questi sono affari !"$#%&# Posso inserire un valore in

fondo alla pila s?

Non senza aver prima rimosso tutti gli altri con

Pop

Utente

(4)

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Il significato dell’ astrazione

Utente

L’ utente interagisce con i valori di tipo Stack

solo attraverso gli operatori: non può né deve conoscere i dettagli

della loro realizzazione

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Il significato dell’ astrazione

Implementazione dell’ ADT

barriera

operatore Programma

applicativo

Programma

applicativo Accesso diretto

ai dati ADT = Abstract Data Type

Che cos’ è una struttura dati?

modo sistematico di rappresentare ed organizzare dati

Struttura dati =

a f k z q d i w

vettore

2 5 9 1 ∅

lista 0010011010010111 numero intero rappr. in binario

(5)

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Primitive di accesso

Una struttura dati deve essere dotata di primitive che consentano di costruire, distruggere, esplorare e modificare gli aggregati di dati:

a f k z q d i w

base = indirizzo del primo elemento

V['] = valore all’ indirizzo base + '⋅ dim(valore)

V

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Primitive di accesso

Una struttura dati deve essere dotata di primitive che consentano di costruire, distruggere, esplorare e modificare gli aggregati di dati:

5 9 1 ∅

L = Puntatore al primo el.

p

p.next

p.info 2

Cons(2, L)

Primitive di accesso

Una struttura dati deve essere dotata di primitive che consentano di costruire, distruggere, esplorare e modificare gli aggregati di dati:

0010011010010111 not

1101100101101000

(6)

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Invarianti di struttura

Una proprietà di una struttura dati che deve essere mantenuta dopo qualunque accesso alla struttura è un invariante di struttura

2 5 9 1 ∅

lista

I puntatori di una lista devono concatenare tra loro tutti i singoli elementi

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Realizzazione mediante classi

• La struttura dati è il valore di alcuni campi privati

• Gli operatori dell’ ADT sono realizzati con altrettanti metodi pubblici (in particolare l’ operatore che genera una nuova istanza della struttura è un costruttore)

• Eventuali routines ausiliarie coinvolte nella realizzazione dei metodi pubblici, sono realizzate con metodi privati

Cassi in Java

((

StackAsArray *)+ ),(

Stack {

+,



-

nextfree;

+,





Object arrayofvalues[];

...

}

Struttura dati

(7)

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Cassi in Java

((

StackAsArray *)+ ),(

Stack { ...

+.

StackAsArray ( size) { arrayofvalues = / Object[size];

nextfree = 0;

}

+.

StackAsArray () {

 0,(

(100);

} ...

} overloading

costrut- tori

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Cassi in Java

((

StackAsArray *)+ ),(

Stack { ...

IsEmpty() {

 .

nextfree == 0;

}

+.

Object Top() {

return arrayofvalues[nextfree];

}

+.



 

Pop() { nextfree--;

} ...

}

Cassi in Java

2$3 4 5 5

StackAsArray 6*7 83$979 :; 5 Stack { ...

8<$=

36 2?>@

6$A Push(Object newitem) {

6 B (nextfree == arrayofvalues.length) EnlargeOf (100);

arrayofvalues[nextfree++] = newitem;

}

8C 6

>4;*9D>@

6A EnlargeOf (6:; size) {

// alloca altri size elementi in arrayofvalues[]

Object temp[] =

: 9E

Object[arrayofvalues.length + size];

B@C (6:; i = 0; i < arrayofvalues.length; i++) temp[i] = arrayofvalues[i];

arrayofvalues = temp;

} Ha senso perché è un

vettore

(8)

Ugo de’ Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 4

Invariante di classe

• Quando un’ ADT viene realizzato con una classe, che a sua volta implementa una o più strutture dati, l’ invariante di struttura deve essere parte della post-condizione di tutti i metodi pubblici: prende allora il nome di invariante di classe.

• L’ invariante di classe, essendo relativo

all’ implementazione, non è pubblico: deve

implicare le post-condizioni dei metodi

pubblici come dichiarate in interfaccia

Riferimenti

Documenti correlati

• quando coloriamo un nodo u di G di nero (cioè ogni volta che finiamo di visitare un nodo di G), inseriamo u in testa alla lista. • dopo che abbiamo visitato tutti i nodi di G,

Successor(S,x.k): restituisce l’elemento che segue x (se ordinati) nella struttura (o la cui chiave segue quella di x.k) Predecessor(S,x.k): come sopra, ma considerando il

Nel caso sia eliminato un nodo rosso, non ` e necessario alcun cambiamento (non sono possibili violazioni delle propriet` a) Se il nodo eliminato ` e nero, RiparaRBCancella(x), dato

Ordine di visita: vengono visitati tutti i nodi con un cammino tra loro e s lungo n passi, prima di visitare quelli con un cammino lungo n + 1. La visita di un grafo ` e pi`

... apparentemente sembra che io abbia dato una valida risposta. peccato che queste 5 variabili, seppur dello stesso tipo, siano INDIPENDENTI TRA LORO e NON FACCIANO PARTE DI UNA

Come evidenziato dalla definizione induttiva di sequenza, per costruire una qualsiasi lista, ` e sufficiente la costante lista vuota h i (rappresentata in C semplicemente dal

Per gestire gli activation records della funzione, definiamo un apposito tipo, attraverso una struct adeguata a memorizzare tutte le informazioni necessarie: parametri, variabili

puntatore a una funzione che accetta un intero e non restituisce