Informatica Generale
Marzia Buscemi
[email protected]
Ricevimento: Giovedì ore 16.00-18.00,
Dipartimento di Informatica, stanza 306-PS
o per posta elettronica
Pagina web del corso:
http://www.di.unipi.it/~buscemi/IG07.htm
(sommario delle lezioni in fondo alla pagina)
1
La volta scorsa abbiamo
visto
Le strutture di controllo:
 sequenza di istruzioni
 selezione (if .. then .. else ..)
 iterazione (while .. do, repeat ..
while, for .. to .. do)
 Come si rappresentano gli algoritmi:
 pseudocodice
 diagramma di flusso
 Strutture dati:
 array

2
Oggi...
 approfondiremo alcuni punti visti la
scorsa volta
 faremo altri esempi di algoritmi per
risolvere problemi (numerici e non
numerici)
 vedremo come dividere un problema in
sotto-problemi e quindi trovare un
algoritmi componendo sotto-algoritmi
3
Algoritmi e programmi
Algoritmo
Codifica in un linguaggio di
programmazione (C, Java, etc)
Programma
Input : programma
Compilatore
Eseguibile
Output : rappresentazione comprensibile alla macchina
4
Sotto-programmi


Tutte le operazioni specificate devono
essere ‘elementari’ per chi esegue il
programma.
Se non lo sono è possibile spiegarle a
parte per mezzo di un sotto-programma

es culinario:
‘… preparare la pasta frolla (ricetta p. 212)
usando i primi 3 ingredienti, poi preparare il
ripieno come segue ….’

es programmazione:
 calcolare il max di N numeri ripetendo
l’algoritmo per trovare il max tra due numeri
5
Ordinare N numeri interi
1
 Supponiamo di voler ordinare N numeri
interi. Vedremo ora come risolvere
questo problema suddividendolo in sottoproblemi, trovando un (sotto-)algoritmo
per risolvere ciascun sotto-problema e
combinando i sottoalgoritmi per ottenere
l’algoritmo che dà la soluzione dell’intero
problema.
6
Ordinare N numeri interi 2
 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
7
Ordinare N numeri interi
3
 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
8
Ordinare N numeri interi
8
7
3
1
N=4
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
9
Ordinare N numeri interi



5
La variabile X_i che deve essere
scambiata è diversa ogni volta! Questo
non è possibile esprimerlo utilizzando solo
variabili
Inoltre se N cambia devo
aggiungere/togliere variabili …
Soluzione: usare gli array!!

Se usiamo gli array abbiamo un meccanismo
di rappresentazione ‘più potente’ della
singola variabile, che mantiene
l’informazione che stiamo elaborando.
10
Ordinare N numeri interi
6
 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
11
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
12
Esempio di leggi_Na
Sequenza di numeri da leggere : 8, 1, 9, 7
Inizialmente X è vuoto
Passo 1, leggo il primo numero
quindi
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
13
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
14
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
15
Algoritmo ordina_Na
 Algoritmo ordina_Na
1. Leggi il valore di N dall’esterno
2. Leggi gli N numeri della sequenza nell’array
X (con leggi_Na)
3. Trova il maggiore (m, imax) fra i primi N
numeri dell’array X (con max_Na)
4. Scambia fra loro X[imax] e X [N]
5. Considera adesso solo i primi N-1 numeri
dell’array (N=N-1)
6. Se N = 1 continua, altrimenti vai al passo 3
7. Stampa X, termina
16
Input : vuoto
(void)
(X,N)=leggi_Na()
Inizio
Si
N > 1?
(m,I) = max_Na(X,N)
T = X[N]
X[N] = X[I]
X[I] = T
N = N-1
Lung=N
No
Stampa(X,Lung)
Strutture dati:
Int X[N]
// la sequenza
Fine
Output : vuoto (void)
Scambio
dei due valori
DF per il problema del
ordinare di N numeri
(ordina_Na)
17