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/IG02/
La scorsa lezione … Abbiamo introdotto la struttura tipica del calcolatore di von Neumann Processore (CPU) Sottosistema di Interfaccia Memoria (RAM,dischi, etc) Mantiene Dati e Programmi E’ un esecutore capace di interpretare i singoli passi richiesti dai programmi (istruzioni elementari) Permette di comunicare dati programmi alla macchina e di ottenere i risultati (tastiera, micr., stampante, schermo, )
La scorsa lezione ... Abbiamo introdotto algoritmi e programmi Elaborazione Dati di ingresso Dati di uscita Trasformazione dei dati di ingresso seguendo i passi specificati da un opportuno algoritmo Codificati opportunamente Ovvero la descrizione dell’algoritmo secondo un linguaggio comprensibile al calcolatore Calcolatore (che conosce alcune azioni elementari: es confrontare due numeri, eseguire semplici operazioni aritmetiche Umano (che conosce l’algoritmo) programma
Dal problema all’algoritmo: un esempio La biblioteca Libri disposti sugli scaffali La posizione di ogni libro è fissata dalle due coordinate (S,P) dove S è il numero dello scaffale dove si trova il libro P è la posizione all’interno dello scaffale La biblioteca ha uno schedario con una scheda per ogni libro. Ogni scheda contiene, nell’ordine: cognome e nome dell’autore titolo del libro numero scaffale (S) e posizione nello scaffale (P)
Dal problema all’algoritmo: esempio (2) La biblioteca (cont.) Le schede sono ordinate in ordine alfabetico del campo autore Problema: Vogliamo specificare un algoritmo che spieghi all’utente della biblioteca come trovare un libro cercato supponendo di sapere : Autore e Titolo
Dal problema all’algoritmo: esempio (3) Un primo algoritmo per il prestito: 1. Decidi il libro da richiedere 2. Cerca la scheda nello schedario 3. Trascrivi la posizione (S,P) 4. Accedi alla posizione (S,P) 5. Preleva il libro e compila la scheda di prestito Le operazioni elementari in questo caso sono piuttosto complesse…
Dal problema all’algoritmo: esempio (4) … e se non so come si effettua la ricerca nello schedario ? Tutte le operazioni specificate devono essere ‘elementari’ per chi esegue l’algoritmo. Se non lo sono è possibile spiegarle a parte per mezzo di un sotto-algoritmo es : nello spiegare una ricetta spesso si fa riferimento a parti spiegate in altre ricette, tipicamente ‘… preparare la pasta frolla (ricetta p. 212) usando i primi 3 ingredienti, poi preparare il ripieno come segue ….’
Dal problema all’algoritmo: esempio (5) Un sotto algoritmo per cercare nello schedario : 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 4. Se sono uguali, allora la ricerca è terminata, altrimenti prendi la scheda successiva e vai al passo 3 5. Se le schede sono esaurite, allora il libro cercato non esiste.
Dal problema all’algoritmo: esempio (6) Due considerazioni : Per ogni problema\sotto-problema ci sono algoritmi più o meno veloci es: per la ricerca nello schedario si può utilizzare l’algoritmo che utilizziamo solitamente (e spesso non consapevolmente) per cercare una parola sul dizionario L’algoritmo presentato, per quanto semplice presenta sia operazioni elementari (confronta, prendi) che strutture di controllo (istruzioni che organizzano la sequenza in cui vengono effettuate le operazioni elementari, es. se….altrimenti … vai a …)
Dal problema all’algoritmo: le strutture di controllo La struttura di controllo condizionale 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 4. Se (sono uguali), allora la ricerca è terminata, altrimenti prendi la scheda successiva e vai al passo 3 5. Se (le schede sono esaurite) allora il libro cercato non esiste. (….) specifica la condizione
Dal problema all’algoritmo: le strutture di controllo (2) La struttura di salto (vai a o go_to) 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 4. Se sono uguali, allora la ricerca è terminata, altrimenti prendi la scheda successiva e vai al passo 3 5. Se le schede sono esaurite allora il libro cercato non esiste.
Dal problema all’algoritmo: le strutture di controllo (3) La struttura di iterazione (finchè…ripeti) 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 3. Finchè (il campo autore e titolo sono diversi da quelli cercati) ripeti a. Prendi la scheda successiva b. Confronta il campo autore e titolo con quelli cercati 5. Se le schede sono esaurite allora il libro cercato non esiste.
Algoritmi: ancora esempi ... Immaginiamo degli algoritmi per i seguenti problemi : 1. Trovare il maggiore fra 2 numeri interi x e y 2. Trovare il maggiore fra 3 numeri interi x, y e z 3. Trovare il massimo fra N numeri assumiamo le seguenti operazioni elementari somma (+), sottrazione (-), stabilire se un numero è maggiore o minore di 0, leggere/scrivere dallo schermo … dove ragionevole : definiamo dei sottoalgoritmi e utilizziamo le strutture di controllo
Il maggiore fra 2 numeri interi x, y Algoritmo max 1. Leggi i valori di x e y dall’esterno 2. Calcola la differenza d fra x e y (d=x-y) 3. Se d è maggiore di 0 vai al passo 5 altrimenti prosegui in sequenza 4. Stampa ‘il massimo è …’ seguito dal valore di y e vai a 6 5. Stampa ‘il massimo è …’ seguito dal valore di x 6. Termina l’esecuzione
Il maggiore fra 2 numeri interi x e y (2) x, y, d sono le ‘variabili’, cioè i contenitori per i dati coinvolti nell’elaborazione. Ogni variabile ha un nome (x,y…) e un valore: il dato contenuto o memorizzato in essa Dobbiamo specificare esplicitamente come e quando l’esecuzione termina!
Il maggiore fra 3 numeri interi Possiamo sfruttare l’algoritmo max come ‘sottoalgoritmo’ Algoritmo max_3 1. Leggi i valori di x, y, z dall’esterno 2. Valuta se x> y usando l’algoritmo max 3. In caso affermativo vai al passo 5 4. Trova il massimo fra y e z (con max) e termina 5. Trova il massimo fra x e z (con max) e termina
Il massimo fra N numeri interi Possiamo ancora sfruttare l’algoritmo max come ‘sottoalgoritmo’! Idea … trovare prima il maggiore fra i primi due numeri, poi confrontare il risultato con il terzo, poi con il quarto etc … In pratica, possiamo usare la struttura di controllo iterativa finchè…ripeti per effettuare le operazioni di max su tutti i numeri in ingresso
Determinare il massimo fra N numeri interi Algoritmo max_N 1. Leggi il valore di N dall’esterno 2. Leggi i primi due numeri 3. Trova il maggiore m fra i primi due numeri (con max) 4. Finchè (hai esaminato meno di N numeri) a. Leggi un nuovo numero x b. Trova il maggiore fra m e x usando l’algoritmo max c. Assegna il valore del maggiore a m 5. Stampa ‘il massimo è…’ ed il valore di m e termina
Diagrammi di Flusso Sono grafici che permettono di esprimere un algoritmo in modo preciso ed intuitivo Si costruiscono a partire da un certo numero di ‘blocchi base’ che rappresentano le operazioni elementari ed i costrutti di controllo
Diagrammi di Flusso (2) I blocchi base : Inizio Sottoprog. Operazione I/0 Fine Si Cond. No Elaborazione
Diagrammi di Flusso (3) I blocchi base vengono collegati tramite ‘freccie’ che collegano un’azione alla successiva all’interno dell’algoritmo Vediamo i diagrammi di flusso degli algoritmi per il calcolo del massimo già visti 1. Trovare il maggiore fra 2 numeri interi x e y 2. Trovare il maggiore fra 3 numeri interi x, y e z 3. Trovare il massimo fra N numeri
Il maggiore fra 2 numeri interi x, y Algoritmo max 1. Leggi i valori di x e y dall’esterno 2. Calcola la differenza d fra x e y (d=x-y) 3. Se d è maggiore di 0 vai al passo 5 altrimenti prosegui in sequenza 4. Stampa ‘il massimo è …’ seguito dal valore di x e vai a 6 5. Stampa ‘il massimo è …’ seguito dal valore di y 6. Termina l’esecuzione
DF di max Inizio Leggi x e y d = x - y d > 0 ? Scrivi ‘max è y’ Si d > 0 ? No Scrivi ‘max è y’ Scrivi ‘max è x’ Fine
DF di max Inizio Passo 1 Leggi x e y Passo 2 d = x - y Passo 3 Si d > 0 ? No Scrivi ‘max è y’ Scrivi ‘max è x’ Passo 5 Passo 4 Fine Passo 6
Il massimo fra N numeri interi Possiamo ancora sfruttare l’algoritmo max come ‘sottoalgoritmo’! Idea … trovare prima il maggiore fra i primi due numeri, poi confrontare il risultato con il terzo, poi con il quarto etc … In pratica, possiamo usare la struttura di controllo iterativa finchè…ripeti per effettuare le operazioni di max su tutti i numeri in ingresso
Determinare il massimo fra N numeri interi Algoritmo max_N 1. Leggi il valore di N dall’esterno 2. Leggi i primi due numeri 3. Trova il maggiore m fra i primi due numeri (con max) 4. Finchè (hai esaminato meno di N numeri) a. Leggi un nuovo numero x b. Trova il maggiore fra m e x usando l’algoritmo max c. Assegna il valore del maggiore a m 5. Stampa ‘il massimo è…’ ed il valore di m e termina
DF per il problema del massimo di N numeri Inizio Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Ancora numeri da esaminare ? Si No Scrivi ‘max è m’ Leggi il nuovo numero in a Fine Supponiamo N fissato m = max(a,m)
DF e programmi (1) I DF sono un primo passo verso la formalizzazione di un algoritmo in modo non ambiguo Per ottenere una codifica interpretabile direttamente dalla macchina dobbiamo però specificare molti più dettagli : trasformare tutte le ‘frasi’ in variabili e modifiche su di esse : es : ‘ancora numeri da esaminare’ deve essere tradotto in qualcosa di calcolabile dalla macchina usando solo le operazioni elementari
DF per il problema del massimo di N numeri (seconda versione) Leggi N Inizio I = 2 Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Si I < N ? No I = I + 1 Scrivi ‘max è m’ DF per il problema del massimo di N numeri (seconda versione) Leggi il nuovo numero in a Fine m = max(a,m) Supponiamo N almeno 2
DF e programmi (2) Per ottenere una codifica interpretabile direttamente dalla macchina dobbiamo anche : decidere come codificare l’informazione non banale in esempi più complessi del nostro, ad esempio se voglio codificare un’immagine o un video scrivere il tutto con una codifica ‘leggibile’ dalla macchina … ma la macchina lavora molto a basso livello (linguaggio macchina, codificato con zeri e uni) !!!!
DF e programmi (3) … soluzione…. importante …. usare linguaggi di ‘livello’ più alto (linguaggi di programmazione ad alto livello) usare dei programmi appositi per far tradurre i nostri programmi in linguaggio macchina (i compilatori) importante …. I tipici linguaggi (C, Java, Fortran, Basic…) permettono di definire strutture del tutto analoghe ai diagrammi di flusso che abbiamo visto finora
DF e programmi : max in C main() /* calcola max */ { int x, y, d; scanf ("%d %d”, &x, &y) ; d = x - y ; if (d > 0) printf (”il max è %d”, &x) ; else printf (”il max è %d”, &y) ; return ; }
DF e programmi : max_N in C (1) main() /* calcola max_N */ { unsigned int m, i, a, b; i = 2 ; scanf ("%d %d”, &a, &b); m = max(a,b); while (i < N) { scanf ("%d ”, &a) ; m = max(a,m); } printf (”il max è %d”, &m) ; return ; }
DF e programmi : max_N in C (2) int max(int x, int y) /* sottoprogramma che calcola max */ { int d; d = x - y ; if (d > 0) return x; else return y; }