Upload
duongque
View
218
Download
0
Embed Size (px)
Citation preview
1
Fondamenti di Informatica
Algoritmi e Programmazione
Monica Mordonini
Dipartimento di Ingegneria dell’InformazioneUniversità degli Studi di Parma
FI - Algoritmi e Programmazione 2
Alcune domande fondamentali
n L’elaboratore come strumento in grado di eseguire un’insieme di azioni elementari che vengono richieste tramite istruzioni scritte in un particolare linguaggio2 Quali istruzioni esegue un elaboratore?2 Quali problemi può risolvere un elaboratore?2 Che ruolo ha il linguaggio di programmazione?
FI - Algoritmi e Programmazione 3
Il problema di fondo
n Descrizione di un problema þindividuazione di un algoritmoØ come si costruisce la soluzione ad un problema?Ø Quale è il giusto punto di partenza?Ø Quali metodologie o tecniche utilizzare?
FI - Algoritmi e Programmazione 4
Algoritmo
n Dall'arabo al-Khuwarizmi a sua volta dal grecoaritmhós
n 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.
n Problemi:q risolvibili q non-risolvibili q non-affrontabili
FI - Algoritmi e Programmazione 5
Codifica di un algoritmo
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
FI - Algoritmi e Programmazione 6
Programman Testo scritto in accordo alla sintassi e alla semantica di
un linguaggio di programmazionen Un programma può non essere un algoritmo (basta che la
sequenza di mosse non sia finita cioè che il programma non termini)...
n ... E tuttavia può essere molto utile (es. gestione semafori)
n Un programma rappresenta l’insieme delle istruzioni chedescrivono un processo espresse in un qualchelinguaggio
n Un processo trasforma un insieme di dati iniziali neirisultati finali mediante una successione di azionielementari
2
FI - Algoritmi e Programmazione 7
Esecuzione
n L’esecuzione delle azioni nell’ordine specificato dall’algoritmo consente di ottenere a partire dai dati in ingresso i risultati che risolvono il problema
n Problema : þ algoritmo þ programma
metodorisolutivo
linguaggio di programmazione
FI - Algoritmi e Programmazione 8
Elementi di un algoritmo
n Passi elementari: azioni atomiche non scomponibili in azioni piú semplici
n Processo o anche esecuzione: sequenza ordinata di passi
FI - Algoritmi e Programmazione 9
Algoritmo
n Un algoritmo deve avere le seguenti proprietà :q Finitezza: composto da un numero finito di passi elementari.q Non ambiguità (determinismo): i risultati non variano in
funzione della macchina/persona che esegue l'algoritmo.q Realizzabilità: deve essere eseguibile con le risorse a
disposizione.q Efficienza (auspicabile): eseguire il numero minimo di
operazioni
FI - Algoritmi e Programmazione 10
Algoritmo
n Per definire un algoritmo è necessario:q Condurre un'attenta analisi del problema ed
eventualmente suddividere il problema in piccoli sottoproblemi.
q Individuare i possibili ingressi e precisare le uscite (definizione dei dati).
q Definire completamente e dettagliatamente la sequenza dei passi che portano alla soluzione.
FI - Algoritmi e Programmazione 11
Algoritmo
n Possiamo “trovare” algoritmi anche per la risoluzione di problemi non strettamente informatici
n Esempi:q Spiegare un percorso stradaleq Istruzioni per il montaggio di un mobileq Istruzioni per l’esecuzione di una torta
n Un algoritmo può non essere l’unica soluzione al problema
FI - Algoritmi e Programmazione 12
Il crivello di Eratostenen Si vogliono trovare tutti i numeri primi
compresi fra 2 e n (In modo efficiente).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.
3
FI - Algoritmi e Programmazione 13
Il crivello di Eratostene: esempio
n Sequenza iniziale (da 2 a 20):2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,202 e’ primo lo elimino con tutti i suoi multipli:3,5,7,9,11,13,15,17,193 e’ primo lo elimino con tutti i suoi multipli: 5,7,11,13,17,195 e’ primo lo elimino con tutti i suoi multipli: …19 e’ primo, la sequenza e’ vuota, termino.
FI - Algoritmi e Programmazione 14
Il crivello di Erastone
n Algoritmoq Finitoq Non ambiguoq Realizzabileq Efficiente (si spera)
FI - Algoritmi e Programmazione 15
Algoritmo di Euclide
n Calcola il massimo comun divisore fra due interi positivi m ed n (supponiamo che n =m, altrimenti li possiamo scambiare).
n L’ algoritmo si compone di 3 passi ripetuticiclicamente fino ad una condizione di arresto:
FI - Algoritmi e Programmazione 16
Algoritmo di Euclide
n Passo E1 {ricerca del resto} : Sia m = n. Sidivide m per n. Sia r il resto. Allora 0 =r < n.
n Passo E2 {r = 0?} : Se r = 0 l’ algoritmo e’ terminato e n e’ la risposta finale.
n Passo E3 {scambio} : Se r ? 0 si operano gliscambi m ? n e n ? r. Si torni al passo E1.
FI - Algoritmi e Programmazione 17
Algoritmo di Euclide: esempio
01530
153045
rnm
Si voglia l’ MCD fra 30 e 45 (I due numerivanno scambiati)
Poiche’ il resto r = o, l’ultimovalore per n e’ l’ MCD
FI - Algoritmi e Programmazione 18
Algoritmo di Euclide: finitezzan Poiche’ al passo E1 {ricerca del resto} si ha
senpre 0 = r < n, ad ogni scambio il valore di n decresce.
n Dopo un numero finito di passi siraggiungera` la condizione r = 0, e la terminazione dell’ algoritmo.
4
FI - Algoritmi e Programmazione 19
Algoritmo di Euclide: correttezzan Ad ogni passo abbiamo che m = q n + r (con
q intero).n 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.
n In pratica la coppia m,n primo e dopo lo scambio m ? n e n ? r hanno lo stessoMCD.
n Se r=0 l’ algoritmo termina e n e’ l’MCD.
FI - Algoritmi e Programmazione 20
Algoritmo di Euclide
n L’algoritmo descritto non è l’unico per risolvere il problema del MCD
n Ma è il più efficiente se a priori non conosco nulla dei due numeri
FI - Algoritmi e Programmazione 21
Calcolo MCD modo 2
n Problema: dati due numeri determinare il loro massimo comune denominatore:q scomporre in fattori primi i due numeri q considerare solo fattori comuni q prendere quelli con esponente piú piccolo q moltiplicarli tra loro
FI - Algoritmi e Programmazione 22
Calcolo MCD modo 3
n Problema: dati due numeri determinare il loro massimo comun denominatoreq costruire insieme divisori primo numero q costruire insieme divisori secondo numero q costruire intersezione fra i due insiemi q individuare nell'intersezione l'elemento piú grande
FI - Algoritmi e Programmazione 23
Algoritmo
n 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 24
Diagramma di Flusso(Flow-Chart)n I diagrammi di flusso sono un formalismo
grafico per descrivere gli algoritmi.n I diagrammi di flusso scompongono in passi
successivi gli algoritmi.n Un diagramma di flusso è una descrizione più
efficace e meno ambigua di una descrizione a parole.
5
FI - Algoritmi e Programmazione 25
Diagrammi di flusso
n Le operazioni su cui si basa un diagramma di flussoq Ingresso/Uscita datiq Trasferimento di informazione (Assegnamenti)q Calcolo di espressioni aritmetiche e logicheq Assunzione di decisioniq Esecuzione di iterazioni (Cicli)q Possono contenere costanti e variabili
FI - Algoritmi e Programmazione 26
Diagramma di flusso
n Un diagramma di flusso è costituito da due tipi di entità:q Nodiq Archi
FI - Algoritmi e Programmazione 27
Strutture di Controllo
I
O
I
O O
I
While - Do Repeat - Until If - Then - Else
Si/No
No/Si No/Si
No/Si
Si/No
Si/No
FI - Algoritmi e Programmazione 28
Programmazione Strutturata
n Si compone di sequenze, decisioni (if then, if then else) e cicli (while-do, repeat until).
n Ogni diagramma ha esattamente un ingressoed una uscita.
n Ogni azione puo essereq una azione sempliceq una azione composta da altri diagrammi
strutturati
FI - Algoritmi e Programmazione 29
Tipi di Nodi
Inizio
Scrittura dati
Var1
Lettura dati
Var1
Elaborazione / Assegnamento
Var1 ← Espr1
Decisione
NoSi
Espr1 = Espr2Espr1 ≠ Espr2Espr1 > Espr2Espr1 ≥ Espr2Espr1 < Espr2Espr1 ≤ Espr2
Start
Fine
Stop
FI - Algoritmi e Programmazione 30
Esempio: Somma di N Numeri
Start
N
Somma ← Somma + Var1I ← I + 1
Somma
Stop
I ← 0Somma ← 0
No SiI < N
6
FI - Algoritmi e Programmazione 31
Esempio: Somma di Tre Numeri
Start
Var1
Var2
Var3
Somma ← Var1 +Var2 + Var3
Somma
Stop
FI - Algoritmi e Programmazione 32
Programmazione Top-Down
n La programmazione top-down è una tecnica di programmazione per la realizzazione di programmi con la scomposizione iterativa di un problema in sotto-problemi.
FI - Algoritmi e Programmazione 33
Tecniche di programmazione
n Programmazione top-down:q scomposizione iterativa del problema in
sottoproblemiq i sottoproblemi devono essere indipendenti ed
avere interfacce ben definiteq visibilità dei dettagli di ogni sottoproblema solo
all’interno del sottoproblema stesso
FI - Algoritmi e Programmazione 34
Programmazione Top-Down
n La programmazione top-down si presta molto bene per la definizione di algoritmi con i diagrammi di flusso:q All’inizio il diagramma di flusso è rappresentato da un nodo
che rappresenta la soluzione al problema.q Questo nodo viene scomposto in una rete di nodi in modo
iterativo.q La scomposizione termina quando i singoli nodi possono
essere rappresentati da semplici sequenze di istruzioni del linguaggio di programmazione scelto.
FI - Algoritmi e Programmazione 35
Esempio: Somma di Tre Numeri
Start
Somma i tre numeri
Stop
FI - Algoritmi e Programmazione 36
Esempio: Somma di Tre Numeri
Start
Leggi e somma i tre numeri
Stop
Stampa la somma
Inizializzazione
7
FI - Algoritmi e Programmazione 37
Esempio: Somma di N Numeri
Start
NSomma ← Somma + Var1
I ← I + 1
Somma
Stop
I ← 0Somma ← 0
No SiI < NProblema della ricorsione
FI - Algoritmi e Programmazione 39
Il calcolo del fattoriale
n La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita
dove n è un numero intero non negativo
0 se 0 se
)!1(1
!>=
−=
nn
nnn
FI - Algoritmi e Programmazione 40
Il calcolo del fattoriale
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
FI - Algoritmi e Programmazione 41
La ricorsione nella programmazione
n Si invoca un metodo mentre si esegue lo stesso metodo
n è un paradigma di programmazione che si chiama
ricorsione e un metodo che ne faccia uso si chiama
metodo ricorsivon La ricorsione è uno strumento molto potente per
realizzare alcuni algoritmi, ma è anche fonte di molti errori di difficile diagnosi
FI - Algoritmi e Programmazione 42
In un programma…n Vediamo la sequenza usata per calcolare 3!
si invoca factorial(3) factorial(3) invoca factorial(2)
factorial(2) invoca factorial(1) factorial(1) invoca factorial(0)
factorial(0) restituisce 1 factorial(1) restituisce 1
factorial(2) restituisce 2 factorial(3) restituisce 6
n Si crea quindi una lista LIFO (uno stack ) di metodi “in attesa”, che si allunga e che poi si accorcia fino ad estinguersi
8
FI - Algoritmi e Programmazione 43
La ricorsione
n Per capire come utilizzare correttamente la ricorsione, vediamo innanzitutto come funziona
n Quando un metodo ricorsivo invoca se stesso, la macchina virtuale esegue le stesse azioni che vengono eseguite quando viene invocato un metodo qualsiasiq sospende l’esecuzione del metodo invocanteq esegue il metodo invocato fino alla sua
terminazioneq riprende l’esecuzione del metodo invocante dal
punto in cui era stata sospesa
FI - Algoritmi e Programmazione 44
La ricorsione
n 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!
n Esistono infatti due regole ben definite che vanno utilizzate per scrivere metodi ricorsivi che funzionino
FI - Algoritmi e Programmazione 45
La ricorsione: caso base
n Prima regolaq il metodo ricorsivo deve fornire la soluzione
del problema in almeno un caso particolare, senza ricorrere ad una chiamata ricorsiva
q tale caso si chiama caso base della ricorsioneq nel nostro esempio, il caso base era
q a volte ci sono più casi base, non è necessario che sia unico
if (n == 0)return 1;
FI - Algoritmi e Programmazione 46
La ricorsione: passo ricorsivo
n Seconda regolaq il metodo ricorsivo deve effettuare la chiamata
ricorsiva dopo aver semplificato il problemaq 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
q il concetto di “problema più semplice” varia di volta in volta: in generale, bisogna avvicinarsi ad un caso base
if (n > 0)return n * factorial(n - 1);
FI - Algoritmi e Programmazione 47
La ricorsione: un algoritmo?
n Le regole appena viste sono fondamentali per poter dimostrare che la soluzione ricorsiva di un problema sia un algoritmoq in particolare, che arrivi a conclusione in un
numero finito di passi
n Si potrebbe pensare che le chiamate ricorsive si possano succedere una dopo l’altra, all’infinito
FI - Algoritmi e Programmazione 48
La ricorsione: un algoritmo?
n Invece, seq ad ogni invocazione il problema diventa
sempre più semplice e si avvicina al caso baseq 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
9
FI - Algoritmi e Programmazione 49
Ricorsione infinita
n Non tutti i metodi ricorsivi realizzano algoritmiq se manca il caso base , il metodo ricorsivo continua ad
invocare se stesso all’infinitoq se il problema non viene semplificato ad ogni
invocazione ricorsiva , il metodo ricorsivo continua ad invocare se stesso all’infinito
n 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
Progetto: Torri di Hanoi
FI - Algoritmi e Programmazione 51
Torri di Hanoi: regole
n Il rompicapo è costituito da tre pile di dischi (“torri”) allineateq all’inizio tutti i dischi si trovano sulla pila di sinistraq alla fine tutti i dischi si devono trovare sulla pila di destra
n I dischi sono tutti di dimensioni diverse e quando si trovano su una pila devono rispettare la seguente regolaq nessun disco può avere sopra di sé dischi più grandi
FI - Algoritmi e Programmazione 52
Torri di Hanoi: regole
Situazione iniziale Situazione finale
FI - Algoritmi e Programmazione 53
Torri di Hanoi: regole
n Per risolvere il rompicapo bisogna spostare un disco alla voltaq un disco può essere rimosso dalla cima della torre
ed inserito in cima ad un’altra torren non può essere “parcheggiato” all’esterno…
q in ogni momento deve essere rispettata la regola vista in precedenzan nessun disco può avere sopra di sé dischi
più grandi
FI - Algoritmi e Programmazione 54
Algoritmo di soluzione
n Per il rompicapo delle Torri di Hanoi è noto un algoritmo di soluzione ricorsivo
n Il problema generale consiste nello spostare n dischi da una torre ad un’altra, usando la terza torre come deposito temporaneo
n 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
n Per descrivere l’algoritmo identifichiamo le torri con i numeri interi 1, 2 e 3
10
FI - Algoritmi e Programmazione 55
Algoritmo ricorsivo
n Il caso base si ha quando n vale 1, in questo caso possiamo spostare liberamente il disco da una torre ad un’altra
n Per spostare n dischi dalla torre 1 alla torre 31 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 33 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 56
Algoritmo ricorsivon Si basa sul Principio di induzionen Il principio di induzione dice che una
proprietà è vera per qualsiasi valore di n se q è vera per n = 1, e q 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 57
La “Torre di Hanoi”
FI - Algoritmi e Programmazione 58
Algoritmo Hanoi(n, da, a, int)input: il numero di dichi n, il perno di partenza, di arrivo e intermediooutput: le mosse necessarieif 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 59
11030210201302031030120102203011030
10 20 30mosse
FI - Algoritmi e Programmazione 60
Algoritmo ricorsivon Si può dimostrare che il numero di mosse
necessarie per risolvere il rompicapo con l’algoritmo proposto è pari a:
2n – 1n Il tempo necessario alla soluzione è
proporzionale al numero di mosse (ogni mossa richiede un tempo costante) cioe’:
T(n) = 2n – 1
11
FI - Algoritmi e Programmazione 61
La torre di Brahama
n Torre di Hanoi con 64 dischin 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à
Quando finirà il mondo?
Dipende..
FI - Algoritmi e Programmazione 63
Torri di Hanoi: la leggenda
n Sono necessarie mosse, che sono circa 16 miliardi di miliardi di mosse… cioè circa
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...
1264 −18106.1 × Linguaggi di programmazione
FI - Algoritmi e Programmazione 65
Linguaggi di Programmazione
n Un linguaggio di programmazione è una notazione formale per descrivere algoritmi
n Un programma è la descrizione di un algoritmo in un particolare linguaggio di programmazione
2 Quali “parole chiave”2 Quali meccanismi di combinazione?
FI - Algoritmi e Programmazione 66
Linguaggi di Programmazione: Sintassi & Semantican 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
12
FI - Algoritmi e Programmazione 67
Sintassi e Semantica
n Dopo la definizione di un linguaggio (con sintassi e semantica) serve un sistema che possa eseguire i programmi scritti in tale linguaggio
n Si parla di implementazione di un linguaggioq generalmente è un traduttore verso il linguaggio
dell’elaboratore
FI - Algoritmi e Programmazione 68
Sintassi
n Per definire la sintassi di un linguaggio, è necessario definire le grammatiche
n La grammatica è un insieme di regole che servono per costruire una frase
FI - Algoritmi e Programmazione 69
Grammatica
n La grammatica è definita da:q un alfabeto di simboli terminal (l'alfabeto del linguaggio)q un alfabeto di simboli non terminaliq un simbolo iniziale S (o assioma)q un insieme finito di regole sintattiche
n Data una grammatica, il linguaggio generato è definito come l'insieme delle frasi derivabili a partire dall'assioma S q Le frasi di un linguaggio di programma-zione sono dette
programmi
FI - Algoritmi e Programmazione 70
Linguaggi di Programmazione
n Diversi tipi di linguaggi:q Imperativiq Funzionaliq Dichiarativi
n Tutti basati sulla traduzione nell'unico linguaggio eseguibile dal calcolatore: il Linguaggio Macchina
FI - Algoritmi e Programmazione 71
Linguaggi di Programmazione
n I linguaggi macchina forniscono solo le operazioni che l'elaboratore può eseguire:q Operazioni molto elementari.q Diverse per ogni processore.q Scritte in linguaggio binario
n Sono più orientati alla macchina che ai problemi da trattare.
FI - Algoritmi e Programmazione 72
Linguaggi di Programmazionen Una prima evoluzione sono i linguaggi
assemblativi che sostituiscono i codici binari con codici simbolici.q ancora orientati alla macchina e non ai problemiq più immediati da utilizzareq definiscono variabili, simboli
START: MOV AX, BXCMP AX, 12hJZ EQUALINT 21hRET
EQUAL: MOV BL, 82h
13
FI - Algoritmi e Programmazione 73
Linguaggi di Programmazione
n I linguaggi macchina e i linguaggi assemblativi sono detti linguaggi a basso livello.
FI - Algoritmi e Programmazione 74
Linguaggi di Programmazione
n I cosiddetti linguaggi ad alto livello permettono: q La descrizione del problema in modo intuitivo,
dimenticandosi che verranno eseguiti da un calcolatore.q Una astrazione rispetto al calcolatore su cui verrà eseguito
il programma.
n Ma devono essere tradotti in linguaggio macchina.
FI - Algoritmi e Programmazione 75
Linguaggi di Programmazione
n Esistono diversi tipi di linguaggi ad alto livello:q Linguaggi imperativiq Linguaggi logiciq Linguaggi funzionaliq Linguaggi orientati agli oggetti
n Ognuno provvede le forme espressive appropriate per alcuni problemi specifici.
FI - Algoritmi e Programmazione 76
Linguaggi Imperativi
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.
n Un programma è una sequenza di istruzioni in cui:q Le istruzioni vengono eseguite in sequenza.q La sequenza può essere alterata con istruzioni di salto.
n Eseguono 3 tipi di operazioni:q trasferimento datiq operazioni aritmeticheq alterazione del flusso del programma
FI - Algoritmi e Programmazione 77
Linguaggi Imperativi
n Le operazioni che effettuano le istruzioni si basano sul concetto di variabile.
n Una variabile è una astrazione del concetto di locazione di memoria in cui può essere assegnato, letto e modificato un valore.
n Il C, Fortran, Pascal, Cobol e Basic sono i linguaggi imperativi più diffusi.
FI - Algoritmi e Programmazione 78
Linguaggi Logici
n Basati sulla logicaq obiettivo: formalizzare il ragionamentoq caratterizzati da meccanismi deduttivi
n Programmare significa:q descrivere il problema con formule del linguaggioq interrogare il sistema, che effettua deduzioni sulla
base delle definizioni
14
FI - Algoritmi e Programmazione 79
Linguaggi Logici
n In un linguaggio logico un programma è composto da una base di conoscenza contenente:q Una descrizione del dominio del problema composta da un
insieme di fatti.q Un insieme di regole per manipolare l’insieme dei fatti.
FI - Algoritmi e Programmazione 80
Linguaggi Logici
n L’esecuzione di un programma corrisponde all’applicazione delle regole sui fatti della base di conoscenza:q L’esecuzione è guidata da un motore inferenziale.q L’esecuzione è attivata da una interrogazione dell’utente.q Lo scopo dell’esecuzione è verificare che l’interrogazione
dell’utente è vera o falsa.
n Il linguaggio più conosciuto è il Prolog.
FI - Algoritmi e Programmazione 81
Linguaggi Funzionalin Linguaggi basati sul concetto di funzione e di
applicazione di una funzione ad argomenti; per questa ragione essi sono anche detti linguaggiapplicativi
n In un linguaggio funzionale un programma è visto come una funzione matematica.
n L’esecuzione di un programma corrisponde alla valutazione della funzione rispetto ai suoi argomenti.
FI - Algoritmi e Programmazione 82
Linguaggi Funzionalin La differenze maggiori con un linguaggio imperativo
sono:q Non esiste il concetto di variabile: il calcolo è basato sul
calcolo di valori e non sull'assegnamento di valori a variabili q il risultato è il risultato di una funzione, non l'effetto causato
dalla esecuzione di una sequenza di operazioniq Sono adatti a elaborazioni simboliche non numeriche.
n Il Lisp (acronimo per LISt Processing) è il linguaggio più conosciuto, ma non è più molto usato.
FI - Algoritmi e Programmazione 83
Linguaggi Orientati agli Oggetti
n In un linguaggio di programmazione orientato agli oggetti (OOP) un programma consiste:q Definizione di un insieme di classi.q Creazione di un insieme di oggetti ed esecuzione
dei suo metodi.q Il C++ e Java sono i due linguaggi OOP più
diffusi
84
Cos’è un oggetto?n Interagiamo con oggetti di uso quotidiano,
conoscendone le funzioni, ma non il funzionamentointernoq Gli oggetti sono scatole nere dotate di interfaccia che
limita l’accesso ai meccanismi interniq Gli oggetti hanno uno stato
n L’insieme delle proprietà che lo caratterizzano in un datoistante
q e un comportamenton L’insieme delle azioni che un oggetto può compiere
n Un oggetto sw è un’astrazione o un modello dellarealtà che limita il numero dei dettagli rappresentatiall’essenziale per il contesto considerato
15
85
Astrazionen L’astrazione nasconde o ignora dettagli inessenzialin Un oggetto è un’astrazione
q Non ci preoccupiamo dei suoi dettagli interni per usarloq Non conosciamo come funziona il metodo “scrivi a
monitor” quando l’invochiamon Effettuiamo astrazioni continuamente
q Possiamo trattare solo poche informazionicontemporaneamente
q Ma se raggruppiamo le informazioni (come gli oggetti) allora possiamo trattare informazioni più complicate
n Quindi, possiamo anche scrivere software complesso organizzandolo attentamente in classi e oggetti
FI - Algoritmi e Programmazione 86
Gli oggetti softwaren Lo stato di un oggetto sw è descritto e
rappresentato da una o più variabiliq Una variabile è un dato individuato da un
identificatore
n il comportamento è definito dai metodi
n Un oggetto sw è costituito dall’insieme delle variabili e dei metodi
FI - Algoritmi e Programmazione 87
FunzioneFunzione
Funzione
Codice
funzione
Codicefunzione
Codicefunzione
Gli oggetti softwareUn insieme di dati e funzioni:
Dato
Dato
Dato
FI - Algoritmi e Programmazione 88
Oggetti e classi
n Gli oggetti sono generati da una classeq Si dicono anche istanze della classe
n La classe è uno schema per produrre unacategoria di oggetti strutturalmente identiciq La classe costituisce il prototipo
q Una classe è una fabbrica di istanze: possiedelo schema e la tecnica di produzione
FI - Algoritmi e Programmazione 89
Soldato
Classi ed ereditarieta ’
FI - Algoritmi e Programmazione 90
Gli oggetti come astrazione
n Un oggetto che modella una biciclettaq Una velocità (20 Km/h), il giro dei pedali (15 g/m) e la
marcia (5°) sono variabili di istanzaq proprietà rappresentate in ciascuna bicicletta modellata
16
FI - Algoritmi e Programmazione 91
Gli oggetti come astrazione – 2
n Inoltre nel modello rappresentiamo funzioni come frenareo cambiare marcia , che modificano le variabili d’istanza
n Si chiamano metodi d’istanza perché hanno accesso alle variabili d’istanza e le modificano
FI - Algoritmi e Programmazione 92
Le istanze
n Definita una classe, si possono creare un numero arbitrario di oggetti appartenenti alla classe
FI - Algoritmi e Programmazione 93
Incapsulamento dei datin Nascondere le informazioni fornendo un’interfaccian Netta divisione fra interfaccia e implementazionen Le variabili di un oggetto, che ne rappresentano lo
stato, sono nascoste all’interno dell’oggetto, accessibili solo ai metodi
n Idealmente i metodi proteggono le variabilin Diversi livelli di accesso a metodi e variabili
q Private : accessibili solo alla classeq Public: accessibili a chiunque e quindi anche alle
sottoclassi
n Consente modularità e flessibilità nel codice, impedendo errori nel manipolare gli oggetti e semplifica la gestione di sistemi complessi
FI - Algoritmi e Programmazione 94
I messaggin Gli oggetti interagiscono tra loro per ottenere
funzioni più complesseq La bicicletta appesa in garage è un oggetto e
basta, ci vuole un ciclista che interagisca con lei perché sia interessante
n Gli oggetti sw per interagire si mandano messaggiq Chiedendo di eseguire un certo metodo (procedura)
FI - Algoritmi e Programmazione 95
I messaggi – 2n Spesso i metodi necessitano di informazioni
per poter essere eseguiti: i parametrin Tre componenti:
q L’oggetto a cui il messaggio è rivoltoq Il metodo da eseguire per ottenere un certo
effettoq I parametri ,se necessari al metodo
FI - Algoritmi e Programmazione 96
I messaggi – 3n Un oggetto può essere visto come un insieme di servizi
che possiamo chiedere di eseguiren I servizi sono definiti dai metodin Il comportamento degli oggetti è definito dai suoi metodi
e il meccanismo di invio dei messaggi consente l’interazione tra gli oggetti
n Ogni oggetto ha in se tutto ciò che gli serve per rispondere alle chiamate
n Gli oggetti che si scambiano i messaggi possono anche essere ‘distanti’ tra loroq Su macchine diverseq Non appartenenti allo stesso modello
17
FI - Algoritmi e Programmazione 97
Interfaccia
n L’interfaccia è l’insieme dei messaggi che un oggetto è in grado di interpretare
n Un oggetto deve soddisfare la richiesta di un messaggio
n Eseguendo il metodo si soddisfa la risposta ad un messaggio da parte di un agente
nome: carlomarcia: 5
vel: 20
ciclista_A bicicletta_rossa
cambia (marcia)
FI - Algoritmi e Programmazione 98
Inviare messaggi
n Il ciclista ciclista_A che vuole cambiare marcia invia il messaggio all’oggetto bicicletta_rossa
bicicletta_rossa.cambia(2);
oggetto metodo i parametriinformazioni fornite al
metodo
FI - Algoritmi e Programmazione 99
Approccio OO
n Sono le strutture di dati che svolgono le azioni, non le subroutines
n Il lavoro è svolto dal server, non dal clientn “Cos’ è?” “Com’ è fatto?”
à Data Orientedn “Cosa può fare per me?”
à Object Oriented
FI - Algoritmi e Programmazione 100
Perché programmare per oggetti?n Programmare per oggetti non velocizza
l’esecuzione dei programmi...n Programmare per oggetti non ottimizza l’uso
della memoria...E allora perchè programmare per oggetti?
n Programmare per oggetti facilita la progettazione e il mantenimento di sistemisoftware molto complessi!
FI - Algoritmi e Programmazione 101
Caratteristiche del software non mantenibile
n Rigiditàq non può essere cambiato con faciltàq non può essere stimato l’impatto di una modifica
n Fragilitàq una modifica singola causa una cascata di modifiche
successiveq i bachi sorgono in aree concettualmente separate dalle
aree dove sono avvenute le modifiche
n Non riusabilitàq esistono molte interdipendenze, quindi non è possibile
estrarre parti che potrebbero essere comuni
FI - Algoritmi e Programmazione 102
Programmazione ad oggettin La programmazione ad oggetti, attraverso
l’incapsulazione, consente di:q ridurre la dipendenza del codice di alto livello dalla
rappresentazione dei dati q riutilizzare del codice di alto livelloq sviluppare moduli indipendenti l’uno dall’altroq avere codice utente che dipende dalle interfacce
ma non dall’implementazione
18
Metodi di sviluppo del software
FI - Algoritmi e Programmazione 104
Metodi di sviluppo del software
Un metodo comprende:n Una notazione
mezzo comune per esprimere strategie e decisioni
n Un processospecifica come deve avvenire lo sviluppo
FI - Algoritmi e Programmazione 105
Strategie di sviluppo di un progettosoftwaren Requisiti: cosa l’utente vuole
n Analisi: la visione dell’informatico dei requisiti
n Disegno: l’aspetto del sistema software
n Produzione: codifica
n Testing: debugging e verifica dei requisiti
n Mantenimento: installazione del prodotto e controllo del funzionamento per il resto della sua vita
FI - Algoritmi e Programmazione 106
Modello a cascata
Analisi
Disegno
Produzione
Testing
Requisiti
FI - Algoritmi e Programmazione 107
Modello evoluzionario
Requisiti
Analisi
Disegno
Produzione
Testing
FI - Algoritmi e Programmazione 108
Confronto fra i modelli di sviluppo
A cascatan Processo lineare (si torna al
passo precedente solo in caso di problemi)
n Confinamento delle attivitàin ogni fase
n Facile da gestire (gestionedelle scadenze)
n Difficile da modificaren Prodotto utilizzabile solo
alla fine del processo
Evoluzionarion Processo ciclico (brevi
processi completi)n Attività distribuite su più fasin Difficile da gestiren Facile da modificare e
integraren Prototipo utilizzabile fin dal
primo ciclo
19
FI - Algoritmi e Programmazione 109
Requisitin Definizione delle richieste da parte dell’utente del
programma (o di una sua parte) sul sisteman Si parla di programmazione per contratto perchè
l’utente richiede solamente la definizione del serviziorichiesto NON la metodologia seguita per fornirglieloq è possibile delegare parte del lavoro richiesto ad
altriq il sistema è indipendente da chi è il suo utente
INCAPSULAMENTO!
FI - Algoritmi e Programmazione 110
Analisi
n Comprensione e razionalizzazione dellerichieste dell’utente
n Costruzione di un modelloq astrazione (semplificazione delle relazioni)q rilevanza (identificazione degli oggetti chiave)
n Da non trascurare: analisi delle soluzioniesistenti. Può far risparmiare molto tempo!!!
FI - Algoritmi e Programmazione 111
Disegno
Definizione delleinterfacce
Definizione di oggettie classi
Definizione degli statie dell’implementazione
Definizione dellerelazioni
FI - Algoritmi e Programmazione 112
Disegno (2)
n Dopo ogni ciclo bisogna analizzare i rischi, la stabilità del disegno e la complessità delleclassi
n Se una classe è troppo complessa convienedividerla
n Ad ogni ciclo il numero di modifiche devediminuire
n Architetture troppo complesse devono esseremodularizzate
FI - Algoritmi e Programmazione 113
Codifica
n C’è poco da dire… n Non sopravvalutate questa fase:
Suddivisione del tempo per il primo ciclo
Analisi30%
Disegno35%
Codifica15%
Testing20%
FI - Algoritmi e Programmazione 114
Testing
n Debugging: è ovvio… il codice non deve dare errori.
n Use cases: specificano il comportamento del sistema in una regione.
n Scenarios: sono esempi concreti di use cases. Per definizione se tutti gli scenari sono soddisfatticorrettamente il test è positivo.