Algoritmi Strutture Dati Linguaggi e Programmi Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Problema: Prendere un Caffè al Distributore Università degli Studi di Udine Facoltà di Ingegneria CORSO DI LAUREA IN SCIENZE dell’ARCHITETTURA Elementi di Informatica – Algoritmi, Strutture Dati e Programmi – D. Gubiani 1 introdurre le monete per l’importo necessario 2 selezionare la quantità di zucchero 3 selezionare la bevanda desiderata 4 attendere che il distributore eroghi la bevanda 5 ritirare il resto 6 ritirare la bevanda 21 marzo 2011 D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 1 D. Gubiani Variabili Esempi di Algoritmi Formalismi per la Codifica – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Algoritmo 2 Variabili Esempi di Algoritmi Formalismi per la Codifica dal Problema all’Algoritmo Un algoritmo è la descrizione della soluzione di un problema espressa come un insieme di istruzioni che operando sui dati iniziali permette di ottenere il risultato che costituisce la soluzione del problema Più precisamente: un insieme ordinato di istruzioni non ambigue ed effettivamente computabili che, quando eseguito, produce un risultato e si arresta in un tempo finito Se il problema è complesso può essere scomposto in sottoproblemi, detti step D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 3 D. Gubiani Variabili Esempi di Algoritmi Formalismi per la Codifica – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Classe di Problemi e Variabili 4 Variabili Esempi di Algoritmi Formalismi per la Codifica Operazioni su Variabili Un algoritmo non risolve un unico problema ma una classe di problemi strutturalmente equivalenti, in cui cambiano solo i dati di partenza Assegnamento: corrisponde a introdurre un valore nel contenitore della variabile identificata dal nome, tale valore sostituisce il valore precedente Per questo motivo le istruzioni di un algoritmo fanno riferimento non direttamente ai valori ma a delle variabili, il cui valore può variare a seconda della situazione - nomevariavile ← valore Espressioni su variabili: il valore contenuto nelle variabili viene utilizzato per calcolare il risultato dell’espressione Esempi: Una variabile può essere intesa come un contenitore con un nome, che la identifica univocamente, e un valore, che corrisponde in ogni istante al dato contenuto In alcune situazione, ad ogni valore è associato anche un tipo - x←3 - y←x+1 - y←y∗x - permette di definire l’insieme dei valori che la variabile può assumere valori D. Gubiani – Algoritmi, Strutture Dati e Programmi – 5 D. Gubiani – Algoritmi, Strutture Dati e Programmi – 6 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Algoritmi Strutture Dati Linguaggi e Programmi Maggiore fra 2 Numeri, x e y Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Soluzione Iterativa) Soluzione possibile basata sull’osservazione che x è maggiore di y se x − y è maggiore di 0 n! = n ∗ (n − 1) ∗ ... ∗ 2 ∗ 1 1 leggere il valore dall’esterno e assegnarlo alla variabile n leggere il primo valore dall’esterno e assegnarlo alla variabile x 2 assegnare alla variabile fatt il valore 1 (fatt ← 1) leggere il secondo valore dall’esterno e assegnarlo alla variabile y 3 se n = 1, passare al passo 7 calcolare la differenza fra x e y e assegnarla alla variabile d (d ← x − y ) 4 4 valutare se d è maggiore di 0: se è vero passare al passo 6, se è falso passare al passo 5 assegnare alla variabile fatt il valore della variabile stessa moltiplicato per n (fatt ← fatt ∗ n) 5 decrementare di 1 la variabile n (n ← n − 1) 5 restituire “il numero maggiore è ” seguito dal contenuto di y e passare al passo 7 6 passare al passo 3 7 restituire il contenuto di fatt 8 terminare l’esecuzione 1 2 3 6 7 restituire “il numero maggiore è ” seguito dal contenuto di x terminare l’esecuzione D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 7 1 se n ≤ 1 n ∗ (n − 1)! se n > 1 1 leggere il valore dall’esterno e assegnarlo alla variabile n 2 se n = 1, vai al passo 4 3 restituire n ∗ FATTORIALE (n − 1) e passare al passo 5 4 restituire 1 5 terminare l’esecuzione D. Gubiani Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Rappresentazione mediante PseudoCodice Una metodologia comunemente utilizzata per descrivere algoritmi è la pseudocodifica: un linguaggio più vicino possibile a quello naturale - codifica di un insieme di istruzioni elementari - indentazione 9 D. Gubiani – Algoritmi, Strutture Dati e Programmi – Variabili Esempi di Algoritmi Formalismi per la Codifica Algoritmi Strutture Dati Linguaggi e Programmi PseudoCodice: Assegnamento e Condizionale 10 Variabili Esempi di Algoritmi Formalismi per la Codifica PseudoCodice: Cicli Assegnamento: Ciclo while: - assegna alla variabile n il valore v - n←v - mentre A è vera esegui B - while (A) do {B} Condizionale: Ciclo for: - se la condizione A è vera allora esegui B (altrimenti esegui C ) - if A then B [else C ] D. Gubiani 8 (1) – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi – Algoritmi, Strutture Dati e Programmi – Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Soluzione Ricorsiva) n! = D. Gubiani – Algoritmi, Strutture Dati e Programmi – - ripeti j − i + 1 volte B - for cont ← i to j do {B} 11 D. Gubiani – Algoritmi, Strutture Dati e Programmi – 12 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Algoritmi Strutture Dati Linguaggi e Programmi Rappresentazione mediante Diagrammi di Flusso Maggiore fra 2 Numeri, x e y - 1 Un linguaggio formale grafico spesso utilizzato per la codifica degli algoritmi è costituito dai diagrammi di flusso MAGGIORE read x read y d ← x −y if (d > 0) then { return x } else { return y } - insieme di blocchi che rappresentano le strutture comunemente utilizzate legate fra di loro da frecce che ne indicano l’ordine di esecuzione D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 13 D. Gubiani Variabili Esempi di Algoritmi Formalismi per la Codifica 14 Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Sol. Iterativa) - 1 FATTORIALE (n) fatt ← 1 while (n > 1) do { fatt ← fatt ∗ n n ← n−1 } return fatt MAGGIORE (x, y ) d ← x −y if (d > 0) then { return x } else { return y } – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 15 D. Gubiani Variabili Esempi di Algoritmi Formalismi per la Codifica 16 Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Sol. Ricorsiva) FATTORIALE (n) fatt ← 1 i ← 2 while (i ≤ n) do { fatt ← fatt ∗ i i ← i +1 } return fatt – Algoritmi, Strutture Dati e Programmi – – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Fattoriale di un Numero (Sol. Iterativa) - 2 D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Maggiore fra 2 Numeri, x e y - 2 D. Gubiani Variabili Esempi di Algoritmi Formalismi per la Codifica FATTORIALE (n) if (n > 1) then { return n ∗ FATTORIALE (n − 1) } else{ return 1 } 17 D. Gubiani – Algoritmi, Strutture Dati e Programmi – 18 Algoritmi Strutture Dati Linguaggi e Programmi Algoritmi Strutture Dati Linguaggi e Programmi Vettori Strutture Dati Diverse Strutture Dati Strutture dati statiche: Al crescere della complessità degli algoritmi l’impiego delle singole variabili diventa inefficiente Esempio: determinare il valore massimo fra 100 numeri - vettori e matrici - record Strutture dati dinamiche: - bisognerebbe definire 100 variabili distinte da confrontare due a due - liste - code e pile - alberi e grafi Strutture dati: aggregati organizzati di più variabili D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 19 D. Gubiani Algoritmi Strutture Dati Linguaggi e Programmi ... v [n − 1] – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 9 5 1 2 7 OUTPUT: permutazione degli elementi a10 , a20 ...an0 tali che a10 ≤ a20 ≤ ... ≤ an0 1 v [n] 21 D. Gubiani 2 5 7 9 – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Vettori Insertion Sort 22 Vettori Merge Sort INSERTION SORT (A) for j ← 2 to length(A) { key ← A[j] i ←j −1 while ((i > 0) and (A[i] > key )) do { A[i + 1] ← A[i] i ←i +1 } A[i + 1] ← key } D. Gubiani Vettori INPUT: sequenza di n numeri (a1 , a2 ...an ) - v [i] con i ∈ {1..n} D. Gubiani 20 Ordinamento di n numeri Un vettore (array) è un insieme ordinato di n elementi dello stesso tipo Una vettore è identificato da un nome v e ogni elemento è individuato univocamente da un indice i che indica la sua posizione v [2] – Algoritmi, Strutture Dati e Programmi – Vettori Vettori (array) v [1] Vettori – Algoritmi, Strutture Dati e Programmi – MERGE SORT (A, p, r ) if (p < r ) then { q ← int((p + r )/2) MERGE SORT (A, p, q) MERGE SORT (A, q + 1, r ) MERGE (A, p, q, r ) } 23 D. Gubiani – Algoritmi, Strutture Dati e Programmi – 24 Algoritmi Strutture Dati Linguaggi e Programmi Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Linguaggi e Programmi Pascal Esempi di Programmi Processo per la Creazione dei Programmi Per eseguire un algoritmo su un calcolatore è necessario descriverlo in un linguaggio formale, chiamato linguaggio di programmazione, interpretabile dal calcolatore stesso L’algoritmo è cosı̀ tradotto in un programma D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 25 D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Diversi Linguaggi di Programmazione - 1 26 Pascal Esempi di Programmi Diversi Linguaggi di Programmazione - 2 linguaggi interpretati: il testo di un programma scritto è elaborato da un interprete durante l’esecuzione del programma stesso: l’interprete legge un’istruzione, la traduce in un insieme di istruzioni macchina (il linguaggio macchina) direttamente eseguibili dalla CPU del calcolatore, poi passa a leggere l’istruzione successiva, la traduce, e cosı́ via. Un linguaggio a metà strada tra queste metodologie è Java - il codice sorgente viene compilato in un formato intermedio (chiamato bytecode), il quale a sua volta viene interpretato dalla Java Virtual Machine (JVM) - perl, php, ... linguaggi compilati: prevedono la compilazione, ossia la traduzione dell’intero programma in linguaggio macchina, prima dell’esecuzione del programma stesso - C, C++, Visual Basic, Pascal... D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 27 D. Gubiani Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Pascal 28 Pascal Esempi di Programmi Struttura generale di un Programma Pascal Sezione dell’Intestazione: specifica il nome del programma Pascal è un linguaggio di programmazione compilativo Alcune caratteristiche: Sezione delle Dichiarazioni: indicazione delle variabili con la specifica del relativo tipo di dato (insieme dei valori che la variabile può assumere) - creato da Niklaus Wirth per scopi didattici - chiamato Pascal in onore del matematico e filosofo francese Blaise Pascal, inventore della prima macchina calcolatrice automatica - prima implementazione del linguaggio divenne operativa nel 1970, ma raggiunse una discreta diffusione nel campo industriale nel 1973 - la sua evoluzione orientata ad oggetti è il Delphi - sintassi chiara e rigida - diversi compilatori gratuiti: Free Pascal, Lazarus, Dev-Pascal D. Gubiani – Algoritmi, Strutture Dati e Programmi – – Algoritmi, Strutture Dati e Programmi – Sezione Esecutiva: programma vero e proprio 29 D. Gubiani – Algoritmi, Strutture Dati e Programmi – 30 Algoritmi Strutture Dati Linguaggi e Programmi Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Tipi di Dato Dichiarazione delle Variabili e Assegnamento I tipi di dato determinano l’insieme dei valori che una variabile può assumere: - Pascal Esempi di Programmi I programmi Pascal richiedono la dichiarazione delle variabili con la specifica del relativo tipo di dato nella sezione var byte: numeri interi positivi su 1 byte word: numeri interi positivi su 2 byte shortint: numeri interi su 1 byte integer: numeri interi su 2 byte longint: numeri interi su 4 byte real: numeri reali su 6 byte boolean: valori booleani (1 bit) char: caratteri (1 byte) string: sequenza di caratteri (dimensione variabile a partire da 10 byte) D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Esempi di dichiarazioni: x : real; # dichiarazione di una variabile di tipo reale y 1, y 2 : integer ; # dichiarazione di due variabili di tipo intero c : char ; # dichiarazione di una variabili di tipo carattere Esempi di assegnamento: x := 10, 5; y 1 := y 2 − 10; c := 0 c 0 ; 31 D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Operatori Aritmetici e Logici 32 Pascal Esempi di Programmi Operatori di Confronto Operatori aritmetici: - + addizione - sottrazione ∗ moltiplicazione / divisione DIV quoziente della divisione tra interi MOD resto della divisione tra interi = uguale a <> diverso da > maggiore di >= maggiore o uguale a < minore Operatori logici <= minore o uguale a - OR disgiunzione logico - AND congiunzione logico - NOT negazione logica D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 33 D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Alcuni Controlli di Flusso: Condizionale 34 Pascal Esempi di Programmi Alcuni Controlli di Flusso: Ciclo WHILE Sintassi: Sintassi: IF condizione THEN istruzione1 ELSE istruzione2; WHILE condizione DO istruzione; Esempio: calcola la potenza n-esima di 2 (n≥0) x := 1; while n > 0 do BEGIN x := x ∗ 2; n := n − 1 END; Esempio: incrementa di 1 il valore di a se b è maggiore di 0, altrimenti lo decrementa di 1 if b > 0 then a := a + 1 else a := a − 1; D. Gubiani – Algoritmi, Strutture Dati e Programmi – 35 D. Gubiani – Algoritmi, Strutture Dati e Programmi – 36 Algoritmi Strutture Dati Linguaggi e Programmi Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Alcuni Controlli di Flusso: Ciclo REPEAT Pascal Esempi di Programmi Alcuni Controlli di Flusso: Ciclo FOR Sintassi: Sintassi: REPEAT istruzione UNTIL condizione; FOR a := ni TO nf DO istruzione Esempio: calcola la potenza n-esima di 2 (n≥1) Esempio: calcola la potenza n-esima di 2 (n≥0) x := 1; repeat x := x ∗ 2; n := n − 1 UNTIL n < 1; D. Gubiani x := 1; FOR i := 1 TO n DO x := x ∗ 2; – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 37 D. Gubiani Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Input e Output 38 Pascal Esempi di Programmi Vettori READ/READLN (abbreviazione Read Line): legge i dati di input da tastiera READLN (variabile) Sintassi: dichiarazione di un vettore nome vettore : array [1..n] of tipo dato; accesso ad uno specifico valore del vettore nome array [indice] WRITE/WRITELN (abbreviazione Write Line): stampa i dati di output sullo schermo WRITELN(output) Esempio: incremento di 1 dei primi 3 valori di un vettore for i := 1 to 3 do vettore[i] := vettore[i] + 1; Esempio: lettura di un carattere da tastiera e scrittura dello stesso a video Esempio: stampa di un vettore di lunghezza n for i := 1 to n do writeln(vettore[i]); WRITE (0 Inserisci un carattere : 0 ); READLN (c); WRITELN (0 Carattere inserito : 0 , c); D. Gubiani – Algoritmi, Strutture Dati e Programmi – – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 39 D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Procedure e Funzioni 40 Pascal Esempi di Programmi Procedure Definizione di una procedura: procedure nome procedura(parametri); var ... begin ... end; Una procedura/funzione è una porzione di codice riutilizzabile Entrambi possono prevedere parametri in ingresso: - passaggio parametro per valore - passaggio parametro per riferimento Le funzioni restituiscono un valore in uscita Invocazione di una procedura: nome procedura(variabili); D. Gubiani – Algoritmi, Strutture Dati e Programmi – 41 D. Gubiani – Algoritmi, Strutture Dati e Programmi – 42 Algoritmi Strutture Dati Linguaggi e Programmi Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Funzione Pascal Esempi di Programmi Variabili e Procedure/Funzioni Definizione di una funzione: function nome funzione(parametri) : tipo restituito; var ... begin ... nome funzione := ... ... end; Locali: definite all’interno di una procedure/funzioni, possono essere richiamate solo all’interno della specifica procedure/funzioni Globali: definite nel programma principale, possono essere utilizzate in tutto il programma, anche all’interno delle procedure/funzioni Invocazione di una funzione: x := nome funzione(variabili); D. Gubiani – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi 43 45 D. Gubiani Pascal Esempi di Programmi – Algoritmi, Strutture Dati e Programmi – – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Fattoriale Ricorsivo D. Gubiani 44 Fattoriale Iterativo – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi – Algoritmi, Strutture Dati e Programmi – Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Maggiore fra 2 Numeri D. Gubiani D. Gubiani 46 Pascal Esempi di Programmi Insertion sort 47 D. Gubiani – Algoritmi, Strutture Dati e Programmi – 48 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Merge sort D. Gubiani – Algoritmi, Strutture Dati e Programmi – 49