Elementi di Informatica Problema: Prendere un Caff`e al Distributore

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