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