Programmazione Procedurale in Linguaggio C++ Sommario

12/01/2004
Programmazione Procedurale in
Linguaggio C++
Strutture di Dati
Parte 6
Dettagli e Approfondimenti
versione 2.0
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons
(vedi ultima pagina)
G. Mecca – Università della Basilicata – [email protected]
Strutture di Dati: Approfondimenti >> Sommario
Sommario
m Ricapitolazione
m Tipi
Speciali di Liste
m La Pila
G. Mecca - Programmazione Procedurale in Linguaggio C++
2
1
12/01/2004
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Passi
per la soluzione di un problema
ðanalisi delle specifiche (dati di ingresso e
uscita, eliminazione delle ambiguità)
ðscelta dell’algoritmo
ðscrittura del codice
ðcompilazione
ðtest
G. Mecca - Programmazione Procedurale in Linguaggio C++
3
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Scelta
dell’algoritmo
ðstrategia di rappresentazione dei dati
ðstrategia di operazioni sui dati
ðla prima influisce sulla seconda
m Strategia
di rappresentazione dei dati
ðscelta della struttura di dati
ðstruttura in memoria delle variabili per
rappresentare i dati del problema
G. Mecca - Programmazione Procedurale in Linguaggio C++
4
2
12/01/2004
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Strutture
di dati notevoli
ðesistono strutture di dati ricorrenti
m Esempi
ðgli insiemi di elementi
ðle liste di elementi
ðle matrici di elementi
m Per
queste strutture di dati
ðesistono rappresentazioni “canoniche”
G. Mecca - Programmazione Procedurale in Linguaggio C++
5
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Rappresentazione
canonica
ðinsieme di tipi per definire le variabili della
struttura di dati
ðinsieme di sottoprogrammi per manipolare la
struttura di dati
ðsperimentate e notoriamente corrette
ðper una stessa struttura di dati possono
esistere rappresentazioni differenti
G. Mecca - Programmazione Procedurale in Linguaggio C++
6
3
12/01/2004
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Esempio:
la lista
ðrappresentazione con array e indicatore di
riempimento
ðla lista è un record con due componenti
ðgli elementi sono contenuti nelle variabili di
un array
ðviene usata una variabile intera per tenere
traccia del livello di riempimento dell’array
7
G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Dati: Approfondimenti >> Ricapitolazione
Rappresentazione con Record e Array
const int MAXDIM=100;
struct lista {
int indicatore;
float valori[MAXDIM];
};
void main() {
lista l;
...
}
#99
xxx
#100
l.indicatore
xxx
#101
l.valori
#102
#102
l.valori[0]
xxx
l.valori[1]
xxx
l.valori[2]
xxx
#105
l.valori[3]
xxx
#106
l.valori[4]
xxx
...
...
...
#201
l.valori[99]
xxx
#103
#104
l
#202
G. Mecca - Programmazione Procedurale in Linguaggio C++
xxx
8
4
12/01/2004
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Indicatore
di riempimento
ðpuò assumere valori compresi tra 0 e
MAXDIM
ðse vale 0, la lista è vuota
ðse vale MAXDIM, la lista è completam. piena
ðin ogni momento, il numero di componenti
utilizzate dell’array corrisponde al valore
dell’indicatore
ðdeve essere manipolato con attenzione
9
G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Operazioni
sulla lista
ðnelle operazioni, è necessario tenere in
conto vari aspetti
m Problema
n.1
ðgestire correttamente il valore dell’indicatore
di riempimento (incrementi e diminuzioni)
m Problema
n.2
ðverificare la correttezza delle operazioni (lista
vuota, lista piena, posizioni corrette ecc.)
G. Mecca - Programmazione Procedurale in Linguaggio C++
10
5
12/01/2004
Strutture di Dati: Approfondimenti >> Ricapitolazione
Operazioni sulla Lista
void
void
void
void
void
leggi (lista &l);
leggiIndicatore (int &indicatore);
stampa (lista l);
salvaSuDisco (lista l, string nomeFile);
carica (lista &l, string nomeFile);
void aggiungiInCoda (lista &l, float elem, bool& esito);
void aggiungiInPosizione (lista &l, float elem, int pos,
bool& esito);
void eliminaInCoda (lista &l, bool& esito);
void eliminaInPosizione (lista &l, int pos, bool& esito);
int cercaPosizione (lista l, float elem);
bool posizioneEsistente (lista l, int pos);
G. Mecca - Programmazione Procedurale in Linguaggio C++
11
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Inserimenti
in posizione i
ðse i è “in mezzo” alla lista, tutte le
componenti successive alla posizione in cui
inserire devono essere spostate in basso
m Cancellazione
in posizione i
ðse i è in mezzo alla lista, tutti le componenti
successive alla posizione in cui cancellare
devono essere spostate in alto
G. Mecca - Programmazione Procedurale in Linguaggio C++
12
6
12/01/2004
Strutture di Dati: Approfondimenti >> Ricapitolazione
Ricapitolazione
m Lista
di record
ðsi applica lo stesso principio
m Esempio
struct studente {
int matricola;
string cognome, nome;
int annoCorso;
};
const int N=100;
struct listaStudenti {
int indicatore;
studente dati[N];
};
G. Mecca - Programmazione Procedurale in Linguaggio C++
13
Tipi Strutturati: Dettagli e Approfondimenti >> Ricapitolazione
Domande ed Esercizi
di Riepilogo
G. Mecca - Programmazione Procedurale in Linguaggio C++
14
7
12/01/2004
Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste
Tipi Speciali di Liste
m In
alcuni casi
ðle applicazioni richiedono liste utilizzate in
modi particolari
ðle operazioni sono scritte ed utilizzate in
modo particolare
ðes: liste ordinate
m Due
categorie di liste importanti
ðcode
ðpile
G. Mecca - Programmazione Procedurale in Linguaggio C++
15
Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste
Tipi Speciali di Liste
m Code
ðliste in cui gli elementi devono essere estratti
nello stesso ordine in cui sono stati inseriti
ðtipicamente utilizzate per gestire richieste di
servizio
m Esempio
ðcoda delle richieste ad un sito Web (le
richieste devono essere servite nell’ordine in
cui sono arrivate)
G. Mecca - Programmazione Procedurale in Linguaggio C++
16
8
12/01/2004
Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste
Tipi Speciali di Liste
m In
una coda
ðl’inserimento: arrivo di una nuova richiesta
ðcancellazione: soddisfacimento di una
richiesta
m Cosa
cambia in una coda
ðbisogna rispettare l’ordine di arrivo
ðgli inserimenti si fanno solo in coda
ðle eliminazioni si fanno solo in testa
ðstrategia FIFO (“first in, first out”)
G. Mecca - Programmazione Procedurale in Linguaggio C++
17
Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste
Tipi Speciali di Liste
m Inserim.
e cancellaz. in una lista generica
ðinizialmente: lista vuota <>
ðinserisco 5 in coda: <5>
ðinserisco 7 in coda: <5, 7>
ðinserisco 4 in pos. 1: <5, 4, 7>
ðinserisco 9 in pos. 0 (in testa): <9, 5, 4, 7>
ðcancello in pos. 2: <9, 5, 7>
G. Mecca - Programmazione Procedurale in Linguaggio C++
18
9
12/01/2004
Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste
Tipi Speciali di Liste
m Es:
inserim. e cancellazioni in una coda
ðinizialmente: coda vuota <>
ðinserisco 5 (in coda): <5>
ðinserisco 7 (in coda): <5, 7>
ðinserisco 4 (in coda): <5, 7, 4>
ðestraggo (5): <7, 4>
ðinserisco 9 (in coda): <7, 4, 9>
ðestraggo (7): <4, 9>
G. Mecca - Programmazione Procedurale in Linguaggio C++
19
Strutture di Dati: Approfondimenti >> La Pila
La Pila
m Pile
ðliste in cui gli elementi devono essere estratti
in ordine inverso rispetto a quello in cui sono
stati inseriti
m Analogia
ðla pila di piatti (o di libri)
ði piatti devono essere riposti nello stesso
ordine in cui sono stati impilati
G. Mecca - Programmazione Procedurale in Linguaggio C++
20
10
12/01/2004
Strutture di Dati: Approfondimenti >> La Pila
La Pila
m Strategia
ðLIFO (“last in, first out”)
ðl’ultimo arrivato è il primo che viene prelevato
ðinserimenti e cancellazioni avvengono solo
da un estremo
m Terminologia
ðinserimento di un elemento: push
ðeliminazione di un elemento: pop
21
G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Dati: Approfondimenti >> Tipi Speciali di Liste
Tipi Speciali di Liste
m Es:
inserim. e cancellazioni in una pila
ðinizialmente: pila vuota <>
ðinserisco 5: <5>
5
5
5
ðinserisco 7: <5, 7>
7
ðestraggo (7): <5>
ðinserisco 4: <5, 4>
ðinserisco 9: <5, 4, 9>
ðestraggo (9): <5, 4> “elemento
affiorante”
ðestraggo (4): <5>
G. Mecca - Programmazione Procedurale in Linguaggio C++
5
5
5
4
4
4
5
9
22
11
12/01/2004
Strutture di Dati: Approfondimenti >> La Pila
La Pila
m Operazioni
sulla pila
ðpush(x, p): inserisci l’elemento x nella pila
ðpop(x): estrae l’”elemento affiorante” della
pila
ðtop(p): restituisce il valore dell’elemento
affiorante della pila
ðinit(p): inizializza la pila p in modo che sia
vuota
ðempty(p): restituisce true se la pila è vuota
G. Mecca - Programmazione Procedurale in Linguaggio C++
23
Strutture di Dati: Approfondimenti >> La Pila
La Pila
m Attenzione
ðsi tratta di una lista ordinaria
ðcon un numero limitato di operazioni possibili
ðe con nomi particolari
m In
particolare
ðpush: inserimento in coda
ðpop: eliminazione in coda
ðtop: valore dell’ultimo elemento
G. Mecca - Programmazione Procedurale in Linguaggio C++
24
12
12/01/2004
Strutture di Dati: Approfondimenti >> La Pila
La Pila
mA
che servono le pile ?
ðservono nei casi in cui in un programma è
necessario poter “tornare sui propri passi”
ðripercorrendo gli stessi passi in ordine
inverso
m Esempio
ð“operazione annulla” (“undo”) in un
programma di elaborazione di testi
G. Mecca - Programmazione Procedurale in Linguaggio C++
25
Strutture di Dati: Approfondimenti >> La Pila
La Pila
m Un
altro esempio
ðil browser Web e i tasti “indietro” e “avanti”
ðil browser mantiene traccia della sequenza
delle pagine visitate
ðe consente di ritornare indietro alle pagine
precedenti oppure avanti alle successive
m Per
farlo: due pile
ðpila delle pagine precedenti
ðpila delle pagine successive
G. Mecca - Programmazione Procedurale in Linguaggio C++
26
13
12/01/2004
Strutture di Dati: Approfondimenti >> La Pila
La Pila
m
>> browser1.cpp
>> paginaWeb1.h
>> pilaDiStringhe1.h
Esempio
ðun browser semplificato per pagine testuali
ðconsente di “navigare” semplici pagine testuali
ðciascuna pagina ha un titolo
ðe contiene una lista di collegamenti ad altre pagine
ðil browser richiede un indirizzo iniziale
ðe poi consente di seguire i collegamenti nelle pagine
ðconsentendo anche di andare avanti e indietro
G. Mecca - Programmazione Procedurale in Linguaggio C++
27
Strutture di Dati: Approfondimenti >> La Pila
La Pila
m Gestione
delle pagine Web
ðpaginaWeb1.cpp: una libreria per la lettura e
la navigazione di semplici pagine testuali
m Gestione
della pila
ðpilaDiStringhe1.cpp: una libreria per la
gestione di pile di stringhe
ðnon c’è niente di nuovo. si tratta di una
libreria semplificata per la gestione di liste di
stringhe
G. Mecca - Programmazione Procedurale in Linguaggio C++
28
14
12/01/2004
Strutture di Dati: Approfondimenti >> La Pila
La Pila
>> browser2.cpp
>> listaDiStringhe1.h
m Infatti
ðè possibile scrivere il programma utilizzando
direttamente una libreria per la gestione di
liste di stringhe
ðpurchè vengano utilizzate solo le operazioni
consentite sulle pile
ðcioè venga rispettata la strategia LIFO
G. Mecca - Programmazione Procedurale in Linguaggio C++
29
Strutture di Dati: Approfondimenti >> Sommario
Riassumendo
m Ricapitolazione
m Tipi
Speciali di Liste
m La Pila
G. Mecca - Programmazione Procedurale in Linguaggio C++
30
15
12/01/2004
Termini della Licenza
Termini della Licenza
m
This work is licensed under the Creative Commons AttributionShareAlike License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California
94305, USA.
m
Questo lavoro viene concesso in uso secondo i termini della
licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere
una copia della licenza, è possibile visitare
http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una
lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way,
Stanford, California 94305, USA.
G. Mecca - Programmazione Procedurale in Linguaggio C++
31
16