Specifica: la sintassi. Specifica: la semantica. Specifica: la semantica

Documenti analoghi
Esempio su strutture dati dinamiche: ArrayList

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Implementazione Java di un ADT

Esempio su strutture dati dinamiche: ArrayList

Le liste. ADT e strutture dati per la rappresentazione di sequenze. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 5

Astrazione Dati. Nicola Fanizzi. Linguaggi di Programmazione [010194] 10 mag, Dipartimento di Informatica Università degli Studi di Bari

Programmazione orientata agli oggetti. Ivan Lanese

Algoritmi e Strutture Dati

Esempio su strutture dati dinamiche: ArrayList

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

La programmazione ad oggetti: chiamate di metodi. Overloading. This

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

PILE E CODE. Pile (stack):

Programmazione ad oggetti

ESERCIZI JAVA. Esercizi sulle Interfacce. Esercizio 1:

Programmazione Orientata agli Oggetti in Linguaggio Java

Fondamenti di Informatica T1 Mappe

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Funzioni, Stack e Visibilità delle Variabili in C

CORSO DI PROGRAMMAZIONE

Laboratorio di Python

Programmazione con Java

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Basi di Dati. Concetti e Principi Generali. Maria Mirto

14 - Metodi e Costruttori

Classi. Oggetti e classi. Creazione e inizializzazione di oggetti in C++ Distruzione di oggetti in C++

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Struttura dati astratta Coda

Polimorfismo parametrico vs polimorfismo per inclusione

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

Introduzione all OOP!

Programmazione in Java (I modulo)

La struttura dati CODA

Fondamenti di Informatica T-1

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Programmazione a oggetti

La classe java.lang.object

Lezione 6 Introduzione al C++ Mauro Piccolo

Costanti e Variabili

ISTITUTO STATALE D ISTRUZIONE SUPERIORE FERRARIS - BRUNELLESCHI EMPOLI Anno scolastico 2015/2016

Polimorfismo per Genericità in Java

ADT: Abstract Data Type. Quasi ADT. ADT per collezioni di dati (code generalizzate) 04 I tipi di dati astratti (I parte)

Transcript:

Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi 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 1

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 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(): IsEmtpty(s): Push(e, s): Top(s): Pop(s): Post: produce una pila vuota Post: true se s =, false altrimenti Post: ritorna la pila ottenuta aggiungendo e ad s come el. emergente Pre: s ; Post: ritorna l emergente Pre: s ; Post: ritorna s meno l emergente 2

# s: Stack è this: dunque non viene mai menzionato Interfacce in Java manca NewStack: sarà il costruttore 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 Il significato dell astrazione La pila s è vuota: IsEmpty(s) =? IsEmpty(s) = false Posso conoscere allora il valore dell emergente: Top(s) =? Top(s) = e Utente Il significato dell astrazione Posso inserire un valore in fondo alla pila s? Non senza aver prima rimosso tutti gli altri con Pop Vorrei sapere come sono organizzati gli el. Utente Questi sono affari!"$# %& 3

Il significato dell astrazione L utente interagisce con i valori di tipo Stack solo attraverso gli operatori: non può né deve conoscere i dettagli della loro realizzazione Utente Il significato dell astrazione ADT = Abstract Data Type barriera Programma applicativo operatore Implementazione dell ADT Programma applicativo Accesso diretto ai dati Che cos è una struttura dati? Struttura dati = modo sistematico di rappresentare ed organizzare dati a f k z q d i w vettore 2 5 9 1 lista 0010011010010111 numero intero rappr. in binario 4

Primitive di accesso Una struttura dati deve essere dotata di primitive che consentano di costruire, distruggere, esplorare e modificare gli aggregati di dati: base = indirizzo del primo elemento V[' ] = valore all indirizzo base + ' dim(valore) V a f k z q d i w Primitive di accesso Una struttura dati deve essere dotata di primitive che consentano di costruire, distruggere, esplorare e modificare gli aggregati di dati: Cons(2, L) 2 p p.next 5 9 1 p.info L = Puntatore al primo el. 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 5

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

Cassi in Java (( costruttori StackAsArray *)+ ), ( Stack { +. StackAsArray ( size) { arrayofvalues = / Object[size]; nextfree = 0; +. StackAsArray () { 0,( (100); overloading Cassi in Java (( StackAsArray *)+ ), ( Stack { +. 1 IsEmpty() {. nextfree == 0; +. Object Top() { return arrayofvalues[nextfree]; +. Pop() { nextfree--; Cassi in Java 2$3 4 5 5 StackAsArray 6*7 8 3$9 7 9 :; 5 Stack { 8<$= 3 6 2?> @ 6$A Push(Object newitem) { 6 B (nextfree == arrayofvalues.length) EnlargeOf (100); arrayofvalues[nextfree++] = newitem; 8C 6 > 4;*9D>@ 6 A EnlargeOf (6 : ; size) { // alloca altri size elementi in arrayofvalues[] Ha senso perché è un vettore Object temp[] = : 9E Object[arrayofvalues.length + size]; B @ C (6 : ; i = 0; i < arrayofvalues.length; i++) temp[i] = arrayofvalues[i]; arrayofvalues = temp; 7

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 8