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