Informatica Generale Susanna Pelagatti email: [email protected] Ricevimento: Mercoledì ore 14.30-17.30 presso Dipartimento di Informatica, Via Buonarroti, 2 stanza 346 DE Tel. 050.2212.772 o per posta elettronica Pagina web del corso: http://www.di.unipi.it/~susanna/IG02/ 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