Algoritmi Strutture Dati Linguaggi e Programmi 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 29 marzo 2010 D. Gubiani – Algoritmi, Strutture Dati e Programmi– 1 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Problema: Prendere un Caffè al Distributore 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 D. Gubiani – Algoritmi, Strutture Dati e Programmi– 2 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica 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 Se il problema è complesso può essere scomposto in sottoproblemi, detti step Un algoritmo ben fatto deve terminare dopo un numero finito di passi D. Gubiani – Algoritmi, Strutture Dati e Programmi– 3 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica dal Problema all’Algoritmo D. Gubiani – Algoritmi, Strutture Dati e Programmi– 4 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Classe di Problemi e Variabili Un algoritmo non risolve un unico problema ma una classe di problemi strutturalmente equivalenti, in cui cambiano solo i dati di partenza 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 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 - permette di definire l’insieme dei valori che la variabile può assumere valori D. Gubiani – Algoritmi, Strutture Dati e Programmi– 5 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Operazioni su Variabili Assegnamento: corrisponde a introdurre un valore nel contenitore della variabile identificata dal nome, tale valore sostituisce il valore precedente - nomevariavile ← valore Espressioni su variabili: il valore contenuto nelle variabili viene utilizzato per calcolare il risultato dell’espressione Esempi: - x←3 - y←x+1 - y←y∗x D. Gubiani – Algoritmi, Strutture Dati e Programmi– 6 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Maggiore fra 2 Numeri, x e y Soluzione possibile basata sull’osservazione che x è maggiore di y se x − y è maggiore di 0 1 leggere il primo valore dall’esterno e assegnarlo alla variabile x 2 leggere il secondo valore dall’esterno e assegnarlo alla variabile y 3 calcolare la differenza fra x e y e assegnarla alla variabile d (d ← x − y ) 4 valutare se d è maggiore di 0: se è vero passare al passo 6, se è falso passare al passo 5 5 restituire “il numero maggiore è ” seguito dal contenuto di y e passare al passo 7 6 restituire “il numero maggiore è ” seguito dal contenuto di x 7 terminare l’esecuzione D. Gubiani – Algoritmi, Strutture Dati e Programmi– 7 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Soluzione Iterativa) n! = n ∗ (n − 1) ∗ ... ∗ 2 ∗ 1 1 leggere il valore dall’esterno e assegnarlo alla variabile n 2 assegnare alla variabile fatt il valore 1 (fatt ← 1) 3 se n = 1, passare al passo 7 4 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) 6 passare al passo 3 7 restituire il contenuto di fatt 8 terminare l’esecuzione D. Gubiani – Algoritmi, Strutture Dati e Programmi– 8 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Soluzione Ricorsiva) n! = 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 e Programmi– (1) 9 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 D. Gubiani – Algoritmi, Strutture Dati e Programmi– 10 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica PseudoCodice: Assegnamento e Condizionale Assegnamento: - assegna alla variabile n il valore v - n←v Condizionale: - se la condizione A è vera allora esegui B (altrimenti esegui C ) - if A then B [else C ] D. Gubiani – Algoritmi, Strutture Dati e Programmi– 11 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica PseudoCodice: Cicli Ciclo while: - finché A è vera esegui B - while (A) do {B} Ciclo for: - ripeti j − i + 1 volte B - for cont ← i to j do {B} D. Gubiani – Algoritmi, Strutture Dati e Programmi– 12 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Rappresentazione mediante Diagrammi di Flusso Un linguaggio formale grafico spesso utilizzato per la codifica degli algoritmi è costituito dai diagrammi di flusso - 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– 13 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Maggiore fra 2 Numeri, x e y - 1 MAGGIORE read x read y d ← x −y if (d > 0) then { return x } else { return y } D. Gubiani – Algoritmi, Strutture Dati e Programmi– 14 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Maggiore fra 2 Numeri, x e y - 2 MAGGIORE (x, y ) d ← x −y if (d > 0) then { return x } else { return y } D. Gubiani – Algoritmi, Strutture Dati e Programmi– 15 Algoritmi Strutture Dati Linguaggi e Programmi 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 D. Gubiani – Algoritmi, Strutture Dati e Programmi– 16 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Sol. Iterativa) - 2 FATTORIALE (n) fatt ← 1 i ← 2 while (i ≤ n) do { fatt ← fatt ∗ i i ← i +1 } return fatt D. Gubiani – Algoritmi, Strutture Dati e Programmi– 17 Algoritmi Strutture Dati Linguaggi e Programmi Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Sol. Ricorsiva) FATTORIALE (n) if (n > 1) then { return n ∗ FATTORIALE (n − 1) } else{ return 1 } D. Gubiani – Algoritmi, Strutture Dati e Programmi– 18 Algoritmi Strutture Dati Linguaggi e Programmi Vettori Strutture Dati Al crescere della complessità degli algoritmi l’impiego delle singole variabili diventa inefficiente Esempio: determinare il valore massimo fra 100 numeri - bisognerebbe definire 100 variabili distinte da confrontare due a due Strutture dati: aggregati organizzati di più variabili D. Gubiani – Algoritmi, Strutture Dati e Programmi– 19 Algoritmi Strutture Dati Linguaggi e Programmi Vettori Diverse Strutture Dati Strutture dati statiche: - vettori e matrici - record Strutture dati dinamiche: - liste - code e pile - alberi e grafi D. Gubiani – Algoritmi, Strutture Dati e Programmi– 20 Algoritmi Strutture Dati Linguaggi e Programmi Vettori Vettori (array) 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 [i] con i ∈ {1..n} v [1] D. Gubiani v [2] ... v [n − 1] – Algoritmi, Strutture Dati e Programmi– v [n] 21 Algoritmi Strutture Dati Linguaggi e Programmi Vettori Ordinamento di n numeri INPUT: sequenza di n numeri (a1 , a2 ...an ) 9 5 1 2 7 OUTPUT: permutazione degli elementi a10 , a20 ...an0 tali che a10 ≤ a20 ≤ ... ≤ an0 1 D. Gubiani 2 5 7 9 – Algoritmi, Strutture Dati e Programmi– 22 Algoritmi Strutture Dati Linguaggi e Programmi Vettori Insertion 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 – Algoritmi, Strutture Dati e Programmi– 23 Algoritmi Strutture Dati Linguaggi e Programmi Vettori Merge Sort 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 ) } D. Gubiani – Algoritmi, Strutture Dati e Programmi– 24 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Linguaggi e 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– 25 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Processo per la Creazione dei Programmi D. Gubiani – Algoritmi, Strutture Dati e Programmi– 26 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Diversi Linguaggi di Programmazione - 1 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. - 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– 27 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Diversi Linguaggi di Programmazione - 2 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) D. Gubiani – Algoritmi, Strutture Dati e Programmi– 28 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Pascal Pascal è un linguaggio di programmazione compilativo Alcune caratteristiche: - 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– 29 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Struttura generale di un Programma Pascal Sezione dell’Intestazione: specifica il nome del programma Sezione delle Dichiarazioni: indicazione delle variabili con la specifica del relativo tipo di dato (insieme dei valori che la variabile può assumere) Sezione Esecutiva: programma vero e proprio D. Gubiani – Algoritmi, Strutture Dati e Programmi– 30 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Tipi di Dato I tipi di dato determinano l’insieme dei valori che una variabile può assumere: - D. Gubiani 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) – Algoritmi, Strutture Dati e Programmi– 31 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Dichiarazione delle Variabili e Assegnamento I programmi Pascal richiedono la dichiarazione delle variabili con la specifica del relativo tipo di dato nella sezione var 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 ; D. Gubiani – Algoritmi, Strutture Dati e Programmi– 32 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Operatori Aritmetici e Logici Operatori aritmetici: - + addizione - sottrazione ∗ moltiplicazione / divisione DIV quoziente della divisione tra interi MOD resto della divisione tra interi Operatori logici - OR disgiunzione logico - AND congiunzione logico - NOT negazione logica D. Gubiani – Algoritmi, Strutture Dati e Programmi– 33 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Operatori di Confronto = uguale a <> diverso da > maggiore di >= maggiore o uguale a < minore <= minore o uguale a D. Gubiani – Algoritmi, Strutture Dati e Programmi– 34 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Alcuni Controlli di Flusso: Condizionale Sintassi: IF condizione THEN istruzione1 ELSE istruzione2; 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 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Alcuni Controlli di Flusso: Ciclo WHILE Sintassi: 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; D. Gubiani – Algoritmi, Strutture Dati e Programmi– 36 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Alcuni Controlli di Flusso: Ciclo REPEAT Sintassi: REPEAT istruzione UNTIL condizione; Esempio: calcola la potenza n-esima di 2 (n≥1) x := 1; repeat x := x ∗ 2; n := n − 1 UNTIL n < 1; D. Gubiani – Algoritmi, Strutture Dati e Programmi– 37 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Alcuni Controlli di Flusso: Ciclo FOR Sintassi: FOR a := ni TO nf DO istruzione Esempio: calcola la potenza n-esima di 2 (n≥0) x := 1; FOR i := 1 TO n DO x := x ∗ 2; D. Gubiani – Algoritmi, Strutture Dati e Programmi– 38 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Input e Output READ/READLN (abbreviazione Read Line): legge i dati di input da tastiera READLN (variabile) WRITE/WRITELN (abbreviazione Write Line): stampa i dati di output sullo schermo WRITELN(output) Esempio: lettura di un carattere da tastiera e scrittura dello stesso a video WRITE (0 Inserisci un carattere : 0 ); READLN (c); WRITELN (0 Carattere inserito : 0 , c); D. Gubiani – Algoritmi, Strutture Dati e Programmi– 39 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Vettori Sintassi: dichiarazione di un vettore nome vettore : array [1..n] of tipo dato; accesso ad uno specifico valore del vettore nome array [indice] Esempio: incremento di 1 dei primi 3 valori di un vettore for i := 1 to 3 do vettore[i] := vettore[i] + 1; Esempio: stampa di un vettore di lunghezza n for i := 1 to n do writeln(vettore[i]); D. Gubiani – Algoritmi, Strutture Dati e Programmi– 40 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Procedure e Funzioni 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 D. Gubiani – Algoritmi, Strutture Dati e Programmi– 41 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Procedure Definizione di una procedura: procedure nome procedura(parametri); var ... begin ... end; Invocazione di una procedura: nome procedura(variabili); D. Gubiani – Algoritmi, Strutture Dati e Programmi– 42 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Funzione Definizione di una funzione: function nome funzione(parametri) : tipo restituito; var ... begin ... nome funzione := ... ... end; Invocazione di una funzione: x := nome funzione(variabili); D. Gubiani – Algoritmi, Strutture Dati e Programmi– 43 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Variabili e Procedure/Funzioni 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 D. Gubiani – Algoritmi, Strutture Dati e Programmi– 44 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Maggiore fra 2 Numeri D. Gubiani – Algoritmi, Strutture Dati e Programmi– 45 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Fattoriale Iterativo D. Gubiani – Algoritmi, Strutture Dati e Programmi– 46 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Fattoriale Ricorsivo D. Gubiani – Algoritmi, Strutture Dati e Programmi– 47 Algoritmi Strutture Dati Linguaggi e Programmi Pascal Esempi di Programmi Insertion sort 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