Realizzazione software • Due fasi: 1. Specifica dell'algoritmo 1.a Definizione dei dati 1.b Definizione della modalità della loro elaborazione 2. Realizzazione algoritmo con un particolare linguaggio (traduzione) Fondamenti di Informatica 1 Tipi di dati • Tipo di dato astratto: oggetto matematico definito da tre componenti: – insieme di valori che definisce il dominio – insieme di operazioni sul dominio – insieme di costanti • Esempio: tipo booleano: • {true, false} • and, or, not, ... • true, false Fondamenti di Informatica 2 Tipi di dati • Tipo di dato concreto: si riferisce all'uso del dato in un particolare linguaggio • Per definire un tipo di dato concreto occorre: – definire le proprietà astratte – definire i vincoli imposti dal linguaggio scelto • ad esempio: come dichiararlo, utilizzarlo, accedere alle sue parti,... Fondamenti di Informatica 3 Rappresentazione di un nuovo tipo di dato • Per rappresentare un nuovo tipo di dato, può essere necessario utilizzare tipi di dati già esistenti • Esempio: tipo di dato: "insieme [1..5]" • Realizzato con un vettore di 5 elementi • I metodi sono composizioni dei metodi utilizzati dai dati componenti Fondamenti di Informatica 4 Rappresentazione di un nuovo tipo di dato • Esempio: – inserimento di un elemento nell'insieme – rimozione di un elemento dall'insieme – svuotamento dell'insieme – controllo della presenza di un elemento – controllo dello stato dell'insieme (pieno, vuoto, stati intermedi) Fondamenti di Informatica 5 Rappresentazione dei dati • La rappresentazione di un nuovo dato non è univoca • I criteri di scelta sono: – la correttezza e – l'efficienza della rappresentazione, misurata da: • occupazione in memoria • costo di esecuzione delle operazioni Fondamenti di Informatica 6 Diverse rappresentazioni • Esempio: insieme di interi [1..5] – con un vettore di 5 elementi booleani – con un unico intero di 5 bit • Differenza di efficienza: – Inserimento di un el.: – Controllo dello stato di un el.: – Azzeramento: – Unione: Fondamenti di Informatica 7 Vettori e matrici • Si mettono in corrispondenza un insieme di indici e gli elementi del vettore – Gli indici sono definiti interi – I metodi sono generalmente: memorizza e accedi • Una matrice è definita come un vettore a due dimensioni Fondamenti di Informatica 8 Rappresentazione di vettori • In locazioni di memoria contigue • Si definisce l'indirizzo della prima locazione e la dimensione di ogni elemento • Accesso all'elemento i-esimo: ind(el i) = ind(el 0) + i*size(el) Fondamenti di Informatica 9 Vettori a più dimensioni • Esempio a due dimensioni: – Row major order • Accesso all'elemento (i,j)-esimo: ind( el i,j ) = ind(el 0,0) + (j+i*N)*size(el) • Facile estensione a più di due dimensioni Fondamenti di Informatica 10 Rappresentazione compatta di vettori • Matrici sparse con valore predominante – per velocizzare l'elaborazione – per risparmiare memoria • Esempio con vettore a tre componenti – memorizzazione dimensione matrice e valore predominante Fondamenti di Informatica 11 Rappresentazione compatta di vettori • Metodi di accesso agli elementi: – accedi (complesso) – memorizza (molto complesso, richiede shift) • Funzioni composte: – controllo dello stato – controllo del numero degli elementi • Risparmio di memoria Fondamenti di Informatica 12 Le liste semplici • I valori di una lista sono sequenze di valori elementari, detti atomi • Esempio di lista di interi mediante rappresentazione parentetica: ( 8 25 6 87 54 ) • Caratteristiche: – lunghezza non definita a priori – presenza della lista nulla ( ) Fondamenti di Informatica 13 Metodi sulle liste • Lunghezza (numero di elementi) • cons(el, lista) per inserire un elemento in testa alla lista • car(lista) determina il primo elemento • cdr(lista) fornisce una copia della lista senza il primo elemento • null(lista) verifica se la lista è vuota Fondamenti di Informatica 14 Rappr. delle liste semplici • Pochi linguaggi dispongono del tipo concreto lista • Vi sono due tipi di rappresentazione: – rappr. sequenziale – rappr. collegata Fondamenti di Informatica 15 Rappresentazione sequenziale • E' rappresentata da: – un vettore monodimensionale i cui elementi contengono un atomo – un intero (primo) che denota l'indice del vettore che identifica il primo elemento – un intero (lunghezza) che denota il numero di elementi nella lista Fondamenti di Informatica 16 Rappresentazione sequenziale (5 1 21 45 78) 5 1 21 45 78 12 1 7 1 2 3 4 5 6 7 8 primo = 1 lunghezza = 5 Fondamenti di Informatica 17 Rappresentazione sequenziale • Implementazione dei metodi • Svantaggi: – occupazione fissa di memoria – limiti nell'estensione della lista – inefficienza di alcuni metodi Fondamenti di Informatica 18 Rappresentazione collegata • Ad ogni elemento è associato un riferimento che serve a determinare il successore • La sequenza non è più rappresentata dall'adiacenza fisica in memoria, ma da una informazione logica 0 Fondamenti di Informatica 19 Rappresentazione collegata • Implementazione dei metodi: – eliminazione primo elemento – aggiunta di un elemento in testa – eliminazione di un elemento generico – aggiunta di un elemento in una posizione generica Fondamenti di Informatica 20 Rappresentazione collegata • Vantaggio: – non più necessario spostare elementi (solo modifiche ai riferimenti) • Svantaggio: – per accedere ad un elemento è necessario scandire tutta la lista (cioè non è noto l'indirizzo del generico elemento) Fondamenti di Informatica 21 Implementazione della rappresentazione collegata • Vi sono due modi per implementare la rappresentazione collegata: – utilizzando gli array – utilizzando i puntatori Fondamenti di Informatica 22 Rappresentazione collegata mediante array • Si associa ad ogni elemento della lista una componente dell'array costituita da: – il valore dell'elemento della lista – il riferimento all'elemento successivo (indice dell'array) Fondamenti di Informatica 23 Rappresentazione collegata mediante array (5 1 21 45 78) 21 5 ? 45 ? 1 78 ? 4 6 ? 7 ? 1 0 ? 1 2 3 4 5 6 7 8 inizio = 2 Fondamenti di Informatica 24 Rappresentazione collegata mediante array • Metodi: – l'azzeramento e l'eliminazione di elementi sono operazioni semplici – l'inserimento di elementi necessita della determinazione di una posizione vuota che si può realizzare in due modi: • scansione dell'intera lista • utilizzo della lista libera (esempi) Fondamenti di Informatica 25 Rappresentazione collegata mediante array • Vantaggi: – non vengono spostati elementi – linguaggi in cui l'unico dato struttturato è l'array • Svantaggi: – gestione della lista libera – rimane il problema della dimensione massima fissata dalla dimensione dell'array – richiede più memoria a causa dei riferimenti Fondamenti di Informatica 26 Rappresentazione collegata mediante puntatore • Il tipo puntatore è un tipo di dato i cui valori rappresentano indirizzi in memoria • Le operazioni usualmente disponibili sono: – accesso alla locazione puntata – richiesta di una nuova locazione libera – rilascio della locazione non più utilizzata Fondamenti di Informatica 27 Rappresentazione collegata mediante puntatore • Ogni elemento della lista è composto da: – il valore dell'elemento della lista – un puntatore che identifica la locazione di memoria in cui è memorizzato l'elemento successivo • L'elemento iniziale è un puntatore Fondamenti di Informatica 28 Rappresentazione collegata mediante puntatore • Vantaggi: – stessi vantaggi della rappresentazione collegata mediante array e in più non c'è limite alla lunghezza massima • Svantaggi: – la ricerca richiede la scansione completa Fondamenti di Informatica 29 L'utilizzo dei puntatori è critico • L'utilizzo dei puntatori permette di referenziare zone di memoria; è critico perché: – permette di modificare aree di memoria che possono contenere informazioni vitali – se mal utilizzato, può portare all'esaurimento della memoria disponibile (garbage collection) Fondamenti di Informatica 30 Rappresentazione collegata • Per migliorare l'efficienza di alcune operazioni sono state concepite due varianti: – Rappresentazione collegata circolare – Rappresentazione collegata simmetrica Fondamenti di Informatica 31 Rappresentazione collegata circolare • L'ultimo elemento non contiene un riferimento nullo, ma il riferimento al primo elemento della lista • Vantaggi: – utilizzo come buffer circolare Fondamenti di Informatica 32 Rappresentazione collegata simmetrica • Ogni elemento contiene anche il riferimento all'elemento precedente • Vantaggi: – la lista si può scandire in entrambe le direzioni – si semplifica l'inserimento in posizione precedente ad un dato elemento Fondamenti di Informatica 33 Liste composite • Estensione del concetto di lista • Gli elementi della lista possono a loro volta essere delle liste • Rappresentazione parentetica: ( 5 () 6 ( 7 8 ) ( 9 (12) 3 ) 14 ) • Nell'esempio, l'atomo può essere una lista o un numero Fondamenti di Informatica 34 Rappresentazione del singolo nodo • Esistono due varianti: – l'atomo contiene sia un puntatore ad una lista che lo spazio per memorizzare un numero; un ulteriore booleano li seleziona – l'atomo contiene lo spazio per memorizzare solo il più esteso tra il puntatore alla lista e il numero; un ulteriore booleano li seleziona Fondamenti di Informatica 35 Rappresentazione del singolo nodo • Le due varianti si riferiscono a: strutture (struct) unioni (union) typedef struct { int giorno; int mese; int anno; } data; typedef union { int numero; char nome[10]; } cliente; Fondamenti di Informatica 36 Recupero della memoria • Garbage collection (recupero memoria non più utilizzata) • Può avvenire: – manualmente a carico del programmatore – automaticamente a carico del traduttore del linguaggio (serve marcare le aree allocate e gestire la lista libera) Fondamenti di Informatica 37 Le pile • La pila è un tipo di dato con struttura LIFO • Definizione: – {pila, elemento, boolean} – {top, push, pop, test_pila_vuota} • top: pila elemento • push: pila x elemento pila • pop: pila pila • test_pila_vuota: pila boolean (cons) (cdr) (car) (null) – {pila_vuota} Fondamenti di Informatica 38 Le pile • A differenza delle liste gli inserimenti e le cancellazioni posso essere effettuati solo sulla cima della pila (non avvengono spostamenti degli elementi) • Tipo di dato fondamentale Fondamenti di Informatica 39 Le code • La coda è un tipo di dato con struttura FIFO • Definizione: – {coda, elemento, boolean} – {primo, in_coda, out_coda, test_coda_vuota} • primo: coda elemento • in_coda: coda x elemento coda • out_coda: coda coda • test_coda_vuota: coda boolean (cons) (cdr) (car) (null) – {coda_vuota} Fondamenti di Informatica 40 Requisiti delle pile e delle code • Requisiti delle pile: – un puntatore che determini la cima – le operazioni di accesso sono semplici • Requisiti delle code: – due puntatori che puntino alla cima e alla coda – le operazioni di accesso sono poco più complesse Fondamenti di Informatica 41