Informatica Generale Alessandra Di Pierro email: [email protected] Ricevimento: Giovedì ore 14.30-17.30 presso Dipartimento di Informatica, Via Buonarroti, 2 stanza 362 DE Tel. 050.2212.779 o per posta elettronica Pagina web del corso: http://www.di.unipi.it/~dipierro/IG03.html 1 La scorsa lezione … • Abbiamo introdotto la struttura tipica del calcolatore di von Neumann Memoria (RAM,dischi, etc) Mantiene Dati e Programmi Processore (CPU) E’ un esecutore capace di interpretare i singoli passi richiesti dai programmi (istruzioni elementari) Sottosistema di Interfaccia Permette di comunicare dati programmi alla macchina e di ottenere i risultati (tastiera, micr., stampante, schermo, ) 2 La scorsa lezione ... • Abbiamo introdotto algoritmi e programmi Dati di ingresso Codificati opportunamente Elaborazione Dati di uscita Trasformazione dei dati di ingresso seguendo i passi specificati da un opportuno algoritmo Ovvero la descrizione dell’algoritmo secondo un linguaggio comprensibile al calcolatore Umano (che conosce l’algoritmo) Calcolatore programma (che conosce alcune azioni elementari: es confrontare due numeri, eseguire semplici operazioni aritmetiche 3 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) 4 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 5 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… 6 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 ….’ 7 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. 8 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 …) 9 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 10 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. 11 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. 12 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 13 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 14 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! 15 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 16 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 17 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 18 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 19 Diagrammi di Flusso (2) I blocchi base : Inizio Sottoprog. Operazione I/0 Fine Si No Cond. Elaborazione 20 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 21 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 22 DF di max Inizio Leggi x e y d=x-y Si No d>0? Scrivi ‘max è y’ Scrivi ‘max è x’ Fine 23 DF di max Inizio Passo 1 Leggi x e y Passo 2 d=x-y Si Passo 3No d>0? Scrivi ‘max è y’ Scrivi ‘max è x’ Passo 5 Passo 4 Fine Passo 6 24 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 26 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) Si Leggi il nuovo numero in a Ancora numeri da esaminare ? No Scrivi ‘max è m’ Fine m = max(a,m) Supponiamo N fissato 27 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 28 Leggi N Inizio Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Si I=2 No I<N? I=I+1 Leggi il nuovo numero in a Scrivi ‘max è m’ Fine DF per il problema del massimo di N numeri (seconda versione) m = max(a,m) Supponiamo N almeno 2 29 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) !!!! 30 DF e programmi (3) • … soluzione…. – 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 31 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 ; } 32 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 ; } 33 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; } 34