1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta elettronica Pagina web del corso: (sommario delle lezioni in fondo alla pagina)
2 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
3 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
4 Algoritmi e programmi Algoritmo Codifica in un linguaggio di programmazione (C, Java, etc) Programma Compilatore Input : programma Output : rappresentazione comprensibile alla macchina Eseguibile
5 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
6 Ordinare N numeri interi 1 Supponiamo di voler ordinare N numeri interi. Vedremo ora come risolvere questo problema suddividendolo in sotto- problemi, trovando un (sotto-)algoritmo per risolvere ciascun sotto-problema e combinando i sottoalgoritmi per ottenere l’algoritmo che dà la soluzione dell’intero problema.
7 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
8 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
9 Ordinare N numeri interi N=4 Max_N = 8 in posizione 1 Scambio la posizione 1 e 4 N=3 Max_N = 7 in posizione 2 Scambio la posizione 1 e 3 N=2 Max_N = 3 in posizione 2 Nessuno scambio 1378 Termina 1378 N=1
10 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.
11 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
12 I < N ? Inizio Fine Si No Leggi il nuovo numero in X[I] Sottoalgoritmo per la lettura di N numeri (leggi_Na) Leggi il valore di N I = 0 I = I + 1 Strutture dati: Int X[N] // la sequenza Input : vuoto (void) Output : Int X[N] // la sequenza letta Int N // la sua lunghezza
13 Esempio di leggi_Na 8 Inizialmente X è vuoto Passo 1, leggo il primo numero I=0Leggo 8 e lo scrivo nella posizione 0, cioè X[0]=8 Termina Sequenza di numeri da leggere : 8, 1, 9, 7 quindi N=4 Passo 2, leggo il secondo numero 81 I=1Leggo 1 e lo scrivo nella posizione 1, cioè X[1]= Passo 3, leggo il terzo numero I=2 Leggo 9 e lo scrivo nella posizione 2, cioè X[2]=9 819 Passo 4, leggo il quarto numero I=3Leggo 7 e lo scrivo nella posizione 3, cioè X[3]=7 X = posizione I=4, quindi I< N non è più verificata
14 I < N ? Inizio Fine Si No Sottoalgoritmo per la trovare il massimo di N numeri in un array (max_Na) Imax = 0, I = 0 I = I + 1 Strutture dati: Int X[N] // la sequenza m = X[0] Input: Int X[N], Int N Output: Int m // il valore del massimo Int Imax // l’indice del massimo m > X[i] ? Si No m = X[i], Imax = I
15 Esempio di max_Na Passo 1, esamino X[0], I=0 m = 8Imax = 0 Termina Trova il valore m del massimo in X e la sua posizione Imax, la lunghezza di X è N=4 Passo 2, esamino X[1], I= Passo 3, esamino X[2], I= Passo 4, esamino X[3], I=3 X = posizione I=4, quindi I< N non è più verificata (Valore e posizione del massimo trovato fra gli elementi già esaminati) m = 8Imax = 0 m = 9Imax = 2 m = 9Imax = 2
16 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
17 N > 1? Inizio Fine Si No (X,N)=leggi_Na() (m,I) = max_Na(X,N) DF per il problema del ordinare di N numeri ( ordina_Na ) Strutture dati: Int X[N] // la sequenza T = X[N] X[N] = X[I] Input : vuoto (void) X[I] = T N = N-1 Lung=N Output : vuoto (void) Scambio dei due valori Stampa(X,Lung)