• Non ci sono risultati.

Realizzazione software

N/A
N/A
Protected

Academic year: 2021

Condividi "Realizzazione software"

Copied!
41
0
0

Testo completo

(1)

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)

(2)

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, ...

(3)

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,...

(4)

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

(5)

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)

(6)

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

(7)

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:  

(8)

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

(9)

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)

(10)

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

(11)

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

(12)

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

(13)

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 ( )

(14)

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

(15)

Rappr. delle liste semplici

• Pochi linguaggi dispongono del tipo concreto lista

• Vi sono due tipi di rappresentazione:

– rappr. sequenziale – rappr. collegata

(16)

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

(17)

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

(18)

Rappresentazione sequenziale

• Implementazione dei metodi

• Svantaggi:

– occupazione fissa di memoria – limiti nell'estensione della lista – inefficienza di alcuni metodi

(19)

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

(20)

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

(21)

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)

(22)

Implementazione della rappresentazione collegata

• Vi sono due modi per implementare la rappresentazione collegata:

– utilizzando gli array – utilizzando i puntatori

(23)

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)

(24)

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

(25)

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)

(26)

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

(27)

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

(28)

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

(29)

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

(30)

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)

(31)

Rappresentazione collegata

• Per migliorare l'efficienza di alcune operazioni sono state concepite due varianti:

– Rappresentazione collegata circolare – Rappresentazione collegata simmetrica

(32)

Rappresentazione collegata circolare

• L'ultimo elemento non contiene un riferimento nullo, ma il riferimento al primo elemento della lista

• Vantaggi:

– utilizzo come buffer circolare

(33)

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

(34)

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

(35)

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

(36)

Rappresentazione del singolo nodo

• Le due varianti si riferiscono a:

strutture (struct) unioni (union)

typedef struct { typedef union { int giorno; int numero;

int mese; char nome[10];

int anno; } cliente;

} data;

(37)

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)

(38)

Le pile

• La pila è un tipo di dato con struttura LIFO

• Definizione:

– {pila, elemento, boolean}

– {top, push, pop, test_pila_vuota}

• top: pila  elemento (cons)

• push: pila x elemento  pila (cdr)

• pop: pila  pila (car)

• test_pila_vuota: pila  boolean (null)

(39)

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

(40)

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 (cons)

• in_coda: coda x elemento  coda (cdr)

• out_coda: coda  coda (car)

• test_coda_vuota: coda  boolean (null)

(41)

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

Riferimenti

Documenti correlati

– finitezza: composto da un numero finito di passi elementari; le operazioni sono eseguite un numero finito di volte – non ambiguità: i risultati non variano inO. funzione

– finitezza: composto da un numero finito di passi elementari; le operazioni sono eseguite un numero finito di volte2. – non ambiguità: i risultati non

L’ultima parte del mio lavoro, verterà su un analisi di regressione su dati di tutti i paesi OCSE: l’obiettivo fondamentale sarà quello di verificare come variabili inerenti

Si può quindi concludere che gli effetti sugli agenti attivi dovuti a un diverso termine massimo di incarcerazione e ad un aumento delle forze dell’ordine in presenza di

TODESCO FABIO, Messina: pratiche di riparazione e consolidamento delle sopravvivenze architettoniche dopo il terremoto del 1908, in 28 dicembre 1908: la

Il turismo nel territorio è sempre più visto come presupposto ma anche quale conseguenza della riqualificazione di aree urbane e rurali e delle risorse in esse

Al fine di identificare alterazioni nel numero di copie geniche coinvolte nella tumorigenesi dei PTC con diversa aggressività e predittive di un

pluriobiettivo (per problemi a variabili continue, discrete o miste, e rispetto a limiti/condizioni che possono evolvere nel corso del processo); la formulazione di scelte personali