Informatica Generale Susanna Pelagatti email susannadi unipi it

  • Slides: 20
Download presentation
Informatica Generale Susanna Pelagatti email: susanna@di. unipi. it Ricevimento: Mercoledì ore 14. 30 -17.

Informatica Generale Susanna Pelagatti email: susanna@di. unipi. it 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/IG 02/ 1

La scorsa lezione … • Abbiamo dato alcuni esempi di algoritmi • Abbiamo introdotto

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 :

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

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

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’ (2) schedario Situazione iniziale 6

La ricerca stile ‘dizionario’ (3) Ogni volta elimino la metà delle schede, oppure mi

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

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

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

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

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

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,

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 3 x 4 di 12 valori interi (a due dimensioni) 13

Array (2) • Come si specifica la struttura di un array ? e come

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

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 x[1] tab[1][0] 0 1 2 3 1 3 7 8 posizione valore I II III Prod 1 1 32 7 8 Prod 2 9 3 3 8 Prod 3 14 3 723 82 IV 15

Usiamo gli array. . . • Costruiamo una versione dell’algoritmo che ordina N numeri

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]

Input : vuoto (void) Inizio Leggi il valore di N Strutture dati: Int X[N] // la sequenza I=0 Si I<N? Sottoalgoritmo per la lettura di N numeri (leggi_Na) No 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

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 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

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 I<N? No Fine Si No m > X[i] ? I=I+1 Strutture dati: Int X[N] // la sequenza 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

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 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