Fondamenti di Informatica - Università degli Studi di Parma

Alcune domande fondamentali
Dipartimento di Ingegneria dell’Informazione
Università degli Studi di Parma
Fondamenti di Informatica
n
L’elaboratore come strumento in grado di
eseguire un’insieme di azioni elementari che
vengono richieste tramite istruzioni scritte in
un particolare linguaggio
2
Algoritmi e Programmazione
2
2
Quali istruzioni esegue un elaboratore?
Quali problemi può risolvere un elaboratore?
Che ruolo ha il linguaggio di programmazione?
Monica Mordonini
FI - Algoritmi e Programmazione
Il problema di fondo
Algoritmo
Descrizione di un problema
þindividuazione di un algoritmo
n
Ø
Ø
Ø
n
n
come si costruisce la soluzione ad un problema?
Quale è il giusto punto di partenza?
Quali metodologie o tecniche utilizzare?
n
Dall'arabo al-Khuwarizmi a sua volta dal greco
aritmhós
Un algoritmo è un metodo generale che risolve in
un tempo finito e con una sequenza finita di
mosse qualsiasi istanza di un dato problema di
elaborazione.
Problemi:
q
q
q
FI - Algoritmi e Programmazione
FI - Algoritmi e Programmazione
4
Programma
n
Fase di scrittura di un algoritmo attraverso un
insieme ordinato di istruzioni scritte in un
qualche linguaggio di programmazione, che
specificano le azioni da completare
n
n
n
n
FI - Algoritmi e Programmazione
risolvibili
non-risolvibili
non-affrontabili
3
Codifica di un algoritmo
n
2
5
Testo scritto in accordo alla sintassi e alla semantica di
un linguaggio di programmazione
Un programma può non essere un algoritmo (basta che la
sequenza di mosse non sia finita cioè che il programma
non termini)...
... E tuttavia può essere molto utile (es. gestione
semafori)
Un programma rappresenta l’insieme delle istruzioni che
descrivono un processo espresse in un qualche
linguaggio
Un processo trasforma un insieme di dati iniziali nei
risultati finali mediante una successione di azioni
elementari
FI - Algoritmi e Programmazione
6
1
Esecuzione
n
n
Elementi di un algoritmo
L’esecuzione delle azioni nell’ordine
specificato dall’algoritmo consente di ottenere
a partire dai dati in ingresso i risultati che
risolvono il problema
Problema : þ algoritmo þ programma
metodo
risolutivo
q
q
q
q
n
q
q
q
Condurre un'attenta analisi del problema ed
eventualmente suddividere il problema in piccoli
sottoproblemi.
Individuare i possibili ingressi e precisare le uscite
(definizione dei dati).
Definire completamente e dettagliatamente la
sequenza dei passi che portano alla soluzione.
FI - Algoritmi e Programmazione
10
Il crivello di Eratostene
n
Possiamo “trovare” algoritmi anche per la
risoluzione di problemi non strettamente informatici
Esempi:
q
8
Per definire un algoritmo è necessario:
9
Algoritmo
n
FI - Algoritmi e Programmazione
n
Finitezza: composto da un numero finito di passi elementari.
Non ambiguità (determinismo): i risultati non variano in
funzione della macchina/persona che esegue l'algoritmo.
Realizzabilità: deve essere eseguibile con le risorse a
disposizione.
Efficienza (auspicabile): eseguire il numero minimo di
operazioni
FI - Algoritmi e Programmazione
n
Processo o anche esecuzione: sequenza
ordinata di passi
Algoritmo
Un algoritmo deve avere le seguenti proprietà :
q
n
7
Algoritmo
q
Passi elementari: azioni atomiche non
scomponibili in azioni piú semplici
linguaggio di
programmazione
FI - Algoritmi e Programmazione
n
n
1) Si costruisca una sequenza ordinata dei numeri fra
2 e n.
2) Si estragga il primo numero dalla sequenza. E’
necessariamente un numero primo.
3) Si eliminino dalla sequenza tutti i multipli del
numero estratto al passo 2).
4) se la sequenza non e’ vuota si torna la passo 2)
altrimenti si termina.
Spiegare un percorso stradale
Istruzioni per il montaggio di un mobile
Istruzioni per l’esecuzione di una torta
Un algoritmo può non essere l’unica soluzione al
problema
FI - Algoritmi e Programmazione
Si vogliono trovare tutti i numeri primi
compresi fra 2 e n (In modo efficiente).
11
FI - Algoritmi e Programmazione
12
2
Il crivello di Eratostene: esempio
Il crivello di Erastone
Sequenza iniziale (da 2 a 20):
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20
2 e’ primo lo elimino con tutti i suoi multipli:
3,5,7,9,11,13,15,17,19
3 e’ primo lo elimino con tutti i suoi multipli:
5,7,11,13,17,19
5 e’ primo lo elimino con tutti i suoi multipli:
…
19 e’ primo, la sequenza e’ vuota, termino.
n
n
FI - Algoritmi e Programmazione
q
q
q
q
13
Algoritmo di Euclide
n
n
Algoritmo
Finito
Non ambiguo
Realizzabile
Efficiente (si spera)
FI - Algoritmi e Programmazione
14
Algoritmo di Euclide
Calcola il massimo comun divisore fra due
interi positivi m ed n (supponiamo che
n=
m, altrimenti li possiamo scambiare).
L’ algoritmo si compone di 3 passi ripetuti
ciclicamente fino ad una condizione di
arresto:
FI - Algoritmi e Programmazione
n
n
n
Passo E1 {ricerca del resto} : Sia m = n. Si
divide m per n. Sia r il resto.
Allora 0 =
r < n.
Passo E2 {r = 0?} : Se r = 0 l’ algoritmo e’
terminato e n e’ la risposta finale.
Passo E3 {scambio} : Se r ? 0 si operano gli
scambi m ? n e n ? r. Si torni al passo E1.
15
Algoritmo di Euclide: esempio
FI - Algoritmi e Programmazione
Algoritmo di Euclide: finitezza
n
Si voglia l’ MCD fra 30 e 45 (I due numeri vanno scambiati)
m
n
r
45
30
15
30
15
0
16
n
Poiche’ al passo E1 {ricerca del resto} si ha
senpre 0 = r < n, ad ogni scambio il valore di
n decresce.
Dopo un numero finito di passi si
raggiungera` la condizione r = 0, e la
terminazione dell’ algoritmo.
Poiche’ il resto r = o, l’ultimo valore per n e’ l’ MCD
FI - Algoritmi e Programmazione
17
FI - Algoritmi e Programmazione
18
3
Algoritmo di Euclide
Algoritmo di Euclide: correttezza
n
n
n
n
Ad ogni passo abbiamo che m = q n + r (con
q intero).
Se r ?0 ogni divisore di m,n divide anche
r=m-qn. D’altra parte anche ogni divisore di
n,r divide m=qn+r.
In pratica la coppia m,n primo e dopo lo
scambio m ? n e n ? r hanno lo stesso
MCD.
Se r=0 l’ algoritmo termina e n e’ l’MCD.
FI - Algoritmi e Programmazione
n
n
19
Calcolo MCD modo 2
FI - Algoritmi e Programmazione
Problema: dati due numeri determinare il
loro massimo comune denominatore:
q
q
q
q
q
q
q
21
Algoritmo
n
Problema: dati due numeri determinare il loro
massimo comun denominatore
q
scomporre in fattori primi i due numeri
considerare solo fattori comuni
prendere quelli con esponente piú piccolo
moltiplicarli tra loro
FI - Algoritmi e Programmazione
20
Calcolo MCD modo 3
n
n
L’algoritmo descritto non è l’unico per
risolvere il problema del MCD
Ma è il più efficiente se a priori non conosco
nulla dei due numeri
costruire insieme divisori primo numero
costruire insieme divisori secondo numero
costruire intersezione fra i due insiemi
individuare nell'intersezione l'elemento piú grande
FI - Algoritmi e Programmazione
22
Diagramma di Flusso
(Flow-Chart)
Per realizzare un algoritmo con un
calcolatore occorre rappresentare la
sequenza di passi che portano alla sua
soluzione con istruzioni appartenenti ad un
linguaggio di programmazione.
FI - Algoritmi e Programmazione
n
n
n
23
I diagrammi di flusso sono un formalismo
grafico per descrivere gli algoritmi.
I diagrammi di flusso scompongono in passi
successivi gli algoritmi.
Un diagramma di flusso è una descrizione più
efficace e meno ambigua di una descrizione
a parole.
FI - Algoritmi e Programmazione
24
4
Diagrammi di flusso
n
Diagramma di flusso
Le operazioni su cui si basa un diagramma di
flusso
q
q
q
q
q
q
n
Ingresso/Uscita dati
Trasferimento di informazione (Assegnamenti)
Calcolo di espressioni aritmetiche e logiche
Assunzione di decisioni
Esecuzione di iterazioni (Cicli)
Possono contenere costanti e variabili
FI - Algoritmi e Programmazione
q
q
FI - Algoritmi e Programmazione
I
I
Si/No
No/Si
n
No/Si
n
No/Si
While - Do
Si compone di sequenze, decisioni (if then, if
then else) e cicli (while-do, repeat until).
Ogni diagramma ha esattamente un ingresso
ed una uscita.
Ogni azione puo essere
q
Si/No
O
26
Programmazione Strutturata
n
Si/No
Nodi
Archi
25
Strutture di Controllo
I
Un diagramma di flusso è costituito da due
tipi di entità:
O
Repeat - Until
O
If - Then - Else
FI - Algoritmi e Programmazione
q
una azione semplice
una azione composta da altri diagrammi
strutturati
27
Tipi di Nodi
FI - Algoritmi e Programmazione
28
Esempio: Somma di N Numeri
Start
Start
Var1
Var1 ← Espr1
Inizio
Lettura dati
Elaborazione / Assegnamento
Stop
Var1
Fine
Scrittura dati
Si
No
Espr1
Espr1
Espr1
Espr1
Espr1
Espr1
=
≠
>
≥
<
≤
I<N
Si
N
Somma ← Somma + Var1
I←I+1
Espr2
Espr2
Espr2
Espr2
Espr2
Espr2
I←0
Somma ← 0
Somma
Decisione
FI - Algoritmi e Programmazione
No
Stop
29
FI - Algoritmi e Programmazione
30
5
Esempio: Somma di Tre Numeri
Programmazione Top-Down
n
Start
Var1
Somma ← Var1 +Var2 + Var3
La programmazione top-down è una tecnica
di programmazione per la realizzazione di
programmi con la scomposizione iterativa di
un problema in sotto-problemi.
Somma
Var2
Stop
Var3
FI - Algoritmi e Programmazione
31
Tecniche di programmazione
n
32
Programmazione Top-Down
n
Programmazione top-down:
scomposizione iterativa del problema in
sottoproblemi
q i sottoproblemi devono essere indipendenti ed
avere interfacce ben definite
q visibilità dei dettagli di ogni sottoproblema solo
all’interno del sottoproblema stesso
q
FI - Algoritmi e Programmazione
FI - Algoritmi e Programmazione
La programmazione top-down si presta molto bene
per la definizione di algoritmi con i diagrammi di
flusso:
q
q
q
All’inizio il diagramma di flusso è rappresentato da un nodo
che rappresenta la soluzione al problema.
Questo nodo viene scomposto in una rete di nodi in modo
iterativo.
La scomposizione termina quando i singoli nodi possono
essere rappresentati da semplici sequenze di istruzioni del
linguaggio di programmazione scelto.
33
Esempio: Somma di Tre Numeri
FI - Algoritmi e Programmazione
34
Esempio: Somma di Tre Numeri
Start
Start
Somma i tre numeri
Inizializzazione
Leggi e somma i tre numeri
Stampa la somma
Stop
Stop
FI - Algoritmi e Programmazione
35
FI - Algoritmi e Programmazione
36
6
Esempio: Somma di N Numeri
Start
No
I<N
N
I←0
Somma ← 0
Problema della ricorsione
Si
Somma ← Somma + Var1
I←I+1
Somma
Stop
FI - Algoritmi e Programmazione
37
Il calcolo del fattoriale
n
Il calcolo del fattoriale
La funzione fattoriale, molto usata nel calcolo
combinatorio, è così definita
n
Vediamo di capire cosa significa…
0! = 1
1! = 1(1-1)! = 1·0! = 1·1 = 1
2! = 2(2-1)! = 2·1! = 2·1 = 2
3! = 3(3-1)! = 3·2! = 3·2·1 = 6
4! = 4(4-1)! = 4·3! = 4·3·2·1 = 24
5! = 5(5-1)! = 5·4! = 5·4·3·2·1 = 120
n
Quindi, per ogni n intero positivo, il fattoriale di n è il
prodotto dei primi n numeri interi positivi
se n = 0
1
n!= 
n( n − 1)! se n > 0
dove n è un numero intero non negativo
FI - Algoritmi e Programmazione
39
La ricorsione nella programmazione
FI - Algoritmi e Programmazione
In un programma…
n
n
n
Si invoca un metodo mentre si esegue lo stesso
metodo
è un paradigma di programmazione che si chiama
factorial(1) invoca factorial(0)
factorial(0) restituisce 1
factorial(1) restituisce 1
e un metodo che ne faccia uso si chiama
factorial(2) restituisce 2
factorial(3) restituisce 6
metodo ricorsivo
La ricorsione è uno strumento molto potente per
realizzare alcuni algoritmi, ma è anche fonte di molti
errori di difficile diagnosi
FI - Algoritmi e Programmazione
Vediamo la sequenza usata per calcolare 3!
si invoca factorial(3)
factorial(3) invoca factorial(2)
factorial(2) invoca factorial(1)
ricorsione
n
40
41
n
Si crea quindi una lista LIFO (uno stack ) di
metodi “in attesa”, che si allunga e che poi si
accorcia fino ad estinguersi
FI - Algoritmi e Programmazione
42
7
La ricorsione
n
n
La ricorsione
n
Per capire come utilizzare correttamente la
ricorsione, vediamo innanzitutto come funziona
Quando un metodo ricorsivo invoca se stesso, la
macchina virtuale esegue le stesse azioni che
vengono eseguite quando viene invocato un
metodo qualsiasi
q sospende l’esecuzione del metodo invocante
q esegue il metodo invocato fino alla sua
terminazione
q riprende l’esecuzione del metodo invocante dal
punto in cui era stata sospesa
FI - Algoritmi e Programmazione
n
43
La ricorsione: caso base
n
q
q
FI - Algoritmi e Programmazione
n
il metodo ricorsivo deve fornire la soluzione
del problema in almeno un caso particolare,
senza ricorrere ad una chiamata ricorsiva
tale caso si chiama caso base della ricorsione
nel nostro esempio, il caso base era
Seconda regola
q
q
if (n == 0)
return 1;
q
n
in particolare, che arrivi a conclusione in un
numero finito di passi
FI - Algoritmi e Programmazione
n
46
Invece, se
q
q
ad ogni invocazione il problema diventa
sempre più semplice e si avvicina al caso base
la soluzione del caso base non richiede
ricorsione
allora certamente la soluzione viene
calcolata in un numero finito di passi, per
quanto complesso possa essere il
problema
Si potrebbe pensare che le chiamate
ricorsive si possano succedere una dopo
l’altra, all’infinito
FI - Algoritmi e Programmazione
il concetto di “problema più semplice” varia di volta in
volta: in generale, bisogna avvicinarsi ad un caso
base
La ricorsione: un algoritmo?
Le regole appena viste sono fondamentali
per poter dimostrare che la soluzione
ricorsiva di un problema sia un algoritmo
q
q
45
La ricorsione: un algoritmo?
n
il metodo ricorsivo deve effettuare la chiamata
ricorsiva dopo aver semplificato il problema
nel nostro esempio, per il calcolo del fattoriale di n si
invoca la funzione ricorsivamente per conoscere il
fattoriale di n-1, cioè per risolvere un problema più
semplice
if (n > 0)
return n * factorial(n - 1);
a volte ci sono più casi base, non è necessario
che sia unico
FI - Algoritmi e Programmazione
44
La ricorsione: passo ricorsivo
Prima regola
q
In ogni caso, anche se il meccanismo di
funzionamento della ricorsione può sembrare
complesso, la chiave per un suo utilizzo proficuo
è
q dimenticarsi come funziona la ricorsione, ma
sapere come vanno scritti i metodi ricorsivi
perché il tutto funzioni!
Esistono infatti due regole ben definite che vanno
utilizzate per scrivere metodi ricorsivi che
funzionino
47
FI - Algoritmi e Programmazione
48
8
Ricorsione infinita
n
q
q
n
se manca il caso base, il metodo ricorsivo continua ad
invocare se stesso all’infinito
se il problema non viene semplificato ad ogni
invocazione ricorsiva , il metodo ricorsivo continua ad
invocare se stesso all’infinito
Dato che la lista dei metodi “in attesa” si allunga
indefinitamente, l’ambiente runtime esaurisce la
memoria disponibile per tenere traccia di questa
lista, ed il programma termina con un errore
FI - Algoritmi e Programmazione
49
Torri di Hanoi: regole
n
Torri di Hanoi: regole
Il rompicapo è costituito da tre pile di dischi (“torri”)
allineate
q
q
n
Situazione iniziale
Situazione finale
all’inizio tutti i dischi si trovano sulla pila di sinistra
alla fine tutti i dischi si devono trovare sulla pila di destra
I dischi sono tutti di dimensioni diverse e quando si
trovano su una pila devono rispettare la seguente
regola
q
nessun disco può avere sopra di sé dischi più grandi
FI - Algoritmi e Programmazione
51
Torri di Hanoi: regole
n
Progetto: Torri di Hanoi
Non tutti i metodi ricorsivi realizzano algoritmi
FI - Algoritmi e Programmazione
Algoritmo di soluzione
Per risolvere il rompicapo bisogna spostare un
disco alla volta
q un disco può essere rimosso dalla cima della torre
ed inserito in cima ad un’altra torre
n non può essere “parcheggiato” all’esterno…
q in ogni momento deve essere rispettata la regola
vista in precedenza
n nessun disco può avere sopra di sé dischi
più grandi
n
n
n
n
FI - Algoritmi e Programmazione
52
53
Per il rompicapo delle Torri di Hanoi è noto un
algoritmo di soluzione ricorsivo
Il problema generale consiste nello spostare n dischi
da una torre ad un’altra, usando la terza torre come
deposito temporaneo
Per spostare n dischi da una torre all’altra si
suppone di saper spostare n-1 dischi da una torre
all’altra, come sempre si fa nella ricorsione
Per descrivere l’algoritmo identifichiamo le torri con i
numeri interi 1, 2 e 3
FI - Algoritmi e Programmazione
54
9
Algoritmo ricorsivo
n
n
Algoritmo ricorsivo
Il caso base si ha quando n vale 1, in questo
caso possiamo spostare liberamente il disco da
una torre ad un’altra
Per spostare n dischi dalla torre 1 alla torre 3
n
n
1 gli n-1 dischi in cima alla torre 1 vengono spostati sulla
torre 2, usando la torre 3 come deposito temporaneo (si
usa una chiamata ricorsiva, al termine della quale la
torre 3 rimane vuota)
2 il disco rimasto nella torre 1 viene portato nella torre 3
3 gli n-1 dischi in cima alla torre 2 vengono spostati sulla
torre 3, usando la torre 1 come deposito temporaneo (si
usa una chiamata ricorsiva, al termine della quale la
torre 1 rimane vuota)
FI - Algoritmi e Programmazione
Si basa sul Principio di induzione
Il principio di induzione dice che una
proprietà è vera per qualsiasi valore di n
se
q
q
55
è vera per n = 1, e
nell’ipotesi che sia vera per un dato valore di n
= n’ siamo capaci di dimostrare che è vera
per n = n’ +1
FI - Algoritmi e Programmazione
56
La “Torre di Hanoi”
Algoritmo Hanoi(n, da, a, int)
input: il numero di dichi n, il
perno di partenza, di arrivo e
intermedio
output: le mosse necessarie
if n = 1 then
muovi (1, da, a)
else
hanoi (n-1, da, int, a)
muovi (n, da, a)
hanoi (n-1, int, a, da)
FI - Algoritmi e Programmazione
1
10
30
2
10
20
1
30
20
3
10
30
1
20
10
2
20
30
1
10
30
mosse
10
20
57
30
FI - Algoritmi e Programmazione
Algoritmo ricorsivo
n
n
FI - Algoritmi e Programmazione
58
59
Si può dimostrare che il numero di mosse
necessarie per risolvere il rompicapo con
l’algoritmo proposto è pari a:
2n – 1
Il tempo necessario alla soluzione è
proporzionale al numero di mosse (ogni mossa
richiede un tempo costante) cioe’:
T(n) = 2n – 1
FI - Algoritmi e Programmazione
60
10
La torre di Brahama
n
n
Quando finirà il mondo?
Torre di Hanoi con 64 dischi
Una leggenda narra che alcuni monaci
buddisti in un tempio dell’Estremo Oriente
siano da sempre impegnati nella soluzione
del rompicapo, spostando fisicamente i loro
64 dischi da una torre all’altra, consapevoli
che quando avranno terminato il mondo finirà
FI - Algoritmi e Programmazione
Dipende..
61
Torri di Hanoi: la leggenda
n
Sono necessarie 2 64 − 1 mosse, che sono circa 16 miliardi di
miliardi di mosse… cioè circa
18
Linguaggi di programmazione
1.6 × 10
n
Supponendo che i monaci facciamo una mossa ogni minuto,
essi fanno circa 500000 mosse all’anno, quindi il mondo finirà
tra circa 30 mila miliardi di anni…
n
Un processore ad 1GHz che fa una mossa ad ogni intervallo
di clock (un miliardo di mosse al secondo…) impiega 16
miliardi di secondi, che sono circa 500 anni...
FI - Algoritmi e Programmazione
63
Linguaggi di Programmazione
n
n
2
2
Linguaggi di Programmazione: Sintassi
& Semantica
n
Un linguaggio di programmazione è una
notazione formale per descrivere algoritmi
Un programma è la descrizione di un
algoritmo in un particolare linguaggio di
programmazione
Quali “parole chiave”
Quali meccanismi di combinazione?
FI - Algoritmi e Programmazione
Sintassi: l’insieme di regole formali per la scrittura
di programmi in un linguaggio, che dettano le
modalità per costruire frasi corrette nel linguaggio
stesso
n
Semantica: l’insieme dei significati da attribuire
alle frasi (sintatticamente corrette) costruite nel
linguaggio .
n
n.b. Una frase può essere sintatticamente corretta
e tuttavia non avere significato
65
FI - Algoritmi e Programmazione
66
11
Sintassi e Semantica
n
n
Sintassi
Dopo la definizione di un linguaggio (con
sintassi e semantica) serve un sistema che
possa eseguire i programmi scritti in tale
linguaggio
Si parla di implementazione di un linguaggio
q
67
Grammatica
FI - Algoritmi e Programmazione
q
q
q
n
un alfabeto di simboli terminal (l'alfabeto del linguaggio)
un alfabeto di simboli non terminali
un simbolo iniziale S (o assioma)
un insieme finito di regole sintattiche
Imperativi
Funzionali
q Dichiarativi
q
n
69
Linguaggi di Programmazione
FI - Algoritmi e Programmazione
n
q
q
n
Operazioni molto elementari.
Diverse per ogni processore.
Scritte in linguaggio binario
Una prima evoluzione sono i linguaggi
assemblativi che sostituiscono i codici binari
con codici simbolici.
q
q
q
Sono più orientati alla macchina che ai
problemi da trattare.
ancora orientati alla macchina e non ai problemi
più immediati da utilizzare
definiscono variabili, simboli
START:
EQUAL:
FI - Algoritmi e Programmazione
70
Linguaggi di Programmazione
I linguaggi macchina forniscono solo le
operazioni che l'elaboratore può eseguire:
q
Tutti basati sulla traduzione nell'unico
linguaggio eseguibile dal calcolatore:
il Linguaggio Macchina
Le frasi di un linguaggio di programma-zione sono dette
programmi
FI - Algoritmi e Programmazione
n
Diversi tipi di linguaggi:
q
Data una grammatica, il linguaggio generato è
definito come l'insieme delle frasi derivabili a partire
dall'assioma S
q
68
Linguaggi di Programmazione
La grammatica è definita da:
q
n
n
Per definire la sintassi di un linguaggio, è
necessario definire le grammatiche
La grammatica è un insieme di regole che
servono per costruire una frase
generalmente è un traduttore verso il linguaggio
dell’elaboratore
FI - Algoritmi e Programmazione
n
n
71
FI - Algoritmi e Programmazione
MOV
CMP
JZ
INT
RET
MOV
AX, BX
AX, 12h
EQUAL
21h
BL, 82h
72
12
Linguaggi di Programmazione
n
Linguaggi di Programmazione
I linguaggi macchina e i linguaggi
assemblativi sono detti linguaggi a basso
livello.
n
q
q
n
FI - Algoritmi e Programmazione
q
q
q
n
FI - Algoritmi e Programmazione
n
Linguaggi imperativi
Linguaggi logici
Linguaggi funzionali
Linguaggi orientati agli oggetti
n
Un linguaggio imperativo è legato all’architettura
della macchina di Von Neumann, ma ad un livello di
astrazione vicino a quello dei diagrammi di flusso.
Un programma è una sequenza di istruzioni in cui:
q
Ognuno provvede le forme espressive appropriate
per alcuni problemi specifici.
q
n
q
q
75
Linguaggi Imperativi
n
n
n
trasferimento dati
operazioni aritmetiche
alterazione del flusso del programma
FI - Algoritmi e Programmazione
76
Linguaggi Logici
Le operazioni che effettuano le istruzioni si basano
sul concetto di variabile.
Una variabile è una astrazione del concetto di
locazione di memoria in cui può essere assegnato,
letto e modificato un valore.
Il C, Fortran, Pascal, Cobol e Basic sono i linguaggi
imperativi più diffusi.
n
Basati sulla logica
q
q
n
77
obiettivo: formalizzare il ragionamento
caratterizzati da meccanismi deduttivi
Programmare significa:
q
q
FI - Algoritmi e Programmazione
Le istruzioni vengono eseguite in sequenza.
La sequenza può essere alterata con istruzioni di salto.
Eseguono 3 tipi di operazioni:
q
FI - Algoritmi e Programmazione
74
Linguaggi Imperativi
Esistono diversi tipi di linguaggi ad alto livello:
q
La descrizione del problema in modo intuitivo,
dimenticandosi che verranno eseguiti da un calcolatore.
Una astrazione rispetto al calcolatore su cui verrà eseguito
il programma.
Ma devono essere tradotti in linguaggio macchina.
73
Linguaggi di Programmazione
n
I cosiddetti linguaggi ad alto livello permettono:
descrivere il problema con formule del linguaggio
interrogare il sistema, che effettua deduzioni sulla
base delle definizioni
FI - Algoritmi e Programmazione
78
13
Linguaggi Logici
n
Linguaggi Logici
In un linguaggio logico un programma è composto
da una base di conoscenza contenente:
L’esecuzione di un programma corrisponde
all’applicazione delle regole sui fatti della base di
conoscenza:
n
Una descrizione del dominio del problema composta da un
insieme di fatti.
Un insieme di regole per manipolare l’insieme dei fatti.
q
q
q
q
q
Il linguaggio più conosciuto è il Prolog.
n
FI - Algoritmi e Programmazione
79
FI - Algoritmi e Programmazione
n
n
n
Linguaggi basati sul concetto di funzione e di
applicazione di una funzione ad argomenti; per
questa ragione essi sono anche detti linguaggi
applicativi
In un linguaggio funzionale un programma è visto
come una funzione matematica.
L’esecuzione di un programma corrisponde alla
valutazione della funzione rispetto ai suoi argomenti.
FI - Algoritmi e Programmazione
La differenze maggiori con un linguaggio imperativo
sono:
q
q
q
n
Il Lisp (acronimo per LISt Processing) è il linguaggio
più conosciuto, ma non è più molto usato.
FI - Algoritmi e Programmazione
In un linguaggio di programmazione orientato
agli oggetti (OOP) un programma consiste:
q
q
Interagiamo con oggetti di uso quotidiano,
conoscendone le funzioni, ma non il funzionamento
interno
q
Definizione di un insieme di classi.
Creazione di un insieme di oggetti ed esecuzione
dei suo metodi.
Il C++ e Java sono i due linguaggi OOP più
diffusi
q
Gli oggetti sono scatole nere dotate di interfaccia che
limita l’accesso ai meccanismi interni
Gli oggetti hanno uno stato
n
q
83
L’insieme delle proprietà che lo caratterizzano in un dato
istante
e un comportamento
n
n
FI - Algoritmi e Programmazione
82
Cos’è un oggetto?
n
q
Non esiste il concetto di variabile: il calcolo è basato sul
calcolo di valori e non sull'assegnamento di valori a variabili
il risultato è il risultato di una funzione, non l'effetto causato
dalla esecuzione di una sequenza di operazioni
Sono adatti a elaborazioni simboliche non numeriche.
81
Linguaggi Orientati agli Oggetti
n
80
Linguaggi Funzionali
Linguaggi Funzionali
n
L’esecuzione è guidata da un motore inferenziale.
L’esecuzione è attivata da una interrogazione dell’utente.
Lo scopo dell’esecuzione è verificare che l’interrogazione
dell’utente è vera o falsa.
L’insieme delle azioni che un oggetto può compiere
Un oggetto sw è un’astrazione o un modello della
realtà che limita il numero dei dettagli rappresentati
all’essenziale per il contesto considerato
84
14
Astrazione
n
n
q
q
n
Lo stato di un oggetto sw è descritto e
rappresentato da una o più variabili
n
Non ci preoccupiamo dei suoi dettagli interni per usarlo
Non conosciamo come funziona il metodo “scrivi a
monitor” quando l’invochiamo
Una variabile è un dato individuato da un
identificatore
q
Effettuiamo astrazioni continuamente
q
q
n
Gli oggetti software
L’astrazione nasconde o ignora dettagli inessenziali
Un oggetto è un’astrazione
Possiamo trattare solo poche informazioni
contemporaneamente
Ma se raggruppiamo le informazioni (come gli oggetti)
allora possiamo trattare informazioni più complicate
Quindi, possiamo anche scrivere software
complesso organizzandolo attentamente in classi e
oggetti
n
il comportamento è definito dai metodi
n
Un oggetto sw è costituito dall’insieme delle
variabili e dei metodi
85
Gli oggetti software
FI - Algoritmi e Programmazione
86
Oggetti e classi
Un insieme di dati e funzioni:
Dato
Dato
Dato
FI - Algoritmi e Programmazione
n
Gli oggetti sono generati da una classe
q
Fun
ne
zio
zio
ne
Fun
Cod
ice
i
Cod one funz ce
ion
zi
e
fun
Fun
zio
ne
Co
fun dice
zio
ne
n
La classe è uno schema per produrre una
categoria di oggetti strutturalmente identici
q
La classe costituisce il prototipo
q
Una classe è una fabbrica di istanze: possiede
lo schema e la tecnica di produzione
87
Classi ed ereditarieta’
Si dicono anche istanze della classe
FI - Algoritmi e Programmazione
88
Gli oggetti come astrazione
Soldato
n
Un oggetto che modella una bicicletta
q
q
FI - Algoritmi e Programmazione
89
Una velocità (20 Km/h), il giro dei pedali (15 g/m) e la
marcia (5°) sono variabili di istanza
proprietà rappresentate in ciascuna bicicletta modellata
FI - Algoritmi e Programmazione
90
15
Gli oggetti come astrazione – 2
Le istanze
n
n
n
Inoltre nel modello rappresentiamo funzioni come frenare
o cambiare marcia, che modificano le variabili d’istanza
Si chiamano metodi d’istanza perché hanno accesso alle
variabili d’istanza e le modificano
FI - Algoritmi e Programmazione
91
Incapsulamento dei dati
n
n
n
n
n
q
n
n
La bicicletta appesa in garage è un oggetto e
basta, ci vuole un ciclista che interagisca con lei
perché sia interessante
Gli oggetti sw per interagire si mandano
messaggi
Chiedendo di eseguire
un certo metodo
(procedura)
q
Consente modularità e flessibilità nel codice,
impedendo errori nel manipolare gli oggetti e
semplifica la gestione di sistemi complessi
93
I messaggi – 2
n
92
Gli oggetti interagiscono tra loro per ottenere
funzioni più complesse
q
Private: accessibili solo alla classe
Public: accessibili a chiunque e quindi anche alle
sottoclassi
FI - Algoritmi e Programmazione
n
FI - Algoritmi e Programmazione
I messaggi
Nascondere le informazioni fornendo un’interfaccia
Netta divisione fra interfaccia e implementazione
Le variabili di un oggetto, che ne rappresentano lo
stato, sono nascoste all’interno dell’oggetto,
accessibili solo ai metodi
Idealmente i metodi proteggono le variabili
Diversi livelli di accesso a metodi e variabili
q
n
Definita una classe, si possono creare un
numero arbitrario di oggetti appartenenti alla
classe
FI - Algoritmi e Programmazione
94
I messaggi – 3
n
Spesso i metodi necessitano di informazioni
per poter essere eseguiti: i parametri
Tre componenti:
n
n
L’oggetto a cui il messaggio è rivolto
q Il metodo da eseguire per ottenere un certo
effetto
q I parametri ,
se necessari al
metodo
q
FI - Algoritmi e Programmazione
n
n
95
Un oggetto può essere visto come un insieme di servizi
che possiamo chiedere di eseguire
I servizi sono definiti dai metodi
Il comportamento degli oggetti è definito dai suoi metodi
e il meccanismo di invio dei messaggi consente
l’interazione tra gli oggetti
Ogni oggetto ha in se tutto ciò che gli serve per
rispondere alle chiamate
Gli oggetti che si scambiano i messaggi possono
anche essere ‘distanti’ tra loro
q Su macchine diverse
q Non appartenenti allo stesso modello
FI - Algoritmi e Programmazione
96
16
Interfaccia
n
n
n
Inviare messaggi
L’interfaccia è l’insieme dei messaggi che un
oggetto è in grado di interpretare
Un oggetto deve soddisfare la richiesta di un
messaggio
Eseguendo il metodo si soddisfa la risposta
ad un messaggio da parte di un agente
cambia (marcia)
n
bicicletta_rossa.cambia(2);
oggetto
vel: 20
ciclista_A
97
FI - Algoritmi e Programmazione
Approccio OO
n
Sono le strutture di dati che svolgono le
azioni, non le subroutines
Il lavoro è svolto dal server, non dal client
“Cos’ è?” “Com’ è fatto?”
à Data Oriented
“Cosa può fare per me?”
à Object Oriented
FI - Algoritmi e Programmazione
n
n
FI - Algoritmi e Programmazione
n
q
n
q
n
La programmazione ad oggetti, attraverso
l’incapsulazione, consente di:
ridurre la dipendenza del codice di alto livello dalla
rappresentazione dei dati
q riutilizzare del codice di alto livello
q sviluppare moduli indipendenti l’uno dall’altro
q avere codice utente che dipende dalle interfacce
ma non dall’implementazione
q
non può essere cambiato con faciltà
non può essere stimato l’impatto di una modifica
Fragilità
q
100
Programmazione ad oggetti
Rigidità
q
Programmare per oggetti non velocizza
l’esecuzione dei programmi...
Programmare per oggetti non ottimizza l’uso
della memoria...
E allora perchè programmare per oggetti?
Programmare per oggetti facilita la
progettazione e il mantenimento di sistemi
software molto complessi!
99
Caratteristiche del software non mantenibile
n
98
Perché programmare per oggetti?
n
n
i parametri
informazioni fornite al
metodo
bicicletta_rossa
FI - Algoritmi e Programmazione
n
metodo
marcia: 5
nome: carlo
n
Il ciclista ciclista_A che vuole cambiare
marcia invia il messaggio all’oggetto
bicicletta_rossa
una modifica singola causa una cascata di modifiche
successive
i bachi sorgono in aree concettualmente separate dalle
aree dove sono avvenute le modifiche
Non riusabilità
q
esistono molte interdipendenze, quindi non è possibile
estrarre parti che potrebbero essere comuni
FI - Algoritmi e Programmazione
101
FI - Algoritmi e Programmazione
102
17
Metodi di sviluppo del software
Metodi di sviluppo del
software
Un metodo comprende:
n Una notazione
mezzo comune per esprimere strategie e decisioni
n
Un processo
specifica come deve avvenire lo sviluppo
FI - Algoritmi e Programmazione
Strategie di sviluppo di un progetto
software
n
n
n
n
n
n
104
Modello a cascata
Requisiti: cosa l’utente vuole
Analisi: la visione dell’informatico dei requisiti
Disegno: l’aspetto del sistema software
Produzione: codifica
Testing: debugging e verifica dei requisiti
Mantenimento: installazione del prodotto e
Requisiti
Analisi
Disegno
Produzione
controllo del funzionamento per il resto della sua vita
Testing
FI - Algoritmi e Programmazione
105
Modello evoluzionario
FI - Algoritmi e Programmazione
Confronto fra i modelli di sviluppo
Requisiti
A cascata
Analisi
n
Testing
n
n
Disegno
n
Produzione
FI - Algoritmi e Programmazione
106
n
107
Evoluzionario
Processo lineare (si torna al
passo precedente solo in
caso di problemi)
Confinamento delle attività
in ogni fase
Facile da gestire (gestione
delle scadenze)
Difficile da modificare
Prodotto utilizzabile solo
alla fine del processo
n
n
n
n
n
Processo ciclico (brevi
processi completi)
Attività distribuite su più fasi
Difficile da gestire
Facile da modificare e
integrare
Prototipo utilizzabile fin dal
primo ciclo
FI - Algoritmi e Programmazione
108
18
Requisiti
n
n
Analisi
Definizione delle richieste da parte dell’utente del
programma (o di una sua parte) sul sistema
Si parla di programmazione per contratto perchè
l’utente richiede solamente la definizione del servizio
richiesto NON la metodologia seguita per fornirglielo
q è possibile delegare parte del lavoro richiesto ad
altri
q il sistema è indipendente da chi è il suo utente
n
n
Comprensione e razionalizzazione delle
richieste dell’utente
Costruzione di un modello
q
q
n
astrazione (semplificazione delle relazioni)
rilevanza (identificazione degli oggetti chiave)
Da non trascurare: analisi delle soluzioni
esistenti. Può far risparmiare molto tempo!!!
INCAPSULAMENTO!
FI - Algoritmi e Programmazione
109
Disegno
FI - Algoritmi e Programmazione
Disegno (2)
Definizione di oggetti
e classi
n
Definizione delle
interfacce
Definizione degli stati
e dell’implementazione
n
n
Definizione delle
relazioni
FI - Algoritmi e Programmazione
n
n
Dopo ogni ciclo bisogna analizzare i rischi, la
stabilità del disegno e la complessità delle
classi
Se una classe è troppo complessa conviene
dividerla
Ad ogni ciclo il numero di modifiche deve
diminuire
Architetture troppo complesse devono essere
modularizzate
111
Codifica
n
110
FI - Algoritmi e Programmazione
112
Testing
C’è poco da dire…
Non sopravvalutate questa fase:
n
Debugging: è ovvio… il codice non deve dare
n
Use cases: specificano il comportamento del
n
Scenarios: sono esempi concreti di use cases. Per
errori.
Suddivisione del tempo per il primo
ciclo
Testing
Analisi
20%
30%
sistema in una regione.
definizione se tutti gli scenari sono soddisfatti
correttamente il test è positivo.
Codifica
15%
Disegno
35%
FI - Algoritmi e Programmazione
113
FI - Algoritmi e Programmazione
114
19