Informatica Generale
Alessandra Di Pierro
email: [email protected]
Ricevimento:
Giovedì ore 14.30-17.30
presso
Dipartimento di Informatica, Via Buonarroti, 2
stanza 362 DE Tel. 050.2212.779
o per posta elettronica
Pagina web del corso:
http://www.di.unipi.it/~dipierro/IG03.html
1
La scorsa lezione …
• Abbiamo dato alcuni esempi di algoritmi
• Abbiamo introdotto i diagrammi di flusso (DF),
dei grafici che permettono di esprimere un
algoritmo tramite una combinazione grafica di
passi elementari e strutture si controllo.
• Abbiamo discusso la distanza fra DF e tipici
linguaggi di programmazione ad alto livello
2
Oggi …
• Iniziamo con la discussione degli esercizi
proposti la volta scorsa :
– formalizzare un algoritmo che effettua la ricerca della
scheda relativa a un certa coppia (Autore, Titolo)
usando la strategia della ricerca nel dizionario
– modificare l’algoritmo max_N in modo da ordinare
gli N numeri (diagramma di flusso)
3
Oggi …(2)
• Introdurremo le strutture dati, cioè variabili ‘con
struttura’ che permettono di rappresentare
agevolmente dati più complessi di quelli visti
finora e ne discuteremo alcuni esempi
4
La ricerca stile ‘dizionario’
1. Apri il classificatore
2. Prendi la scheda X al centro dello schedario
3. Confronta il campo autore e titolo di X con quelli
cercati
4. Se sono uguali, allora termina, altrimenti prosegui
5. Se il campo autore di X è minore di quello cercato
allora prosegui la ricerca sulla metà inferiore delle
schede altrimenti considera la metà superiore
6. Se la metà selezionata al passo 5 è vuota allora termina
(lo schedario non contiene il libro cercato) altrimenti
scegli come X la scheda al centro della metà scelta e vai
al passo 3
5
La ricerca stile ‘dizionario’ (2)
schedario
Situazione iniziale
6
La ricerca stile ‘dizionario’ (3)
Ogni volta elimino la metà
delle schede, oppure mi fermo
perché ho trovato la scheda
cercata
Ogni volta divido il numero
N delle schede per 2, mi fermo
quando N è diventato 1 o 0
Al più eseguo x passi dove
x è il logaritmo in base 2 di N
Scheda cercata!
7
Ordinare N numeri interi
• Problema: Servono N variabili !
– X_1 … X_N per memorizzare i numeri letti
dall’esterno durante l’elaborazione
• Supponiamo che max_N restituisca una coppia di
valori (m,i) dove m è il valore del massimo ed i è
la posizione all’interno della sequenza cui
corrisponde
– es (45,3), il massimo valore è 45 e corrisponde al
terzo numero nella sequenza lunga N
8
Ordinare N numeri interi (2)
• Algoritmo ordina_N
1. Leggi il valore di N dall’esterno
2. Finchè (hai letto meno di N numeri)
a. Leggi un nuovo numero nella variabile X_i
3. Trova il maggiore (m, i) fra X_1 … X_N (con
max_N modificato)
4. Scambia fra loro X_i e X_N
5. Considera adesso solo i primi N-1 numeri (N=N-1)
6. Se N = 1 termina, altrimenti vai al passo 3
9
Ordinare N numeri interi (3)
8
7
3
1
N=4
Max_N = 8 in posizione 1
Scambio la posizione 1 e 4
1
7
3
8
N=3
Max_N = 7 in posizione 2
Scambio la posizione 1 e 3
1
3
7
8
N=2
Max_N = 3 in posizione 2
Nessuno scambio
1
3
7
8
N=1
Termina
1
3
7
8
10
Ordinare N numeri interi (4)
• … problema….
– La variabile X_i che deve essere scambiata è
diversa ogni volta! Questo non è possibile
esprimerlo utilizzando solo le cose viste finora
– Inoltre se N cambia devo aggiungere/togliere
variabili …
– Soluzione : utilizzare un meccanismo di
rappresentazione ‘più potente’ della singola
variabile, che mantenga l’informazione che
stiamo elaborando una sequenza di valori
(strutture dati)
11
Strutture dati
• Tutti i linguaggi ad alto livello per la
programmazione permettono di definire due
tipi di aggregati di variabili (o strutture dati)
– array : tabelline di valori tutti dello stesso tipo
– record : gruppi di variabili di tipo diverso
12
Array
– Possiamo definire una sequenza lunga N per il
nostro problema di ordinamento, es.
1
3
7
Array di 4 valori interi (a una sola dimensione)
8
– Possiamo definire una tabella a due dimensioni,
ad esempio per memorizzare le vendite di un
prodotto in un trimestre dell’anno
I
II
III
Prod 1
1
32
7
8
Prod 2
9
3
3
8
Prod 3
14
3 723 82
IV
Array 3x4 di 12 valori interi (a due dimensioni)
13
Array (2)
• Come si specifica la struttura di un array ? e
come si usano le singole variabili nella
struttura ?
– La struttura si specifica con il tipo e l’ampiezza
di ogni dimensione
– es :
• int x[4]
1
• int tab[3][4]
Nomi delle tabelle
3
7
8
I
II
III
Prod 1
1
32
7
8
Prod 2
9
3
3
8
Prod 3
14
3 723 82
IV
14
Array (3)
• Uso di una singola variabile :
– Si specificano le coordinate della variabile
desiderata :
– Ogni elemento di ogni dimensione è identificato
da un valore da 1 a N (o da 0 a N-1, dipende dal
linguaggio)
Noi generalmente seguiremo la
convenzione C di partire da 0
0
1
2
3
1
3
7
8
valore
I
II
III
Prod 1
1
32
7
8
Prod 2
9
3
3
8
Prod 3
14
3 723 82
x[1]
tab[1][0]
posizione
IV
15
Usiamo gli array ...
• Costruiamo una versione dell’algoritmo che
ordina N numeri che usa un array
int X[N]per memorizzare i numeri della
sequenza da ordinare
• Vediamo prima 2 sottoalgoritmi
– leggi_Na che legge i numeri da ordinare e li
inserisce nell’array X
– max_Na che trova il valore del massimo
numero in X e la sua posizione
16
Input : vuoto
(void)
Inizio
Leggi il valore di
N
Strutture dati:
Int X[N] // la sequenza
I=0
Si
Sottoalgoritmo per la
lettura di N numeri
(leggi_Na)
No
I<N?
Fine
Leggi il nuovo
numero in X[I]
Output :
Int X[N] // la sequenza letta
Int N
// la sua lunghezza
I=I+1
17
Esempio di leggi_Na
Sequenza di numeri da leggere : 8, 1, 9, 7
quindi
Inizialmente X è vuoto
Passo 1, leggo il primo numero
N=4
X=
posizione
I=0 Leggo 8 e lo scrivo nella posizione 0, cioè X[0]=8
0
1
2
3
8
Passo 2, leggo il secondo numero
I=1
Leggo 1 e lo scrivo nella posizione 1, cioè X[1]=1
8
1
8
1
9
8
1
9
Passo 3, leggo il terzo numero
I=2
Leggo 9 e lo scrivo nella posizione 2, cioè X[2]=9
Passo 4, leggo il quarto numero
I=3
Leggo 7 e lo scrivo nella posizione 3, cioè X[3]=7
Termina
I=4, quindi I< N non è più verificata
7
18
Input:
Int X[N],
Int N
Sottoalgoritmo per la
trovare il massimo
di N numeri in un array
(max_Na)
Inizio
m = X[0]
Imax = 0, I = 0
Si
Strutture dati:
Int X[N] // la sequenza
No
I<N?
Fine
Si
No
m > X[i]
?
I=I+1
Output:
Int m // il valore del massimo
Int Imax
// l’indice del massimo
m = X[i], Imax = I
19
Esempio di max_Na
Trova il valore m del massimo in X e
la sua posizione Imax ,
la lunghezza di X è N=4
Passo 1, esamino X[0], I=0
m=8
X=
8
1
posizione
Imax = 0 (Valore e posizione del massimo
trovato fra gli elementi già esaminati)
9
7
0
1
2
3
8
1
9
7
8
1
9
7
8
1
9
7
8
1
9
7
Passo 2, esamino X[1], I=1
m=8
Imax = 0
Passo 3, esamino X[2], I=2
m=9
Imax = 2
Passo 4, esamino X[3], I=3
m=9
Termina
Imax = 2
I=4, quindi I< N non è più verificata
20