19
Fondamenti di Informatica Algoritmi e Programmazione Monica Mordonini Dipartimento di Ingegneria dell’Informazione Università 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 linguaggio 2 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 greco aritmhó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 Programma n Testo scritto in accordo alla sintassi e alla semantica di un linguaggio di programmazione n 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 che descrivono un processo espresse in un qualche linguaggio n Un processo trasforma un insieme di dati iniziali nei risultati finalimediante una successione di azioni elementari

Fondamenti di Informatica - ce.unipr.it · Var1 ← Espr1 Decisione Si No Espr1 = Espr2 Espr1 ≠ Espr2 Espr1 > Espr2 Espr1 ≥ Espr2 Espr1 < Espr2 Espr1 ≤ Espr2 Start Fine

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.