Università degli Studi di Udine Facoltà di Ingegneria CORSO DI LAUREA IN SCIENZE dell ARCHITETTURA Elementi di Informatica Algoritmi, e Programmi D. Gubiani 29 marzo 2010 D. Gubiani Algoritmi, e Programmi 1
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, e Programmi 2
Algoritmo Algoritmi Variabili Esempi di Algoritmi Formalismi per la Codifica 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, e Programmi 3
Variabili Esempi di Algoritmi Formalismi per la Codifica dal Problema all Algoritmo D. Gubiani Algoritmi, e Programmi 4
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, e Programmi 5
Operazioni su Variabili Variabili Esempi di Algoritmi Formalismi per la Codifica 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, e Programmi 6
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, e Programmi 7
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, e Programmi 8
Variabili Esempi di Algoritmi Formalismi per la Codifica Fattoriale di un Numero (Soluzione Ricorsiva) { 1 se n 1 n! = n (n 1)! se n > 1 (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, e Programmi 9
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, e Programmi 10
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, e Programmi 11
PseudoCodice: Cicli Variabili Esempi di Algoritmi Formalismi per la Codifica 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, e Programmi 12
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, e Programmi 13
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, e Programmi 14
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, e Programmi 15
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, e Programmi 16
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, e Programmi 17
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, e Programmi 18
Algoritmi Vettori 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, e Programmi 19
Diverse Vettori Strutture dati statiche: - vettori e matrici - record Strutture dati dinamiche: - liste - code e pile - alberi e grafi D. Gubiani Algoritmi, e Programmi 20
Vettori (array) Algoritmi Vettori 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] v[2]... v[n 1] v[n] D. Gubiani Algoritmi, e Programmi 21
Ordinamento di n numeri Vettori INPUT: sequenza di n numeri (a 1, a 2...a n ) 9 5 1 2 7 OUTPUT: permutazione degli elementi a 1, a 2...a n tali che a 1 a 2... a n 1 2 5 7 9 D. Gubiani Algoritmi, e Programmi 22
Insertion Sort Algoritmi Vettori 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, e Programmi 23
Merge Sort Algoritmi Vettori 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, e Programmi 24
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, e Programmi 25
Processo per la Creazione dei Programmi D. Gubiani Algoritmi, e Programmi 26
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,... D. Gubiani Algoritmi, e Programmi 27
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, e Programmi 28
Algoritmi è un linguaggio di programmazione compilativo Alcune caratteristiche: - creato da Niklaus Wirth per scopi didattici - chiamato in onore del matematico e filosofo francese Blaise, 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, Lazarus, Dev- D. Gubiani Algoritmi, e Programmi 29
Struttura generale di un Programma 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, e Programmi 30
Tipi di Dato Algoritmi I tipi di dato determinano l insieme dei valori che una variabile può assumere: - 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, e Programmi 31
Dichiarazione delle Variabili e Assegnamento I programmi 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 y1, y2 : integer; # dichiarazione di due variabili di tipo intero c : char; # dichiarazione di una variabili di tipo carattere Esempi di assegnamento: x := 10, 5; y1 := y2 10; c := c ; D. Gubiani Algoritmi, e Programmi 32
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, e Programmi 33
Operatori di Confronto = uguale a <> diverso da > maggiore di >= maggiore o uguale a < minore <= minore o uguale a D. Gubiani Algoritmi, e Programmi 34
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, e Programmi 35
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, e Programmi 36
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, e Programmi 37
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, e Programmi 38
Input e Output Algoritmi 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 ( Inserisci un carattere : ); READLN (c); WRITELN ( Carattere inserito :, c); D. Gubiani Algoritmi, e Programmi 39
Vettori Algoritmi 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, e Programmi 40
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, e Programmi 41
Procedure Algoritmi Definizione di una procedura: procedure nome procedura(parametri); var... begin... end; Invocazione di una procedura: nome procedura(variabili); D. Gubiani Algoritmi, e Programmi 42
Funzione Algoritmi 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, e Programmi 43
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, e Programmi 44
Maggiore fra 2 Numeri D. Gubiani Algoritmi, e Programmi 45
Fattoriale Iterativo D. Gubiani Algoritmi, e Programmi 46
Fattoriale Ricorsivo D. Gubiani Algoritmi, e Programmi 47
Insertion sort Algoritmi D. Gubiani Algoritmi, e Programmi 48
Merge sort Algoritmi D. Gubiani Algoritmi, e Programmi 49