Cenni su Algoritmi e Strutture Dati 14 nov 2011 Concetti di base su Algoritmi e Dati Un computer è un esecutore di algoritmi Un algoritmo è un particolare tipo di procedimento di soluzione di un problema, con caratteristiche determinate. Gli algoritmi sono solo una parte di tutti i possibili procedimenti di calcolo. In questa parte vedremo cos’è un algoritmo, in che modo è possibile rappresentarlo usando carta e penna in che modo è possibile rappresentare i dati che esso utilizza. Il calcolatore come strumento per gestire informazione acquisire dati IN elaborare PROCESS archiviare tradizionalmente l’enfasi è su presentare, attuare soluzioni OUT comunicare … cioè sui sistemi di elaborazione delle informazioni … Soluzione di un problema Problema soggetto 1 ANALISI Modello di soluzione STESURA DESCRIZIONE Descrizione INTERPRETAZIONE Deve fare tutto lo stesso soggetto? soggetto 2 Descrizione interpretata ESECUZIONE Soluzione La soluzione di un problema Conoscenza di come si risolve un problema soggetto 1 (cuoco) Descrizione della soluzione (ricetta) soggetto 2 (io) Effettiva capacità di eseguire la soluzione del problema Definire il problema Eliminare le ambiguità nella formulazione del problema Individuare il risultato che si vuole ottenere, gli obiettivi da raggiungere Evidenziare le regole da rispettare i vincoli interni ed esterni i dati espliciti ed impliciti Eliminare i dettagli inutili ed ambigui Relazione tra Realtà e Modello Ricerca della soluzione Costruzione modello Mondo Reale Modello re tf ft 12 13 tt 14 15 F=m×a Interpretazione della soluzione Soluzioni ed esecutori La descrizione della soluzione di un problema dipende dall’esecutore esecutore con un livello medio di scolarità ⇒ “determina la superficie s di un cerchio di cui è noto il raggio r”; esecutore che non conosce come calcolare l’area del cerchio ⇒ “la superficie di un cerchio è s = π r2”; esecutore che non conosce π ⇒ “la superficie di un cerchio è s = πr2 e π indica pi greco ed è 3.1415”; … ⇒ “eleva al quadrato il raggio e quindi moltiplica il risultato per pi greco”; … ⇒ “moltiplica il raggio per se stesso e poi il risultato per 3.14”; … La descrizione della soluzione di un problema deve essere accettabile per un esecutore si scompone il problema originario in sottoproblemi; si scompongono i sottoproblemi in sotto-sottoproblemi; si prosegue nella scomposizione fino a giungere a problemi elementari (o primitivi), cioè problemi che possono essere risolti direttamente dall’esecutore Area di una campana (1) Problema Scomposizione del problema in tre sottoproblemi Sottoproblema 1 r soluzione elementare: s = ½ r2 r=b/2 h2 Sottoproblema 2 b h2 b soluzione elementare: s = b h2 h1 B soluzione elementare: s = ?? Sottoproblema 3 h1 B soluzione elementare: s = ?? Area di una campana (2) Scomposizione del sottoproblema 3 in tre ulteriori sottoproblemi b h1 B Sottoproblema 3 soluzione effettiva: s = ½ (½(B–b) h1) + b h1 + ½ (½(B–b) h1) h1 h1 b ½ (B–b) h1 ½ (B–b) Sottoproblema 3.1 Sottoproblema 3.2 Sottoproblema 3.3 soluzione elementare: s =½ (½(B–b) h1) soluzione elementare: s = b h1 soluzione elementare: s =½ (½(B–b) h1) Composizione delle soluzioni dei tre sottoproblemi 3.1, 3.2 e 3.3 per risolvere il sottoproblema 3 14 nov 2011 Concetti di base su Algoritmi e Dati 1. Cosa permette a un computer di svolgere compiti che, se svolti dall’uomo, verrebbero considerati intelligenti? 2. Algoritmi Come “rappresentare” un algoritmo? Carta e Penna, scrivendone i passi (Metodo informale, adatto agli esseri umani) Flow Chart (Metodo formale – adatto agli esseri umani) Programma scritto in linguaggio ad Alto Livello (Metodo formale – adatto a computer e ad esseri umani) Programma scritto in linguaggio a Basso Livello (Metodo formale – adatto ai computer) Rappresentazione degli algoritmi Linguaggio Naturale Diagramma di flusso Inizio Sollevare il ricevitore Attendere il segnale di linea libera Leggi xey Comporre il numero dx–y P1 e P 2 P3 … Sì Scrivi “max è x” d>0? No P4 Scrivi “max è y” P5 Fine P7 P6 Rappresentazione degli algoritmi Pseudo Codice leggi alfa, beta prod ⇦ 0 finché alfa ≠ 0 ripeti prod ⇦ prod + beta; alfa ⇦ alfa – 1; stampa prod; Linguaggio di programmazione #include <stdio.h> int main (void) { puts (“ciao mondo!”); return Exit_success; } Diagrammi di flusso - Flowchart START END I/O PROCESS Inizio Fine Operazioni di ingresso/uscita Elaborazione Sì Predicato Selezione a due vie No SUB-PROCESS Sottoprogramma Esempio Esempio: dati in ingresso due numeri X e Y, si calcoli e stampi il maggiore. Inizio Leggi xey P1 e P 2 dx–y Sì Scrivi “max è x” d>0? P3 No P4 Scrivi “max è y” P5 Fine P7 P6 Definizione (informale) di Algoritmo sequenza finita di azioni espresse in modo comprensibile all'esecutore che, a partire da un insieme di dati input, conducono sempre alla risoluzione del problema in un tempo “ragionevole” e facendo uso di una quantità “ragionevole” di risorse. Algoritmi non tutti i procedimenti di soluzione sono algoritmi, non tutti i problemi ammettono un algoritmo, un problema può ammettere più di un algoritmo Caratteristiche di un algoritmo Perché la soluzione ad un problema possa essere detta "algoritmo" è necessario che presenti tutte insieme le seguenti caratteristiche: Insieme finito di istruzioni Terminazione Deve terminare dopo un numero finito di passi. Assenza di ambiguità Ogni istruzione deve essere eseguibile in un unico modo, a prescindere da chi l’esegue; Presenza di Input Deve operare su un insieme ben specificato di dati in ingresso Produzione di Output Deve essere nella relazione prevista con i dati di ingresso Generalità Deve essere in grado di risolvere tutti i problemi dello stesso tipo (ad esempio se l'algoritmo calcola la somma di 2 numeri, esso deve fornire sempre il valore corretto della somma qualsiasi sia la coppia di numeri dati in input). Deve usare una quantità limitata di risorse. Caratteristiche di un algoritmo Le procedure che contravvengono anche uno solo dei requisiti di cui sopra pur essendo metodi di risoluzione non sono algoritmi. Un algoritmo, ovviamente, oltre ad essere “corretto” è opportuno (ma non necessario) che sia “efficiente”, cioè deve fornire la soluzione al problema nel modo più veloce possibile e usando il minor numero possibile di risorse esterne. Un po’ di storia … Algoritmo, il concetto fondamentale e centrale dell'informatica La parola ha origine nel Medio Oriente dal nome del matematico persiano Abu Ja'far Mohammed ibn Musà al-Khowarizmi (825). Una procedura per risolvere un problema matematico in un numero finito di passi che implicano frequenti ripetizioni di un'operazione. ALGORITMO DI EUCLIDE PER IL MCD DI 2 NUMERI INTERI Dispense, cap. 1.1.2 Algoritmo di Euclide Dati due numeri interi e positivi m e n, si calcoli il più grande intero che li divide entrambi Si supponga (non cambia il procedimento e non si perde in generalità) che m≥n (se così non fosse si scambi m con n). L’operazione mn è detta di assegnazione (in questo caso si legge “si assegni ad m il valore contenuto in n”), ALGORITMO PER IL CALCOLO DEL MCD 1. Si divida m per n. Sia r il resto della divisione (con 0 r < n) 2. se r = 0 allora la risposta è n e STOP 3. Altrimenti (cioè r ≠ 0) m n e n r e si torni al passo 1 Verifica empirica Proviamo con m 774 e n 342: 1. 774 / 342 dà come resto r 90 2. r = 0? No, per cui non terminiamo 3. poniamo m 342 e n 90 e torniamo al passo 1. 1. 342 / 90 dà come resto r 72 2. r = 0? No, per cui non terminiamo 3. poniamo m 90 e n 72 e torniamo al passo 1 1. 90 / 72 dà come resto r 18 2. r = 0? No, per cui non terminiamo 3. poniamo m 72 e n 18 e torniamo al passo 1. 1. 72 / 18 dà come resto r 0 2. r = 0 SI, per cui MCD = n = 18. STOP Criteri di algoritmicità per MCD Il criterio di terminazione è soddisfatto La sequenza dei resti è una successione di numeri interi decrescenti che termina con 0 Non Ambiguità. Si usano solo divisioni intere, test su numeri positivi e assegnamenti a variabili. Sappiamo senza alcuna ambiguità come eseguire queste operazioni e quindi il criterio è soddisfatto Criteri di algoritmicità per MCD I dati input sono i due numeri positivi Il dato in output è il MCD per la coppia Il procedimento vale per qualunque coppia di interi, per cui il criterio di Generalità è soddisfatto. Gli altri criteri sono evidentemente soddisfatti dal formato con cui si presenta l’algoritmo 14 nov 2011 Dati Un algoritmo è un metodo per la manipolazione dei dati. Nella pratica, i dati raramente si presentano in formato elementare (un singolo numero intero oppure un unico carattere) Quasi sempre un algoritmo utilizza “aggregazioni” di dati a cui si riferisce come ad una singola entità Entità Data di calendario. Esso rappresenta un’unica entità (un giorno) che è composta da più elementi: giorno, mese, anno Dia 14 nov 2011 Dati Scheda bibliografica. Esso rappresenta un’unica entità (un libro) che è composta da più elementi: Titolo Autore Casa Editrice Numero di pagine … Intero Schedario bibliografico, composto da un insieme di tante schede singole riunite in un unico “contenitore”, lo schedario Dati: Variabili e Costanti Un algoritmo (e il programma che ne è rappresentazione) utilizza dati che, al momento dell’elaborazione, sono fisicamente memorizzati nelle celle di memoria RAM I dati memorizzati nelle celle di memoria sono detti “variabili” se possono mutare valore nel corso dell’elaborazione, “costanti” se, una volta che hanno assunto un valore, non permettono al programmatore di modificarlo Valore della variabile (o di una costante) è il contenuto corrente della cella di memoria associata alla variabile (o alla costante). Variabili e Costanti Ad ogni dato (sia esso costante che variabile) si fa riferimento tramite un NOME. Il nome di una costante o di una variabile è un aiuto mnemonico per chi formula l’algoritmo non riveste alcun significato per chi dovrà poi eseguire l’algoritmo (il calcolatore) Algoritmi e variabili Gli algoritmi sono parametrici: producono un risultato che dipende da un insieme di dati di partenza; descrivono la soluzione non di un singolo problema, ma di una intera classe di problemi strutturalmente equivalenti. Esempi: l’algoritmo per la moltiplicazione di due numeri specifica come effettuare il prodotto di tutte le possibili coppie di numeri; l’algoritmo per la ricerca di un libro nello schedario della biblioteca vale per tutti i possibili libri; … Le istruzioni dell’algoritmo fanno riferimento a variabili, il cui valore non è fissato a priori ma cambia a seconda della situazione elaborativa in cui l’esecutore si trova. Uso delle variabili All’interno di espressioni, l’esecutore usa il valore contenuto nelle variabili per calcolare il risultato dell’espressione, per esempio op1 + op2 × op3 oppure op1 / op2 – op3, … in istruzioni di assegnamento introdurre nel contenitore identificato dal nome della variabile il valore specificato a destra dell’assegnamento; per esempio r ← 35 (assegna 35 alla variabile il cui nome è r), pi ← 3,14, … in istruzioni di assegnamento combinate con espressioni assegna a una variabile il risultato ottenuto dalla valutazione di un’espressione, per esempio in “circ ← 2 × r × pi” il risultato dell’espressione 2 × r × pi viene calcolato utilizzando i valori contenuti nelle variabili r e pi e il risultato viene poi assegnato alla variabile circ; la stessa variabile può comparire in entrambi i lati dell’istruzione di assegnamento, per esempio in “k ← k + 1” il valore contenuto in k viene utilizzato per trovare il valore dell’espressione k + 1 che viene memorizzato come nuovo valore di k. Assegnamento di valori a variabili Il valore assegnato a una variabile si sostituisce a quello che era presente in precedenza: il vecchio valore non potrà più essere recuperato. ……… Esempio: si ipotizzi di voler scambiare i valori contenuti in due variabili x e y. Soluzione proposta: doppio assegnamento del tipo x←y y←x per indicare che il valore di y deve essere copiato in x e che, nello stesso tempo, il valore di x sia trasferito in y. Le istruzioni però vengono eseguite in sequenza! Quindi l’assegnamento x ← y viene completato prima di iniziare y ← x. x y; y x; ……… x y 7 9 t0 7 9 t1 9 9 t2 9 9 t3 9 9 t4 x y tempo Assegnamento di valori a variabili Soluzione corretta: uso di una variabile aggiuntiva (tmp), come strumento di memorizzazione temporanea (“buffer”) del valore originariamente contenuto in x tmp ← x x←y y ← tmp ……… tmp x; x y; y tmp; In questo modo lo scambio avviene senza perdere i valori originari ……… tmp x y ?? 7 9 t0 7 7 9 t1 7 7 9 t2 7 7 9 t3 7 9 9 t4 7 9 9 t5 7 9 7 t6 tmp x y tempo Dati: Accesso dei programmi ai dati Come si indirizzano le celle di memoria? Un programma esegue operazioni su dati. Ogni dato elementare è memorizzato in una cella di memoria. Ogni cella di memoria ha un indirizzo fisico. Per “accedere” ad una cella di memoria il programma (e quindi il programmatore che lo “scrive”) dovrebbe quindi conoscere il suo indirizzo fisico. Il programmatore utilizza invece nomi simbolici per far riferimento ai dati (es., x, y, nome,...) detti “nomi” delle variabili o delle costanti, molto più semplici da gestire Un software apposito, in fase di esecuzione del programma, assocerà ad ogni nome simbolico un effettivo indirizzo di memoria. Tipo di un dato Un essere umano comprende “a vista” i tipi di dato sui quali lavora Conosce le operazioni che è lecito effettuare su di essi. Egli sa che non è possibile estrarre la radice quadrata di un’immagine, moltiplicare due parole (o almeno non nel senso matematico del termine) sottrarre una nota musicale da un’altra. Questo anche perché parole, numeri, note, ecc… vengono rappresentati utilizzando alfabeti e regole di composizione molto diversi tra di loro. Tipo di un dato Il nome di una costante o di una variabile è un aiuto mnemonico per il programmatore non riveste alcun significato per il calcolatore Un calcolatore “rappresenta” tutti i tipi di dati mediante sequenze di bit bisogna specificare in modo esplicito all’interno dell’elaborazione il tipo associato ad ogni dato Tipo di un dato Supponiamo che in una cella di memoria sia presente la parola binaria 01010011 a quale “tipo di dato” essa corrisponde? che tipo di operazioni possono essere effettuate su di essa Infatti la sequenza binaria 01010011 se interpretata come numero corrisponde al numero decimale 83 se interpretata come carattere corrisponde alla lettera S e, inoltre, potrebbe anche essere una parte di un disegno o di un brano musicale, ecc… o, ancora, potrebbe essere parte di un’istruzione (se in quella zona di RAM risiede un programma, ad es. Word). Tipo di un dato Per definire una variabile o una costante bisogna specificare il tipo di dato che essa assumerà. Tipo di un dato Il tipo di dato determina l’insieme dei valori che possono essere assunti dal dato. interi numeri reali Caratteri … Tutte le operazioni che è possibile effettuare sui dati. Somma, moltiplicazione Arrotondamento per eccesso/difetto Confronto alfabetico tra due caratteri … la quantità di memoria che il computer deve “dedicare”: un carattere, ad esempio, occupa 8 bit, mentre un numero intero spesso ne occupa 32 e un numero reale ne richiede 64. Tipi di dato Tipi di dato elementari (predefiniti): Integer (numero intero) Real (numero reale) Char (singolo carattere) Boolean (può valere VERO o FALSO) … Tipi di dato “composti” (costruiti a partire da tipi elementari) String (sequenza di caratteri) Array (Vettore o matrice) Record (gruppo di dati eterogenei) Text (File contenente testi) … UD 3.1b: Costrutti di un Algoritmo Dispense 1.2 I Costrutti di base Necessità di descrivere in modo chiaro e preciso “su foglio” le istruzioni e la sequenza operativa di un algoritmo Un qualsiasi algoritmo può essere rappresentato utilizzando unicamente i seguenti costrutti: Sequenza (realizzata tramite l’istruzione di assegnazione) Decisione binaria (realizzata tramite l’istruzione condizionale) Ciclo (realizzata tramite l’istruzione ciclica) I Costrutti di base E’ opportuno aggiungere un’altra tipologia di istruzione, che permette di scambiare dati tra l’algoritmo e l’esterno (lettura dati, scrittura risultati, visualizzazione dati intermedi). Tutte le altre istruzioni non aggiungono potere computazionale, ma servono per semplificare la scrittura della soluzione Istruzione di Assegnazione (Sequenza) Assegnazione: Istruzione che assegna il valore di un’espressione ad una variabile Sintassi: <Nome della Variabile> <Espressione> Istruzione di Assegnazione (Sequenza) Le espressioni corrispondono ad operazioni sui dati Un’espressione può coinvolgere nomi di variabili, costanti, operatori aritmetico-logici, ecc Esempi: x 3+4; y x+y-1; (dove x è una variabile) Esempio somma somma + 5 Si supponga che, inizialmente, somma contenga il valore 2 Passo 1: viene valutata innanzitutto l’espressione somma+5, cioè 2+5, cioè 7. Passo 2: Il risultato dell’espressione viene assegnato nuovamente alla variabile di nome “somma”, che quindi, alla fine dell’operazione, conterrà il numero 7. Istruzione condizionale (Decisione Binaria) 1. valuta una condizione (espressione booleana) 2. esegue, in alternativa, in base all’esito del confronto (la condizione è VERA) un primo insieme di istruzioni (racchiuse tra la coppia begin … end) (la condizione è FALSA) un secondo insieme di istruzioni (racchiuse tra la coppia begin … end) Istruzione condizionale (Decisione Binaria) Sintassi: if <Condizione> then begin <Istruzioni1> end else begin <Istruzioni2> end Se <Istruzioni1> o <Istruzioni2> sono composte da una sola istruzione, la coppia begin … end può essere omessa Istruzione ciclica (Ciclo a condiz. iniziale) 1. valuta una condizione (espressione booleana) 2. finchè la condizione si mantiene VERA: esegue un insieme di istruzioni e torna al passo 1 3. Quando la condizione diventa FALSA si esce dal ciclo La condizione può risultare falsa alla prima esecuzione: in questo caso l'algoritmo esce direttamente dal ciclo, senza aver mai eseguito le istruzioni interne. Istruzione ciclica (Ciclo a condiz. iniziale) Sintassi: while <Condizione> do begin <Lista Istruzioni> end Se <Lista istruzioni> è composta da una sola istruzione, la coppia begin … end può essere omessa