1 Informatica Generale Alessandra Di Pierro Ricevimento: Giovedì ore presso Dipartimento di Informatica, Via Buonarroti, 2 stanza 362 DE Tel o per posta elettronica Pagina web del corso:
2 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
3 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)
4 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
5 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
6 La ricerca stile ‘dizionario’ (2) schedario Situazione iniziale
7 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!
8 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
9 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
10 Ordinare N numeri interi (3) 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
11 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)
12 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
13 Array –Possiamo definire una sequenza lunga N per il nostro problema di ordinamento, es Array di 4 valori interi (a una sola dimensione) Array 3x4 di 12 valori interi (a due dimensioni) –Possiamo definire una tabella a due dimensioni, ad esempio per memorizzare le vendite di un prodotto in un trimestre dell’anno Prod 1 Prod 2 Prod 3 I IIIII IV
14 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] int tab[3][4] Prod 1 Prod 2 Prod 3 I IIIII IV Nomi delle tabelle
15 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) Prod 1 Prod 2 Prod 3 I IIIII IV x[1] tab[1][0] Noi generalmente seguiremo la convenzione C di partire da posizione valore
16 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
17 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
18 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
19 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
20 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