54
Elementi di Informatica e Programmazione Il concetto di Algoritmo e di Calcolatore Corsi di Laurea in: Ingegneria Civile Ingegneria per l’Ambiente e il Territorio Università degli Studi di Brescia Docente: Daniela Fogli Daniela Fogli – Elementi di Informatica e Programmazione 2 2 Cos’è l’informatica? “L’informatica è lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione: la loro teoria, analisi, progetto, efficienza, realizzazione applicazione[ACM – Association for Computing Machinery] L’informatica è dunque una scienza: l’elaborazione dell’informazione avviene in modo sistematico e rigoroso L’elaborazione può essere automatizzata Daniela Fogli – Elementi di Informatica e Programmazione 3 3 Alcuni concetti chiave Algoritmo: una sequenza di operazioni che riguardano l’elaborazione di informazione e che sono comprensibili ed eseguibili da un esecutore Un esempio di esecutore: il calcolatore In realtà un calcolatore esegue un programma, ovvero la descrizione formale di un algoritmo Necessità di linguaggi per la descrizione formale di algoritmi: linguaggi di programmazione Gli algoritmi di fatto “risolvono problemi”… vediamo cosa significa … Daniela Fogli – Elementi di Informatica e Programmazione 4 4 I problemi e la loro risoluzione… Problema: classe di domande omogenee alle quali è possibile dare risposta mediante una procedura uniforme Istanza del problema: ogni specifica domanda della classe Variabili di ingresso: termini variabili che caratterizzano la formulazione di un problema (permettono di generare le istanze) Variabili di uscita: termini variabili che caratterizzano le soluzioni attese (delle istanze) di un problema Dati: valori che possono assumere le variabili d’ingresso Risultati: valori che possono assumere le variabili d’uscita Soluzione di un’istanza di un problema: risposta alla specifica domanda che l’istanza rappresenta

Elementi di Informatica e Cos’è l’informatica? Programmazione · Un programma è una sequenza di istruzioni scritte in un opportuno linguaggio comprensibile dal calcolatore Il

Embed Size (px)

Citation preview

Elementi di Informatica e Programmazione

Il concetto di Algoritmo e di Calcolatore

Corsi di Laurea in:

Ingegneria CivileIngegneria per l’Ambiente e il Territorio

Università degli Studi di Brescia

Docente: Daniela Fogli

Daniela Fogli – Elementi di Informatica e Programmazione 22

Cos’è l’informatica?

“L’informatica è lo studio sistematico degli algoritmi

che descrivono e trasformano l’informazione: la loro

teoria, analisi, progetto, efficienza, realizzazione

applicazione” [ACM – Association for Computing Machinery]

L’informatica è dunque una scienza: l’elaborazione

dell’informazione avviene in modo sistematico e

rigoroso

L’elaborazione può essere automatizzata

Daniela Fogli – Elementi di Informatica e Programmazione 33

Alcuni concetti chiave

Algoritmo: una sequenza di operazioni che riguardano l’elaborazione di informazione e che sono comprensibili ed eseguibili da un esecutore

Un esempio di esecutore: il calcolatore

In realtà un calcolatore esegue un programma, ovvero la descrizione formale di un algoritmo

Necessità di linguaggi per la descrizione formale di algoritmi: linguaggi di programmazione

Gli algoritmi di fatto “risolvono problemi”… vediamo cosa significa …

Daniela Fogli – Elementi di Informatica e Programmazione 44

I problemi e la loro risoluzione…

Problema: classe di domande omogenee alle quali è possibile dare risposta mediante una procedura uniforme

Istanza del problema: ogni specifica domanda della classe

Variabili di ingresso: termini variabili che caratterizzano la formulazione di un problema (permettono di generare le istanze)

Variabili di uscita: termini variabili che caratterizzano le soluzioni attese (delle istanze) di un problema

Dati: valori che possono assumere le variabili d’ingresso

Risultati: valori che possono assumere le variabili d’uscita

Soluzione di un’istanza di un problema: risposta alla specifica domanda che l’istanza rappresenta

Daniela Fogli – Elementi di Informatica e Programmazione 55

Esempio

Quanto vale la radice quadrata intera Y di un

numero intero positivo X ?

Problema

Variabile di ingresso

Variabile di uscita

Istanza

Quanto vale la radice quadrata intera Y del numero 49?

Dati = Interi positivi

Risultati = Interi

Soluzione dell’istanza = 7

Classe di domande omogenee

Daniela Fogli – Elementi di Informatica e Programmazione 66

Esempio

Quanto vale la radice quadrata Y di un numero

intero positivo X ?

Problema

Variabile di ingresso

Variabile di uscita

Istanza

Quanto vale la radice quadrata Y del numero 50?

Dati = Interi positivi

Risultati = Reali

Soluzione dell’istanza = 7,07…

Classe di domande omogenee

Daniela Fogli – Elementi di Informatica e Programmazione 77

Un esempio di problema e di procedura di risoluzione

Problema: Quanto vale la radice quadrata intera Y di un numero intero positivo X?

Quale potrebbe essere una procedura di risoluzione?

Partiamo dalle istanzeX=5: 2*2=4, 3*3=9 Y=2

X=9: 2*2=4, 3*3=9 Y=3

X=1: 1*1=1, 2*2=4 Y=1

X=10: 2*2=4, 3*3=9, 4*4=16 Y=3

Idea!Parto da Y=1, controllo se Y2<X

Se sì allora provo con Y+1 e continuo

Altrimenti significa che Y2>=X:Se Y2 = X allora Ok

Altrimenti la soluzione deve essere Y-1

Daniela Fogli – Elementi di Informatica e Programmazione 88

Procedura di risoluzione

Una possibile procedura di risoluzione per il problema dato è dunque:

1. INIZIO: Assegna a Y il valore 0

2. Incrementa Y di 1

3. Se Y2< X allora torna all’istruzione 2

4. Se Y2 = X allora FINE

5. Se Y2> X allora decrementa Y di 1: FINE

Daniela Fogli – Elementi di Informatica e Programmazione 99

Procedure di risoluzione e algoritmi…

La procedura di risoluzione è quindi espressa come

sequenza di istruzioni la cui esecuzione porta alla

soluzione del problema � ALGORITMO RISOLUTIVO

ALGORITMO

DATI SOLUZIONE

Daniela Fogli – Elementi di Informatica e Programmazione 1010

Computazione

Computazione: esecuzione di un algoritmo in corrispondenza di certi dati

Passo di computazione: ogni singolo passo elementare che un esecutore compie durante l’esecuzione di un algoritmo

Sequenza di computazione: sequenza di passi elementari che un esecutore compie in corrispondenza di certi dati inizialidurante l’esecuzione di un algoritmo

Algoritmo = concetto statico Computazione = concetto dinamico

Daniela Fogli – Elementi di Informatica e Programmazione 1111

1 Y ← 0

2 Calcolo di Y+1 e risultato in Y � Y =1

3 Controllo se Y2 < X � è vero

4 Calcolo di Y+1 e risultato in Y � Y =2

5 Controllo se Y2 < X � è vero

6 Calcolo di Y+1 e risultato in Y � Y =3

7 Controllo se Y2 < X � è falso

8 Controllo se Y2 = X � è falso

9 Controllo se Y2 > X � è vero (ovviamente!)

10 Calcolo di Y-1 e risultato in Y � Y =2

11 Fine

Supponendo che la variabile in ingresso X = 8eseguiamo l’algoritmo passo-passo

Esempio di sequenza di computazione

Daniela Fogli – Elementi di Informatica e Programmazione 1212

Più formalmente …

Problema

P[X, Y]

(X1, X2, …, Xn): variabili di ingresso, con dominiD1, D2, …, Dn (insiemi di dati)

(Y1, Y2, …, Ym): variabili di uscita, con dominiR1, R2, …, Rm (insiemi di risultati)

Istanza del problema

P[X, Y] con X ∈ D = D1 x D2 x … x Dn

Daniela Fogli – Elementi di Informatica e Programmazione 1313

Algoritmo risolvente del problema

Denotiamo con A[X, Y] l’algoritmo risolvente di P[X, Y]

A[X, Y] produce una soluzione per ogni possibile istanza di P[X, Y]

Eseguendo l’algoritmo risolvente A[X, Y] con il dato di ingresso X Є

D si otterrà come risultato la soluzione Y Є R dell’istanza P[X, Y]

Problema P[X, Y]

Istanza P[X, Y]

Algoritmo A[X, Y]

Risultato Y:

soluzione di P[X, Y]

Sostituzione di X con X Esecuzione di A

con il dato X

Daniela Fogli – Elementi di Informatica e Programmazione 1414

Calcolatore comeEsecutore Universale di Algoritmi

CALCOLATOREdato: X

A[X, Y]

risultato: Y

P[X, Y]

P[X, Y]

algoritmo problema

istanza

soluzione

Daniela Fogli – Elementi di Informatica e Programmazione 1515

Calcolatore come esecutore

Un esecutore deve essere in grado di interpretare la descrizione

della procedura di risoluzione (algoritmo risolvente)

Deve inoltre essere in grado di eseguire le azioni presenti nella

descrizione interpretata

Il calcolatore è un esecutore di algoritmi identificate e

descritte da esseri umani (in genere un team di progettisti,

programmatori e utenti)

Daniela Fogli – Elementi di Informatica e Programmazione 1616

Algoritmi, programmi e calcolatori

Un algoritmo deve essere comprensibile per il suo esecutore

Per essere comprensibili da un calcolatore, gli algoritmi devono

essere espressi in un linguaggio di programmazione

Programma: descrizione formale di un algoritmo attraverso un

linguaggio di programmazione

Un programma è una sequenza di istruzioni scritte in un

opportuno linguaggio comprensibile dal calcolatore

Il calcolatore è dunque un esecutore di programmi

Il compito di un esperto informatico consiste nel produrre

algoritmi e codificarli in programmi

Daniela Fogli – Elementi di Informatica e Programmazione 1717

Il calcolatore come esecutore di programmi

CALCOLATORE

Programma

sequenza di istruzioni di un linguaggio di programmazione (descrive un algoritmo)

Dati iniziali Risultatidell’esecuzione in corrispondenza dei dati iniziali

Assegnati a variabili di ingresso

Assegnati a variabili di uscita

Daniela Fogli – Elementi di Informatica e Programmazione 1818

Il calcolatore come esecutore(una definizione rivisitata)

Un calcolatore è un sistema che, ricevendo in ingresso

la descrizione, in un opportuno linguaggio, di un

algoritmo risolvente A[X,Y] (cioè un programma) per un

certo problema P[X,Y] e un dato X, produce un risultato

Y, ovvero la soluzione Y dell’istanza P[X,Y]

Un calcolatore è un esecutore universale di

programmielabora puri simboli (per esso “privi di significato”)

non risolve problemi (il problema non è un suo ingresso) ma esegue programmi!

Daniela Fogli – Elementi di Informatica e Programmazione 1919

Esempio

CALCOLATORE

Programma per il calcolo della potenza n-esima di a: P[a, n, b]

dati iniziali

a = 2, n = 5

Risultati dell’esecuzione in corrispondenza dei dati iniziali

b = 32

X Y

Istanza del problema = P[2,5,b]

Daniela Fogli – Elementi di Informatica e Programmazione 2020

Perché usare un calcolatore come esecutore

Almeno 3 aspetti lo fanno preferire a un esecutore umano

Velocità

Es. si pensi al calcolo strutturale, alla simulazione di processi, al controllo della traiettoria di un veicolo spaziale

… ma anche a tutte quelle situazioni in cui occorre trattare unaenorme quantità di dati – es. gestione anagrafe fiscale

Affidabilitàbasso tasso di errore

Economicitàottimo compromesso costi/benefici

Daniela Fogli – Elementi di Informatica e Programmazione 2121

L’ “unicità” del calcolatore nella storia della tecnologia

Il fatto fondamentale: il calcolatore è un dispositivo programmabile

Consente di svolgere compiti diversi senza alcuna modifica della sua struttura fisica

Basta intervenire sul livello software (programmi) lasciando inalterato il livello hardware (struttura fisica) per modificarne il comportamento

Daniela Fogli – Elementi di Informatica e Programmazione 2222

Proprietà di un algoritmo

Finitezza: un algoritmo deve essere costituito da un numero finito

di istruzioni

Definitezza: le istruzioni di cui un algoritmo è costituito devono

appartenere a un insieme finito e prefissato di tipi elementari

Univocità: ogni istruzione deve essere univocamente

interpretabile ed eseguibile

Effettività: deve esistere un esecutore in grado di eseguire ogni

istruzione dell’algoritmo in un tempo finito

La definizione di algoritmo presuppone che esso possa essere espresso

in termini linguistici ben definiti, interpretato ed eseguito da un soggetto

esecutore (il calcolatore). Da ciò conseguono le seguenti proprietà:

Daniela Fogli – Elementi di Informatica e Programmazione 2323

Altre proprietà

Determinismo: per qualunque dato di ingresso, a ogni passo

della computazione, esiste al più un passo successivo. Ovvero:

assegnato un dato di ingresso, esiste una e una sola

computazione possibile dell’algoritmo

Correttezza: l’algoritmo perviene alla soluzione del compito cui

è preposto

Efficienza: l’algoritmo perviene alla soluzione del compito

impiegando il numero minimo di risorse fisiche

Risorse fisiche: tempo, memoria, ….

Terminazione: l’esecuzione di un algoritmo deve terminare in

un numero finito di passi

Daniela Fogli – Elementi di Informatica e Programmazione 2424

risultato: Y dato: X

A[X, Y]

algoritmo

ESECUTORE

passo 1 � passo 2 � passo 3 … … � passo n

In questo caso, la computazione produce un risultato

Sequenza di computazione finita

Daniela Fogli – Elementi di Informatica e Programmazione 2525

In questo caso, il risultato rimane indefinito

dato: X ESECUTORE

passo 1 � passo 2 � passo 3 … … � … …

A[X, Y]

algoritmo

NB: l’algoritmo

è comunque finito!

Sequenza di computazione infinita

Daniela Fogli – Elementi di Informatica e Programmazione 2626

Funzione calcolata da un algoritmo

fA

D

R

A[X, Y]

• Un algoritmo A[X, Y] calcola una funzione da D (dominio delle

variabili di ingresso) a R (dominio delle variabili di uscita):

- fA: D→R

tale che fA(X) = Y

con Y prodotto dalla computazione di A[X, Y] con il dato X

• La funzione è in generale parziale!

Daniela Fogli – Elementi di Informatica e Programmazione 2727

Note

Funzione come concetto equivalente di problema

Problema: come lo risolvo?

Funzione: come la calcolo?

Un algoritmo risolve 1 problema (calcola 1 funzione)

Viceversa, per ogni problema risolubile (ovvero, se esiste un

algoritmo che lo risolve), esistono infiniti algoritmi che lo risolvono,

infatti:

• un algoritmo è descritto da una sequenza di istruzioni

• è sufficiente pensare che possiamo sempre aggiungere sequenze di

istruzioni che non hanno effetto sul risultato

• e possiamo farlo in infiniti modi (es. sommare e sottrarre 1 a/da una

variabile, sommare e sottrarre 2, ecc. ecc.)

Daniela Fogli – Elementi di Informatica e Programmazione 2828

Due algoritmi che risolvono lo stesso problema

1. INIZIO: Assegna a Y il valore 0

2. Incrementa Y di 1

3. Se Y2< X allora torna all’istruzione 2

4. Se Y2 = X allora FINE

5. Se Y2> X allora decrementa Y di 1: FINE

1.INIZIO: Assegna a Y il valore 02.Incrementa Y di 13.Se Y2< X allora torna all’istruzione 24.Se Y2 = X allora FINE5.Incrementa Y di 16.Decrementa Y di 17.Se Y2> X allora decrementa Y di 1: FINE

Algoritmo di partenza

Algoritmo modificato ma equivalente

Daniela Fogli – Elementi di Informatica e Programmazione 2929

• Utilizzando strumenti matematici, studia macchine astratte

descritte formalmente, anziché macchine concrete

• Permette di ottenere risultati su “cosa una macchina è in grado di

calcolare” e quindi “quali problemi possono essere risolti”

a prescindere dalla tecnologia impiegata per realizzare i calcolatori

• La tecnologia cambia, i risultati generali no:

- La “macchina analitica” di Charles Babbage (mai realizzata)

è stata progettata nel 1830

- La “macchina di Turing” (di Alan Turing)

è stata pubblicata nel 1936

- Il primo calcolatore elettronico solo nel 1943

Informatica Teorica

Daniela Fogli – Elementi di Informatica e Programmazione 3030

Cenni sulla macchina di Turing

Macchina astratta utilizzata nell’informatica teorica per

formalizzare i concetti di algoritmo, esecutore e computazione

Macchine di estrema semplicità, ma…

“ogni funzione effettivamente computabile, complessa quanto si vuole, può essere computata da una macchina di Turing purché non si pongano limiti di tempo e di memoria” (Tesi di Church-Turing)

Questa tesi non può essere provata

Rappresenta una definizione del concetto intuitivo di

funzione computabile, ovvero una funzione che può essere

calcolata da un algoritmo finito

Daniela Fogli – Elementi di Informatica e Programmazione 3131

La macchina di Turing …

… è composta da:Nastro (potenzialmente infinito) suddiviso in caselle in cui possono essere scritti o letti simboli di un alfabeto (simboli: s0, s1, …, sn)

Testina di lettura/scrittura

Unità di spostamento per muovere la testina a destra o sinistra in ogni istante

Organo di controllo che determina il comportamento. E’ caratterizzato ad ogni istante da uno stato interno (stati: q1, q2, …, qm con m finito)

Daniela Fogli – Elementi di Informatica e Programmazione 3232

Macchina di Turing

s1 B

q1

nastro

Unità di controllo

(contenente un

elemento di stato)

Testina di lettura/scrittura

Unità di spostamento testina

Daniela Fogli – Elementi di Informatica e Programmazione 3333

Esecuzione di un programma

Il programma per una macchina di Turing consiste in un insieme di istruzioni, ciascuna formata da una quintupla <qi, sj, sk, D, qu> dove

qi: stato presente

sj: simbolo letto dal nastro

sk: simbolo sostituito sul nastro

D: direzione del movimento (R, L, N)

qu: stato futuro

Ad ogni istante la macchina esegue la quintupla che può essere applicata per l’attuale stato interno e per il simbolo in lettura

L’insieme delle quintuple che descrive una MTi può essere espresso tramite una tabella …

Daniela Fogli – Elementi di Informatica e Programmazione 3434

Esempio di Macchina di Turing

Ingressi

Stati

0

1

b

q1 q2

0q1R

1qhN

0q2R

0qhN

0q1R

0q2R

Dato il simbolo di ingresso letto sul nastro

(in questa macchina: 0, 1 o b) e lo stato

corrente macchina (in questa: q1 o q2) la

macchina

scrive un nuovo simbolo sul nastro al posto di quello letto

modifica lo stato della macchina

sposta la testina di lettura/scrittura di un posto a destra (R/right) o a sinistra (L/left) o la lascia dov’è (N/none)

Tabella delle transizioni di stato

Questa macchina calcola una ben precisa funzione: è quella MT che è in grado di “dire” se la sequenza in ingresso contiene un numero pari o dispari di 1

Daniela Fogli – Elementi di Informatica e Programmazione 3535

Funzioni calcolate e Macchine di Turing

Ogni macchina di Turing definisce una particolare funzione matematica che agisce sui dati in ingresso forniti dal nastro

Una Macchina di Turing MTi calcola una e una sola funzione fiNon è vero il contrario: se una funzione fj può essere calcolata da una Macchina di Turing MTj allora esistono infinite altre Macchine di Turing che calcolano la medesima funzione

Esistono problemi (funzioni) non computabili, ovvero per i quali non esistono algoritmi risolventi (macchine di Turing che le calcolano)

un esempio: non esiste un algoritmo che, dato un qualunque algoritmo e un dato, può decidere se esso termina oppure no

Daniela Fogli – Elementi di Informatica e Programmazione 3636

Macchina di Turing Universale

E’ una macchina che può simulare il comportamento di

una qualunque macchina di Turing una volta ricevuto in

ingresso la descrizione della macchina da simulare

(Se qualcuno è interessato all’informatica teorica, può consultare i capitoli 15, 16, 17 del libro di testo)

Elementi di Informatica e Programmazione

Esercizi sugli Algoritmi

Corsi di Laurea in:

Ingegneria CivileIngegneria per l’Ambiente e il Territorio

Università degli Studi di Brescia

Docente: Daniela Fogli

22

Esercizio 1

Scrivere l’algoritmo (in linguaggio naturale e con un diagramma di flusso) per il seguente problema: l’esecutore deve leggere in ingresso una sequenza di numeri naturali (i.e. interi positivi strettamente maggiori di zero) e calcolarne (per poi visualizzarli) il massimo, il minimo e la media

La sequenza si interrompe non appena viene introdotto un numero negativo o uguale a zero

Per esempio, data la sequenza 5, 1, 2, 3, 6, -5, il risultato deve essere:

“Il massimo è 6, il minimo è 1, la media è 3.4”

mentre, data la sequenza -2, il risultato deve essere

“La sequenza inserita è nulla”

Fare l’esecuzione passo-passo dell’algoritmo nei 2 casi sopra menzionati

33

Algoritmo per esercizio 1

Descrizione dell’algoritmo in linguaggio naturale:

n ← 0, media ← 0

Leggi un valore dall’esterno e inseriscilo nella variabile xSe x > 0 allora

max ← x, min ← x

Finché x > 0 ripeti

Se x > max allora max ← xSe x < min allora min ← xmedia ← media + xn ← n + 1Leggi un valore dall’esterno e inseriscilo nella variabile x

Fine ciclo

media ← media / nVisualizza “Massimo, minimo, media = ” seguita dai valori in max, min, media

altrimenti

Visualizza “La sequenza inserita è nulla”

Fine

44

← max

← min

← media

media ← media / n

Corpo del ciclo

x ←

x ←

x > 0

inizio

max ← xmin ← x

fine

no

‘La sequenza

inserita è nulla”

Schema a

blocchi

x > 0

no

media ← media + xn ← n + 1

no max ← x

x > max

x < min

min ← x

no

Corpo del ciclo

media ← 0n ← 0

55

Esecuzione passo passo dell’algoritmo: data la sequenza 5, 1, 2, 3, 6, -5

1. media ← 0, n ← 0

2. Lettura di un numero e memorizzazione nella variabile x (x ← 5)

3. Controllo se x > 0 � è vero

4. max ← 5, min ← 5

5. Controllo se x > 0 � è vero

6. Controllo se x > max � non è vero

7. Controllo se x < min � non è vero

8. media ← 0 + 5 = 5

9. n ← 0 + 1 = 1

10. Lettura di un numero e memorizzazione nella variabile x (x ← 1)

11. Controllo se x > 0 � è vero

12. Controllo se x > max � non è vero

13. Controllo se x < min � è vero

14. min ← 1

66

Esecuzione passo passo dell’algoritmo: data la sequenza 5, 1, 2, 3, 6, -5

15. media ← 1 + 5 = 6

16. n ← 1 + 1 = 2

17. Lettura di un numero e memorizzazione nella variabile x (x=2)

18. Controllo se x > 0 � è vero

19. Controllo se x > max � non è vero

20. Controllo se x < min � non è vero

21. media ← 6 + 2 = 8

22. n ← 2 + 1 = 3

23. Lettura di un numero e memorizzazione nella variabile x (x=3)

24. Controllo se x > 0 � è vero

25. Controllo se x > max � non è vero

26. Controllo se x < min � non è vero

27. media ← 8 + 3 = 11

28. n ← 3 + 1 = 4

77

Esecuzione passo passo dell’algoritmo: data la sequenza 5, 1, 2, 3, 6, -5

29 Lettura di un numero e memorizzazione nella variabile x (x = 6)30 Controllo se x > 0 � è vero

31 Controllo se x > max � è vero

32 max ← 6

33 Controllo se x < min � non è vero

34 media ← 11 + 6 = 17

35 n ← 4 + 1 = 5

36 Lettura di un numero e memorizzazione nella variabile x (x = -5)37 Controllo se x > 0 � non è vero

38 media ← 17 / 5 = 3

39 Visualizza “il Massimo è” 6

40 Visualizza “Il minimo è” 1

41 Visualizza “La media è” 3.4

42 Fine

88

Esecuzione passo passo dell’algoritmo: data la sequenza –2 (cioè sequenza nulla)

1 Lettura di un numero e memorizzazione nella variabile x (x = -2)

2 Controllo se x > 0 � non è vero

3 Visualizza ‘La sequenza inserita è nulla’

4 Fine

99

Esercizio 2

Sia y =

Scrivere l’algoritmo in linguaggio naturale e il diagramma di flusso

per il calcolo di y assumendo di acquisire r e q dall’esterno (dati di

input)

Nota: controllare che r e q siano interi positivi tali che r > q

∑=

r

qi i

1

1010

Algoritmo per esercizio 2

Descrizione dell’algoritmo in linguaggio naturale:

Leggi un valore dall’esterno e inseriscilo nella variabile r

Leggi un valore dall’esterno e inseriscilo nella variabile q

Se (r>0) AND (q > 0) AND (r > q) allora

y ← 0, i ← q

Finché i <= r ripeti

y ← y + 1/ i

i ← i + 1

Fine ciclo

Visualizza “Il risultato è”, y

altrimenti

Visualizza “Errore nell’immissione dati”

Fine

1111

inizio

r ←

q ←

(r > 0) AND (q >

0) AND (r > q)

y ← 0

i ← q

i <= r

y ← y + (1/i)

i ← i +1

‘Errore nell’immissione dei dati’

no

fine

no

←y

∑=

=

r

qi iy

1

1212

Esercizio 3

Sia y =

Scrivere l’algoritmo in linguaggio naturale e il diagramma di flusso per il calcolo di y assumendo di acquisire k dall’esterno (dato di input) controllando che k sia intero positivo. In caso di errata immissione continuare a chiedere k.

2

1 1

)1

(∑ ∑= =

+

k

i

i

j ji

1313

Algoritmo per esercizio 3

Descrizione dell’algoritmo in linguaggio naturale:

Inizio Ciclo

Leggi un valore dall’esterno e inseriscilo nella variabile k

Se k <= 0 allora Visualizza “Errore nell’immissione dati”

Torna a Inizio Ciclo Finché k <= 0

y ← 0, i ← 1

Finché i <= k ripeti

s ← 0, j ← 1

Finché j <= i ripeti

s ← s + 1/(i + j)

j ← j + 1

Fine ciclo

s ← s * s

y ← y + s

i ← i + 1

Fine ciclo

Visualizza “Il risultato è”, y

Fine1414

inizio

k ←

k <= 0

2

1 1

)1

(∑ ∑= =

+

=

k

i

i

j jiy

i<=k

j<=i

‘Errore nell’immissione dei dati’

S ← 0

j ← 1

S ← S + 1/(i+j)

j ← j+1sì

S ← S*S

y ← y + S

i ← i + 1

no

y ← 0

i ← 1

no

no

← y

fine

Ciclo a condizione

finale

Elementi di Informatica e Programmazione

Il Progetto degli Algoritmi

Corsi di Laurea in:

Ingegneria CivileIngegneria per l’Ambiente e il Territorio

Università degli Studi di Brescia

Docente: Daniela Fogli

Daniela Fogli – Elementi di Informatica e Programmazione 22

Risoluzione di un problema

Dato un problema da risolvere, non è facile né

efficiente, scrivere un programma in linguaggio

macchina che lo risolva

Facciamo un passo indietro …

Fasi del procedimento di risoluzione di un

problema:1. Analisi del problema e individuazione di una procedura di

risoluzione

2. Descrizione della procedura di risoluzione

3. Interpretazione della procedura di risoluzione

4. Attuazione della procedura di risoluzione

Daniela Fogli – Elementi di Informatica e Programmazione 33

Soggetto 2

�oppure

Soggetto 1

�Problema

Analisi Individuazione procedura

Descrizione procedura

Stesura

descrizione

procedura

Interpretazione

descrizione

Attuazione

procedura

Descrizione interpretata

Soluzione

attività

ingresso/uscita

Processo di risoluzione di un problema

Daniela Fogli – Elementi di Informatica e Programmazione 44

Esempio: montaggio di un elettrodomestico

SOGGETTO 2

Effettiva capacità di

risolvere il problema

Es. l’acquirente

dell’elettrodomestico

SOGGETTO 1

Conoscenza di come

si risolve il problema

Es. progettista di un

elettrodomestico

Daniela Fogli – Elementi di Informatica e Programmazione 55

Analisi del problema

L’analisi di un problema consiste in:Comprensione del problema: eliminando ogni ambiguità nella sua formulazione, focalizzando gli obiettivi, evidenziando i dati impliciti ed espliciti del problema

Modellazione del problema: creando un modello

Ricerca di una procedura di soluzione: scomponendo il problema e individuando una sequenza di “passi” per risolverlo

Daniela Fogli – Elementi di Informatica e Programmazione 66

Modellazione del problema

Cos’è un modello?Dato un certo problema, un modello del problema è una rappresentazione semplificata del problema stesso che evidenzia:

Gli elementi del problema

Le loro proprietà e le relazioni fra di essi

Mondo reale

- Titolo

- Autori

- stanza, scaffale

- …

Modello

Esempio: l’archivio di una biblioteca

Daniela Fogli – Elementi di Informatica e Programmazione 77

Relazione tra realtà e modello

Mondo

reale

Un MODELLO è un’astrazione

del problema. Rappresenta una

semplificazione completa e

autoconsistente della realtà,

creata per comprendere il

problema

analisi

Astrae dai dettagli

irrilevanti del mondo

MODELLO

f(x) = g'(y) ° h(z)

Daniela Fogli – Elementi di Informatica e Programmazione 88

Procedura di risoluzione di un problema

Risolvere un problema = risolvere un’opportuna successione di problemi più semplici � SCOMPOSIZIONE IN SOTTO-PROBLEMI

I sotto-problemi potrebbero dover essere a loro volta scomposti in sotto-sotto-problemi, e così via

La scomposizione deve giungere fino ai problemi elementari (o primitivi)

Ad ogni problema elementare corrisponde una istruzione elementare, che rappresenta la maniera di descrivere il problema elementare in modo che l’esecutore sia in grado di interpretarlo correttamente

Daniela Fogli – Elementi di Informatica e Programmazione 99

Un esempio (informale) di scomposizione di un problema

Gestione di una biblioteca in cui:I libri sono disposti sugli scaffali

La posizione di ogni libro è data da: numero dello scaffale e posizione nello scaffale

Esiste un schedario ordinato in cui ogni scheda riporta le seguenti informazioni:

Cognome e nome dell’autore

Titolo del libro

Data di pubblicazione

Numero dello scaffale in cui si trova

Posizione nello scaffale

Daniela Fogli – Elementi di Informatica e Programmazione 1010

Problema: richiesta di un libro

Come procedo?

1. Decido quale libro richiedere

2. Prelevo il libro

Il secondo passo va dettagliato, ovvero va scomposto

in sotto-problemi (procedura per raffinamenti

successivi o top-down)

Daniela Fogli – Elementi di Informatica e Programmazione 1111

Il problema diventa…

1. Decido quale libro richiedere

2. Cerco la scheda del libro nello schedario

3. Mi segno numero dello scaffale e posizione nello scaffale

4. Cerco lo scaffale

5. Cerco il libro nella sua posizione all’interno dello scaffale

6. Prelevo il libro

Non è un problema elementare!

Daniela Fogli – Elementi di Informatica e Programmazione 1212

Cercare la scheda…

Scompongo in sotto-sotto-problemi:1. Prendo la prima scheda

2. Il titolo, l’autore e la data corrispondono a quelli del libro che sto cercando? Se sì allora ho individuato la scheda, altrimenti passo alla scheda successiva e ripeto il controllo

3. Se le schede sono esaurite, allora il libro non esiste

Esistono metodi più efficienti per risolvere lo stesso

problema… come fareste voi?

Daniela Fogli – Elementi di Informatica e Programmazione 1313

Un metodo più efficiente…

1. Esamino la scheda centrale dello schedario

2. Se la scheda corrisponde al libro cercato allora termino la ricerca

3. Altrimenti cerco (con lo stesso metodo) nella metà inferiore o superiore dello schedario a seconda che il libro cercato precedao segua il libro indicato sulla scheda

In realtà il passo 2 deve “accorgersi” anche se il libro non esiste, diventa:

“se la scheda corrisponde al libro cercato oppure se la parte di schedario da esaminare è vuota allora termino la ricerca”

Daniela Fogli – Elementi di Informatica e Programmazione 1414

Più precisamente …

• Analisi del problema e identificazione procedura di

risoluzione

• Specifica dell’algoritmo risolutivo

• Programmazione in linguaggio di alto livello

• Traduzione del programma in linguaggio macchina

• Esecuzione del programma

Dal problema a un programma comprensibile dal calcolatore

Daniela Fogli – Elementi di Informatica e Programmazione 1515

Dall’analisi del problema all’esecuzione

problema

procedura di

risoluzione (informale)

algoritmo (formale)

programma

(alto livello)

programma

(ling. macchina)

analisi

specifica

programazione

traduzione

esecuzione

Esecutore del

linguaggio

macchina

Attività

dell’uomo svolte

con l’ausilio di

strumenti CASE e

e ambienti di

sviluppo

Attività

automatica svolta

da programmi

traduttori

Daniela Fogli – Elementi di Informatica e Programmazione 1616

Algoritmo

La procedura di risoluzione è specificata in maniera

formale come sequenza di istruzioni

� ALGORITMO RISOLUTIVO

Dati iniziali Dati finali

(soluzione)

ALGORITMO

Istruzioni che

operano sui dati

Daniela Fogli – Elementi di Informatica e Programmazione 1717

Algoritmo = Dati + Istruzioni

Dati:Numeri (naturali, interi, reali, …)

Caratteri alfanumerici (a, b, c, …)

Dati logici (vero, falso)

Vettori di elementi, matrici, … ([1,2,3], [[1,1],[1,2],…])

Immagini, suoni, …

Istruzioni:Istruzioni di ingresso/uscita (es. leggi, visualizza,…)

Istruzioni aritmetico-logiche (es. c = a * b)

Istruzioni di controllo (es. se … allora, ripeti…)

Daniela Fogli – Elementi di Informatica e Programmazione 1818

Come posso classificare i dati?

In base alla visibilità da parte dell’utenteVisibile (di ingresso o uscita)

Trasparente (dati temporanei di supporto)

In base alla variabilità nel tempoCostanti

Variabili (acquisizione dall’esterno o assegnazione)

In base alla strutturaElementari (interi, alfanumerici, logici, …)

Strutturati (vettori, matrici, …)

Daniela Fogli – Elementi di Informatica e Programmazione 1919

Variabili, espressioni e assegnamenti

Variabile: “contenitore” di datiHa un nome (es. x)… nel calcolatore i nomi delle variabili identificano una ben precisa locazione di memoria

Ad una variabile può essere assegnato un valore: es. x ← 10… nel calcolatore diventa il contenuto della locazione di memoria identificata dal nome della variabile

Le variabili possono comparire in espressioni aritmetiche (es. x-y) o logiche, e in predicati logiciLe espressioni possono essere assegnate ad altre variabili: ad es. scriveremo d ←x-y per indicare che d conterrà il risultato dell’espressione

Si potrebbe anche usare x o y al posto di d, in questo modo si sovrascrive il precedente valore

Daniela Fogli – Elementi di Informatica e Programmazione 2020

Espressioni aritmetiche

… sono formate da:

Operandi: variabili e costanti (si ipotizza di considerare solo

numeri interi)

Operatori: addizione (+), sottrazione (-), moltiplicazione (*),

divisione intera (/), modulo (mod)

Semantica: quella usuale dell’aritmetica

Esempi

(a mod 5) + b * 3

(b – c)/2 + 3 * a

Daniela Fogli – Elementi di Informatica e Programmazione 2121

Espressioni logiche

… sono formate da:

Operandi: espressioni aritmetiche

Operatori: operatori relazionali di uguaglianza (=),

minoranza (<) e maggioranza (>) fra numeri

Semantica: quella delle disequazioni fra numeri

Esempi

a = b

(b + d) < (10 * c)

Hanno un

valore logico

(vero o falso)

Daniela Fogli – Elementi di Informatica e Programmazione 2222

Predicati logici

… sono formati da:

Operandi: espressioni logiche e/o predicati

Operatori: operatori logici di congiunzione (AND), disgiunzione

(OR) e negazione (NOT)

Semantica: quella dell’Algebra di Boole

Esempi

(a < b) AND (b < c) OR (c = d+2)

Not( ( (a=10*b) AND (b = c) ) OR (c = 20) )

Hanno un

valore logico

(vero o falso)

Daniela Fogli – Elementi di Informatica e Programmazione 2323

Rappresentazione degli algoritmi

1. Linguaggio naturale/pseudo-codice

2. Diagrammi di flusso

3. Linguaggi di programmazione

Daniela Fogli – Elementi di Informatica e Programmazione 2424

Linguaggio naturale/pseudo-codice

Algoritmo in linguaggio naturale:

Leggi un valore dall’esterno e inseriscilo nella variabile xLeggi un secondo valore e inseriscilo nella variabile yCalcola x-y e assegna il risultato a dSe d è diverso a 0

allora

Se d è maggiore di 0

allora Visualizza “Il massimo è …” seguita dal valore contenuto in xaltrimenti Visualizza “Il massimo è …” seguita dal valore contenuto in y

altrimenti

Visualizza “I due numeri sono uguali!”

Fine

Problema: determinare il maggiore di due numeri interi ricevuti in ingresso (si assuma di avere a disposizione solo le istruzioni aritmetiche e quelladi confronto con lo zero)

Daniela Fogli – Elementi di Informatica e Programmazione 2525

I diagrammi di flusso

Termini equivalenti: diagrammi a blocchi, schemi a

blocchi, flowchart

Formalismo grafico per descrivere algoritmi

Elementi del linguaggio: simboli per indicare inizio e

fine, operazioni di ingresso/uscita (I/O), elaborazioni,

condizioni, sottoprogrammi

Daniela Fogli – Elementi di Informatica e Programmazione 2626

La simbologia comunemente utilizzata

inizio I/O fine

elaborazione selezione a 2 vie

condsì no

sottoprogramma

Daniela Fogli – Elementi di Informatica e Programmazione 2727

Blocchi Inizio e Fine

Inizio

Fine

Il blocco ‘Inizio’ denota il punto da cui l’esecuzione dell’algoritmo deve iniziare

Il blocco ‘Fine’ denota il punto in cui l’esecuzione dell’algoritmo termina

Daniela Fogli – Elementi di Informatica e Programmazione 2828

Blocco di I/O

Contiene un’istruzione di lettura di un valore dall’esterno (esempio lettura da tastiera) oppure un’istruzione di scrittura verso l’esterno (esempio scrittura a video)

x ←←←← lettura di un valore e sua memorizzazione nella variabile x

←←←← x scrittura (invio) del valore di x all’esterno

x ←

← x

Daniela Fogli – Elementi di Informatica e Programmazione 2929

Blocco di Elaborazione

Contiene un’istruzione di assegnamento come ad esempio:

x ←←←← y

x ←←←← x+1

x ←←←← y+z*w

Nei linguaggi di programmazione più comuni il simbolo ‘=‘ oppure ‘:=‘ viene usato al posto di ‘←’

x ← 0

Daniela Fogli – Elementi di Informatica e Programmazione 3030

Selezione a 2 vie (Blocco decisionale)

x = 0sì no

Rappresenta un’istruzione di controllo

Esempi di condizioni:

x = y

x < z

x >= z*w

Condizione

(predicato)

Possono anche

indicarsi con V

(vero) ed F (falso)

Se la condizione risulta vera allora l’esecuzione prosegue lungo l’arco denotato con ‘sì’ altrimenti prosegue lungo l’arco denotato con ‘no’

Daniela Fogli – Elementi di Informatica e Programmazione 3131

Blocco Sottoprogramma

Contiene un’istruzione di chiamatadi un sottoprogramma come ad esempio:

Max(x,y)

MCD(y,z)

Nei linguaggi di programmazione più comuni si distingue fra chiamate di procedura e chiamate di funzione

In ogni caso sono sottoprogrammi richiamabili dal programma principale o da altri sottoprogrammi

Media(x,y,z)

Daniela Fogli – Elementi di Informatica e Programmazione 3232

Collegamenti fra i blocchi

I blocchi sono collegati fra loro da archi

orientati

• L’arco identifica la sequenza delle operazioni da compiere

• La freccia identifica il flusso di esecuzione

Daniela Fogli – Elementi di Informatica e Programmazione 3333

Esempio: Problema 1

Algoritmo in linguaggio naturale:

Leggi un valore dall’esterno e inseriscilo nella variabile xLeggi un secondo valore e inseriscilo nella variabile yCalcola x-y e assegna il risultato a dSe d è diverso a 0

allora

Se d è maggiore di 0

allora Visualizza “Il massimo è …” seguita dal valore contenuto in xaltrimenti Visualizza “Il massimo è …” seguita dal valore contenuto in y

altrimenti

Visualizza “I due numeri sono uguali!”

Fine

Problema: determinare il maggiore di due numeri interi ricevuti in ingresso (si assuma di avere a disposizione solo le istruzioni aritmetiche e quelladi confronto con lo zero)

Daniela Fogli – Elementi di Informatica e Programmazione 3434

Diagramma di flusso

dell’algoritmo che risolve

il problema 1

x←

y←

‘numeri

uguali’

d ≠ 0no sì

‘Il max

è’, ← x

‘Il max

è’, ← y

d ← x - y

d > 0nosì

fine

inizio

Daniela Fogli – Elementi di Informatica e Programmazione 3535

Esecuzione passo passo del programma

1 Lettura di un numero e memorizzazione nella variabile x (supponiamo che il numero acquisito sia 8, quindi in memoria si avrà x=8)Lettura di un numero e memorizzazione nella variabile y (supponiamo che il numero acquisito sia 6, quindi in memoria si avrà y=6)

2 Calcolo di x-y e risultato in d � d = 2

3 Controllo se d ≠ 0 � è vero

4 Controllo se d>0 � è vero

5 Visualizzo “Il massimo è 8”

6 Fine

Daniela Fogli – Elementi di Informatica e Programmazione 3636

Esempio: Problema 2

Calcolo del Massimo Comune Divisore (MCD)

di due interi x ed y

Individuazione della procedura di risoluzione:

Fai la scansione di tutti i numeri compresi fra 1 e il minimo tra x ed y. Per

ognuno stabilisci se è un divisore comune ad x ed y (come? b è divisore di a

se a mod b = 0, ovvero se la divisione di a per b dà come resto 0). Ogni volta

che un numero preso in considerazione risulta divisore sia di x che di y

memorizzalo come attuale MCD in una variabile all’inizio posta a 1. Alla fine

della scansione la variabile conterrà il valore desiderato.

Daniela Fogli – Elementi di Informatica e Programmazione 3737

Algoritmo per il Massimo Comune Divisore

Descrizione dell’algoritmo in linguaggio naturale:

Leggi un valore dall’esterno e inseriscilo nella variabile xLeggi un valore dall’esterno e inseriscilo nella variabile ySe x < y allora min ← x altrimenti min ← y mcd ← 1

contatore ← 1

Finché (contatore <= min) ripeti

Se ((x mod contatore = 0) e (y mod contatore = 0))

allora mcd ← contatorecontatore ← contatore + 1

fine ciclo

Stampa “MCD =“ seguito dal valore in mcdFine

… e il ramo

“altrimenti” ?

Daniela Fogli – Elementi di Informatica e Programmazione 3838

x←

y←

inizio

x < y

min ← x

sì no

min ← y

mcd ← 1

contatore ← 1

mcd ← contatore

fine

‘MCD =’, ← mcd

(x mod contatore = 0) AND

(y mod contatore = 0)

no

contatore ← contatore + 1

contatore<=minno

Diagramma di flusso

dell’algoritmo che risolve il problema 2

Ciclo a

condizione

iniziale

… e se x e y

sono uguali?

Daniela Fogli – Elementi di Informatica e Programmazione 3939

Esecuzione passo passo dell’algoritmo

1. Lettura di due numeri e memorizzazione nelle variabili x e y(supponiamo di acquisire 6 e 9, quindi in memoria si avrà x=6 e y=9)

2 Controllo se x < y � è vero

3 min ← 6

4 mcd ← 1, contatore ← 1

5 controllo se (contatore <= min) � è vero

6 controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 1 e 9 è divisibile per 1 � è vero

7 mcd ← 1

8 contatore ← 2

9 controllo se (contatore <= min) � è vero

10 controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 2 e 9 è divisibile per 2 � non è vero

Daniela Fogli – Elementi di Informatica e Programmazione 4040

Esecuzione passo passo dell’algoritmo (cont.)

11 contatore ← 3

12 controllo se (contatore <= min) � è vero

13 controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 3 e 9 è divisibile per 3 � è vero

14 mcd ← 3

15 contatore ← 4

16 controllo se (contatore <= min) � è vero

17 controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 4 e 9 è divisibile per 4 � non è vero

18 contatore ← 5

19 controllo se (contatore <= min) � è vero

20 controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 5 e 9 è divisibile per 5 � non è vero

Daniela Fogli – Elementi di Informatica e Programmazione 4141

Esecuzione passo passo dell’algoritmo (cont.)

21 contatore ← 6

22 controllo se (contatore <= min) � è vero

23 controllo se ((x mod contatore = 0) e (y mod contatore = 0)),

cioè se 6 è divisibile per 6 e 9 è divisibile per 6 � non è vero

24 contatore ← 7

25 controllo se (contatore <= min) � non è vero

26 Stampa “MCD = 3” (cioè stampo il valore nella variabile mcd)

Esercizio:

Rifare l’esecuzione passo

passo assumendo di

acquisire x = 18 e y = 12

Daniela Fogli – Elementi di Informatica e Programmazione 4242

Esempio: Algoritmo di Euclide

Algoritmo di Euclide per il calcolo del Massimo Comun Divisore (MCD) di due interi ���� un altro algoritmo che risolve lo stesso problema

Descrizione dell’algoritmo in linguaggio naturale:

Leggi un valore dall’esterno e inseriscilo nella variabile xLeggi un valore dall’esterno e inseriscilo nella variabile ySe x < y allora scambia x con yDividi x per y: sia q il quoziente ed r il resto (cioè q ← x div y; r ← x mod y)*

Finché r ≠ 0 ripetix ←yy ← rq ← x div y

r ← x mod y

Fine ciclo

Visualizza “MCD = ” seguita dal valore in yFine

* div = divisione intera, mod = resto della divisione

Daniela Fogli – Elementi di Informatica e Programmazione 4343

Diagramma di flusso che descrive

l’algoritmo di Euclide (che risolve

il problema 2)

x←

y←

x < y

r ≠ 0

no

fine

inizio

a ← x

x ← y

y ← a

no

q ← x div y

r ← x mod y

x ← y

y ← r

‘MCD =’, ← y

nota: per realizzare lo

scambio ho bisogno di una

variabile di appoggio (a)

q ← x div y

r ← x mod y

Daniela Fogli – Elementi di Informatica e Programmazione 4444

Esecuzione passo passo dell’algoritmo di Euclide che risolve il problema 2

1 Lettura di due numeri e memorizzazione nelle variabili x e y(supponiamo di acquisire 6 e 9, quindi in memoria si avrà x=6 e y=9)

2 Controllo se x < y � è vero

3 Faccio lo scambio: a ←6, x ←9, y ←6

4 q ← x div y (q ← 1), r ← x mod y (r ← 3)

5 controllo se r ≠ 0 � è vero

6 x ← y (x ← 6), y ← r (y ← 3)

7 q ← x div y (q ← 2), r ← x mod y (r ← 0)

8 controllo se r ≠ 0 � non è vero

9 Stampa/visualizza “MCD = 3”

10 Fine Esercizio:

Rifare l’esecuzione passo

passo assumendo di

acquisire x = 18 e y = 12

Daniela Fogli – Elementi di Informatica e Programmazione 4545

Algoritmo di Euclide

Si basa sulla constatazione che:

Se x = y allora MCD(x,y) = x (oppure y)

Se x ≠ y allora, supponendo x > y, MCD(x,y) = MCD(x-y,y)

Infatti:

1. Se x > y e k è un divisore comune a x e a y, allora k è anche un divisore di x-y. Infatti x = k * d e y = k * r per qualche intero positivo d e r. Quindi: x-y = k*(d-r), essendo (d-r) ancora un intero positivo

2. Allo stesso modo è possibile dimostrare che se k è un divisore comune ad x-y e a y allora è un divisore anche di x

3. Quindi tutti i divisori comuni di x e y coincidono con i divisori comuni di x-y e y, dunque anche i massimi comuni divisori fra le due coppie di numeri coincidono

Quindi:

Se x > y allora MCD(x,y) = MCD(x-y,y) altrimenti MCD(y,x) = MCD(y-x,x)

Daniela Fogli – Elementi di Informatica e Programmazione 4646

L’algoritmo di Euclide in forma più semplice

Descrizione dell’algoritmo in linguaggio naturale:

Leggi un valore dall’esterno e inseriscilo nella variabile x

Leggi un valore dall’esterno e inseriscilo nella variabile y

Finché x ≠ y ripeti

Se x > y allora x ← x – y altrimenti y = y – x

Fine ciclo

Visualizza la frase “MCD = ” seguita dal valore in y

Fine

Daniela Fogli – Elementi di Informatica e Programmazione 4747

Diagramma di flusso

dell’algoritmo di Euclide (versione semplificata)

x←

y←

x ≠ y

x > ynosì

fine

inizio

‘MCD =’, ← y

x ← x – y y ← y – x

no

Daniela Fogli – Elementi di Informatica e Programmazione 4848

Esecuzione passo passo dell’algoritmo

1. Lettura di due numeri e memorizzazione nelle variabili x e y(supponiamo di acquisire 6 e 9, quindi in memoria si avrà x=6 e y=9)

2. Controllo se x ≠ y � è vero

3. Controllo se x > y � non è vero

4. y ← 3 (infatti: y ← 9 – 6)

5. Controllo se x ≠ y � è vero

6. Controllo se x > y � è vero

7. x ← 3 (infatti: x ← 6 – 3)

8. Controllo se x ≠ y � non è vero

9. Stampa/visualizza “MCD = 3”

10. Fine Esercizio:

Rifare l’esecuzione passo

passo assumendo di

acquisire x = 24 e y = 9

Daniela Fogli – Elementi di Informatica e Programmazione 4949

Due proprietà degli algoritmi

Correttezza: l’algoritmo risolve il problema per cui è stato progettato (efficacia). Gli algoritmi visti per il problema 2 sono tutti corretti rispetto al problema di calcolare il MCD

Complessità: legata al numero di istruzioni eseguite, cioè di passi di computazione, necessari per risolvere il problema (efficienza). Il primo algoritmo visto per il calcolo del MCD è più complesso degli altri due (a parità di dati iniziali, 26 passi col primo e 10 passi con il secondo e il terzo)

Daniela Fogli – Elementi di Informatica e Programmazione 5050

Esempio: Problema 3

Determinare il massimo fra n numeri positivi, finchè non si inserisce 0

Descrizione dell’algoritmo in linguaggio naturale:

max ← 0 (nota: la variabile max conterrà il risultato finale)Leggi un valore dall’esterno e inseriscilo nella variabile xFinché x ≠ 0 ripeti

chiama il sottoprogramma Massimo(x, max) e inserisci il risultato nella variabile cSe c è uguale a ‘Vero’ allora max ← x Leggi un valore dall’esterno e inseriscilo nella variabile x

Fine ciclo

Stampa “Il massimo è” seguita dal valore contenuto in maxFine

NOTA: Massimo(x,max) è un sottoprogramma che descrive la soluzione del seguente sottoproblema: ricevendo in ingresso x e max, ritorna un valore Vero se x>=max e un valore Falso se x<max (leggermente diverso dal problema 1… esercizio: fare lo schema a blocchi)

Daniela Fogli – Elementi di Informatica e Programmazione 5151

x ←

x ≠ 0

c ← Massimo

(x,max)

no sì

no

fine

inizio

max ← 0

max ← x‘Il massimo

è’, ← max

c=‘Vero’

x ←

Diagramma di flusso

dell’algoritmo che risolve il problema 3

Esercizio:

Fare l’esecuzione passo

passo assumendo di

acquisire la sequenza

3,5,1,4,0

Daniela Fogli – Elementi di Informatica e Programmazione 5252

Calcolo della moltiplicazione

Calcolo della moltiplicazione fra due numeri naturali x e yutilizzando solo operazioni di somma e sottrazione

Descrizione dell’algoritmo in linguaggio naturale:

Leggi un valore dall’esterno e inseriscilo nella variabile xLeggi un valore dall’esterno e inseriscilo nella variabile yz ← 0

Finché y > 0 ripetiz ← z + xy ← y – 1

Fine ciclo

Stampa/visualizza la frase “Prodotto = ” seguita dal valore in zFine

Daniela Fogli – Elementi di Informatica e Programmazione 5353

Diagramma di flusso

dell’algoritmo della moltiplicazione

x←

y←

y > 0

inizio

fine

z ← 0

z ← z + x

y ← y – 1

no

‘Prodotto =’, ← z

Daniela Fogli – Elementi di Informatica e Programmazione 5454

Esecuzione passo passo dell’algoritmo

1. Lettura di un numero e memorizzazione nella variabile x(supponiamo x=8)

2. Lettura di un numero e memorizzazione nella variabile y(supponiamo y=3)

3. Assegna 0 alla variabile z (che conterrà il risultato)

4. Controllo se y > 0 � è vero

5. z = 0 + 8 = 8

6. y = 3 – 1 = 2

7. Controllo se y > 0 � è vero

8. z = 8 + 8 = 16

9. y = 2 – 1 = 1

10. Controllo se y > 0 � è vero

11. z = 16 + 8 = 24

12. y = 1 – 1 = 0

13. Controllo se y > 0 � non è vero

14. Stampa/visualizza “Prodotto = 24”

15. Fine

Daniela Fogli – Elementi di Informatica e Programmazione 5555

Calcolo di xy

Calcolo di xy (con x e y numeri naturali) utilizzando il sottoprogramma ‘moltiplica(a,b)’

Descrizione dell’algoritmo in linguaggio naturale:

Leggi un valore dall’esterno e inseriscilo nella variabile xLeggi un valore dall’esterno e inseriscilo nella variabile yz ← 1

Finché y > 0 ripetiz ← moltiplica(z, x)y ← y – 1

Fine ciclo

Stampa/visualizza la frase “xy = ” seguita dal valore in zFine

* il sottoprogramma ‘moltiplica(a,b)’ riceve in ingresso due numeri naturali e ne restituisce il

prodotto (può essere ad esempio definito attraverso l’algoritmo precedente)

Daniela Fogli – Elementi di Informatica e Programmazione 5656

Diagramma di flusso

dell’algoritmo per il calcolo di xy

x←

y←

inizio

fine

z ← 1

y > 0

sìno

‘xy =’, ← z

y ← y – 1

z ← moltiplica(z,x)

chiamata di un

sottoprogramma

Daniela Fogli – Elementi di Informatica e Programmazione 5757

Esecuzione passo passodell’algoritmo

1 Lettura di un numero e memorizzazione nella variabile x(supponiamo x=2)Lettura di un numero e memorizzazione nella variabile y(supponiamo y=4)

2 Assegna 1 alla variabile z (che conterrà il risultato)

3 Controllo se y > 0 � è vero

4 z = moltiplica(1, 2) = 2

5 y = 4 – 1 = 3

6 Controllo se y > 0 � è vero

7 z = moltiplica(2, 2) = 4

8 y = 3 – 1 = 2

9 Controllo se y > 0 � è vero

Daniela Fogli – Elementi di Informatica e Programmazione 5858

Esecuzione passo passo dell’ algoritmo (cont.)

10 z = moltiplica(4, 2) = 8

11 y = 2 – 1 = 1

12 Controllo se y > 0 � è vero

13 z = moltiplica(8, 2) = 16

14 y = 1 – 1 = 0

15 Controllo se y > 0 � non è vero

16 Stampa/visualizza “xy = ”, z

17 Fine

Daniela Fogli – Elementi di Informatica e Programmazione 5959

Calcolo del fattoriale

Descrizione dell’algoritmo in linguaggio naturale:Inizio ciclo

Leggi un valore dall’esterno e inseriscilo nella variabile NSe N < 0 allora Stampa/visualizza la frase “Errore nell’inserimento del valore di N”

Torna a Inizio Ciclo Finché N < 0

fattoriale ← 1

Finché N > 1 ripeti

fattoriale ← fattoriale x NN ← N – 1

Fine ciclo

Stampa/visualizza la frase “Fattoriale = ” seguita dal valore in fattorialeFine

Calcolo del fattoriale del numero N

N! = N x (N-1) x (N-2) x … x 1 Esempio: 5! = 5 x 4 x 3 x 2 x 1 = 120

Daniela Fogli – Elementi di Informatica e Programmazione 6060

Diagramma di flusso

dell’algoritmo del fattoriale

N←

N > 1

inizio

fine

fattoriale ← fattoriale * N

N ← N – 1

N<0

fattoriale ← 1

no

no

‘Fattoriale =’, ←

fattoriale

‘Errore

nell’inserimento…’

Daniela Fogli – Elementi di Informatica e Programmazione 6161

Esecuzione passo passo dell’algoritmo

1 Lettura di un numero e memorizzazione nella variabile N (supponiamo N=4)

2 Controllo se N < 0 � non è vero

3 Assegna 1 alla variabile fattoriale (che conterrà il risultato)

4 Controllo se N > 1 � è vero

5 fattoriale = 1 * 4 = 4

6 N = 4 – 1 = 3

7 Controllo se N > 1 � è vero

8 fattoriale = 4 * 3 = 12

9 N = 3 – 1 = 2

10 Controllo se N > 1 � è vero

11 fattoriale = 12 * 2 = 24

12 N = 2 – 1 = 1

13 Controllo se N > 1 � non è vero (esce dal ciclo)

14 Stampa/visualizza “Fattoriale = 24”

15 Fine

Daniela Fogli – Elementi di Informatica e Programmazione 6262

Esercizio 1

Scrivere l’algoritmo (in linguaggio naturale e con un diagramma di flusso) per il seguente problema: l’esecutore deve leggere in ingresso una sequenza di numeri naturali (i.e. interi positivi strettamente maggiori di zero) e calcolarne (per poi visualizzarli) il massimo, il minimo e la media

La sequenza si interrompe non appena viene introdotto un numero negativo o uguale a zero

Per esempio, data la sequenza 5, 1, 2, 3, 6, -5, il risultato deve essere:

“Il massimo è 6, il minimo è 1, la media è 3.4”

mentre, data la sequenza -2, il risultato deve essere

“La sequenza inserita è nulla”

Fare l’esecuzione passo-passo dell’algoritmo nei 2 casi sopra menzionati

Daniela Fogli – Elementi di Informatica e Programmazione 6363

Esercizio 2

Sia y =

Scrivere l’algoritmo in linguaggio naturale e il diagramma di flusso

per il calcolo di y assumendo di acquisire r e q dall’esterno (dati di

input)

Nota: controllare che r e q siano interi positivi tali che r > q

∑=

r

qi i

1

Daniela Fogli – Elementi di Informatica e Programmazione 6464

Esercizio 3

Sia y =

Scrivere l’algoritmo in linguaggio naturale e il diagramma di flusso per il calcolo di y assumendo di acquisire k dall’esterno (dato di input) controllando che k sia intero positivo. In caso di errata immissione continuare a chiedere k.

2

1 1

)1

(∑ ∑= =

+

k

i

i

j ji

Elementi di Informatica e Programmazione

Dagli Algoritmi ai Programmi

Corsi di Laurea in:

Ingegneria CivileIngegneria per l’Ambiente e il Territorio

Università degli Studi di Brescia

Docente: Daniela Fogli

Daniela Fogli – Elementi di Informatica e Programmazione 22

Perché gli algoritmi non bastano…

Un algoritmo descritto con i linguaggi visti è spesso interpretabile

in modo ambiguo

Non è utilizzabile da un esecutore automatico

Ad esempio, in quegli algoritmi non si parlava di:

come sono codificati i dati

come avviene l’interazione con operatori umani

problemi legati alle caratteristiche fisiche: ad es. limiti nella dimensione dei numeri rappresentabili

Daniela Fogli – Elementi di Informatica e Programmazione 33

Dall’analisi del problema all’esecuzione di un programma

problema

proc. di risoluzione

(informale)

algoritmo (formale)

programma (alto livello)

programma

(ling. macchina)

analisi

specifica

programazione

traduzione

esecuzioneHw

Daniela Fogli – Elementi di Informatica e Programmazione 44

Programma

Un programma è la descrizione formale di un algoritmo

attraverso un linguaggio di programmazione

Scrivere programmi è un compito complesso (alcuni programmi

possono arrivare ad essere composti da alcuni milioni di righe di

istruzioni)

Il calcolatore esegue i programmi passo per passo: se i passi non

sono completi o non sono nell’ordine corretto, oppure se ci sono

dei conflitti tra i passi, il calcolatore non sarà in grado di portare a

termine il suo compito

Daniela Fogli – Elementi di Informatica e Programmazione 55

Il lavoro dei programmatori

I programmatori

Scrivono i programmi

Verificano l’esecuzione dei programmi (debugging)

Correggono eventuali errori

Preparano le istruzioni per gli utenti finali (manuali)

Modificano programmi esistenti per aumentarne l’efficienza o per adattarli a nuove esigenze

Ora anche utenti “poco esperti di programmazione” vengono messi in grado di scrivere programmi (linguaggi macro e di interrogazione sono presenti in molti ambienti applicativi)

Daniela Fogli – Elementi di Informatica e Programmazione 66

Linguaggi di programmazione

I linguaggi di programmazione di alto livello sono nati per consentire uno sviluppo “rapido” e “facile” di applicazioni informaticheQuesto tipo di linguaggi:

hanno costrutti più vicini al ragionamento umanoconsentono al programmatore di descrivere i problemi a un livello di astrazionedi poco inferiore a quello degli algoritmipermettono di ragionare secondo una logica vicina al problema piuttosto che alle caratteristiche fisiche del calcolatore

In sintesi, permettono di descrivere l’algoritmo in un formalismo che fa uso di un insieme ridotto di termini linguistici (della lingua inglese)

Con tali termini linguistici vengono formate le istruzioni che operano sui dati

Le istruzioni hanno un significato preciso e univoco

Daniela Fogli – Elementi di Informatica e Programmazione 77

Sintassi e semantica

Sintassi di un linguaggio:

insieme delle regole che specificano la scrittura di istruzioni formalmente corrette (ben formate), indipendentemente dal loro significato

Semantica di un linguaggio:

insieme delle regole che specificano il significato di ciascuna istruzione, cioè l’azione che viene compiuta quando l’istruzione viene eseguita

La struttura

Il significato

Daniela Fogli – Elementi di Informatica e Programmazione 88

Cos’è in pratica un programma?

Un programma è dunque una sequenza di istruzioni

di un linguaggio di programmazione di alto

livello (ad es.: Fortran, Cobol, Basic, C, Pascal, Ada,

C++, Java, Prolog, Lisp)

Un programma viene poi tradotto in linguaggio

macchina per essere eseguito dal calcolatore

Noi vedremo una parte del linguaggio C per scrivere

programmi in C

Daniela Fogli – Elementi di Informatica e Programmazione 99

Esempio: moltiplicazione tra numeri interi positivi

x←

y←

w > 0

inizio

fine

z ← 0

w ← y

z ← z + x

w ← w – 1

no

‘Prodotto =’, ← z

Daniela Fogli – Elementi di Informatica e Programmazione 1010

Dallo pseudo-codice al programma in C

Dati main() /* prodotto in C */

x, y interi positivi { unsigned int x, y;

w, z interi int w, z;

Risoluzione

leggi x e y scanf(“%d %d”, &x, &y);

z ← 0 z = 0;

w ← y w = y;

finchè w > 0 ripeti while (w > 0)

z ← z + x { z = z + x;

w ← w –1 w = w – 1;

fine ciclo }

scrivi z printf(“%d”, z);

fine }

dichiarazione

variabili

identificazione

programma

corpo del

programma

Aggiungiamo una dichiarazione dei dati

Daniela Fogli – Elementi di Informatica e Programmazione 1111

Variabili e tipi

Ogni variabile ha un tipo

Il tipo identifica le proprietà della variabile e le operazioni che su di essa possono essere compiute

Ogni variabile viene dichiarata prima del suo utilizzo

Dichiarazione del tipo delle variabili

Assegnamento dei valori alle variabili

Daniela Fogli – Elementi di Informatica e Programmazione 1212

Dichiarazioni di variabili e assegnamento di valori

La dichiarazione della variabile ‘z’ di tipo ‘intero’ crea un contenitore per memorizzare un valore intero positivo

z

z 0

La dichiarazione associa il nome ‘z’ a tale contenitore

L’assegnamento usa il contenitore per memorizzarvi il valore

Daniela Fogli – Elementi di Informatica e Programmazione 1313

Tipi di dati in C

Esempi di tipi in C:Char: per rappresentare caratteri

Int: per rappresentare interi

Float: per rappresentare numeri in virgola mobile in singola precisione (4 byte)

Double: per numeri in virgola mobile in doppia precisione (8 byte)

Negli esempi seguenti useremo principalmente il tipo int

Su variabili di tipo intero saranno applicabili operatori aritmetici (+, *, -, /, %)

Daniela Fogli – Elementi di Informatica e Programmazione 1414

Le istruzioni

Il corpo del programma è composto da una

sequenza di istruzioni

Nei linguaggi di programmazione si distinguono

solitamente 3 tipi di istruzioni:Istruzioni di ingresso/uscita

Istruzioni aritmetico-logiche

Istruzioni di controllo

Daniela Fogli – Elementi di Informatica e Programmazione 1515

Istruzioni di ingresso/uscita e istruzioni aritmetico-logiche

Le istruzioni di I/O consentono

l’acquisizione (ingresso) di dati dall’esterno

la presentazione dei risultati in uscita

in linguaggio C: scanf (per l’input) e printf (per l’output)

Le istruzioni aritmetico-logiche consentono

la manipolazione dei dati

la generazione di nuovi risultati

in quasi tutti i linguaggi (anche in C) sono assegnamenti

sintassi (in C): nomevariabile = espressione

esempio: y = (x+2)*3

Daniela Fogli – Elementi di Informatica e Programmazione 1616

Operazioni logiche

Le operazioni logiche fanno riferimento a variabili o

costanti di tipo booleano

Al contrario di altri linguaggi, in C non esiste il tipo

“boolean”, si usa il tipo int

In C:

NOT corrisponde a ‘!’

OR corrisponde a ‘| |’

AND corrisponde a ‘&&’

Gli operatori logici restituiscono tutti un numero:

0 per “falso”, >0 per “vero”

Daniela Fogli – Elementi di Informatica e Programmazione 1717

main()

{

int h, i, j, k;

int b1, b2, b3;

b1 = h > j; /* b1 ← vero se h è maggiore di j */

b2 = (h > j) || (j == k);

/* b2 ← vero se h è maggiore di j

o se j e k hanno lo stesso valore */

b3 = b1 && b2; /* b3 ← vero se sia b1 che b2 sono veri */

}

Esempi di utilizzo delle operazioni logiche

Notare differenza fra = (per assegnamento) e == per

confronto (valutazione di uguaglianza fra due valori)

Nota: commenti delimitati da /* e */

Non sono istruzioni C ma servono al

programmatore per “spiegare” il

significato del codice

Daniela Fogli – Elementi di Informatica e Programmazione 1818

Istruzioni di controllo

Le istruzioni di controllo consentono di modificare ilflusso di esecuzione delle istruzioni all’interno di un programma

L’esecuzione sequenziale viene alterata attraverso le istruzioni di controllo che introducono dei salti

Salto condizionato: il salto è condizionato al verificarsi di una condizione valutata durante l’esecuzione del programma

I salti sono introdotti dalle istruzioni di controllo, ovvero:

dalle selezioni (semplici o a due vie)dai cicli (a condizione iniziale e a condizione finale)

Daniela Fogli – Elementi di Informatica e Programmazione 1919

Selezione semplice

main()

{

/* selezione semplice */

if (cond)

{ …

/* blocco istruzioni */

/* eseguito solo se */

/* cond è vera */

}

}

blocco

istruzioni

condSì

No

Daniela Fogli – Elementi di Informatica e Programmazione 2020

Esempio di selezione semplice

A = 5V

FB ← C * D

C ← C + 1

main(){int A, B, C, D;…if (A = = 5){B = C * D;C = C + 1;} …

}

Daniela Fogli – Elementi di Informatica e Programmazione 2121

Selezione a due vie

main()

{ …

/* selezione a 2 vie */

if (cond)

{ … /* blocco 1 */ }

else

{ … /* blocco 2 */ }

}

cond

...

Sì No

blocco 1 blocco 2

...

Daniela Fogli – Elementi di Informatica e Programmazione 2222

Esempio di selezione a 2 vie

A ← A - B

B ← B - 1

A > BV F

B ← B - A

A ← A - 1

main(){int A, B;…if (A > B){A = A - B;B = B - 1;}else{B = B - A;A = A - 1;}…

}

Daniela Fogli – Elementi di Informatica e Programmazione 2323

test 1

test 2

test n

...

blocco

n+1blocco n

blocco 2

blocco 1

...

Si

Si

Si No

No

No

main()

{ …

/* selezione a più vie */

if (test1)

{ … /* blocco 1 */ }

else if (test2)

{ … /* blocco 2 */ }

else if (testn){ … /* blocco n */ }

else

{ … /* blocco n + 1*/ }

...

}

Selezione a più vie

Daniela Fogli – Elementi di Informatica e Programmazione 2424

Ciclo a condizione iniziale

condF

V

Blocco

istruzioni

main(){…/* ciclo a condizione

iniziale */

while (cond){/* blocco istruzioni

eseguito quando condè vero */

} … /* eseguito quando

cond è falso */}

Daniela Fogli – Elementi di Informatica e Programmazione 2525

Esempio di ciclo a condizione iniziale

I <= 10F

V

I ← I + 1

J ← J + I

J ← 0

I ← 0

Inizio

fine

Esercizio: cosa fa il programma? Quali

sono i valori finali di I e J?

main(){int I, J;J = 0;I = 0;while (I <= 10){I = I + 1;J = J + I;}

}

Tralasciamo dichiarazione dati

Daniela Fogli – Elementi di Informatica e Programmazione 2626

Algoritmo di Euclide per il MCD in C

x←

y←

x ≠ y

x > ynosì

fine

inizio

‘MCD =’, ← y

x ← x – y y ← y – x

no

main() /* MCD in C */{int x, y;scanf(“%d”, &x);scanf(“%d”, &y);while (x != y){if (x > y) x = x – y;else y = y – x;

} printf(“%d”, y);

}

Daniela Fogli – Elementi di Informatica e Programmazione 2727

Ciclo For

Si utilizza quando è noto a priori il numero di iterazioni da

compiere

Ad esempio:

Algoritmo che, preso in ingresso un numero n, calcola la somma dei quadrati dei numeri compresi fra 1 e n

Nell’algoritmo avrò un ciclo di n iterazioni (con n noto a priori,

cioè prima di entrare nel ciclo)

In tutti i linguaggi è previsto un costrutto del tipo “for i=1 to n do

sequenza istruzioni”… la sintassi precisa ovviamente cambia da

linguaggio a linguaggio

Daniela Fogli – Elementi di Informatica e Programmazione 2828

Esempio di uso del ciclo For

Dati

i, n, s interi

Risoluzione

leggi n

s = 0

for i=1 to i = n

s = s + i*i

fine for

scrivi s

i <= nF

V

s ← s + i * i

i ← i + 1

s ← 0

i ← 1

Inizio

fine

←s

n ←

È un ciclo a

condizione

iniziale

Pseudo-codice Schema a blocchi

Daniela Fogli – Elementi di Informatica e Programmazione 2929

Ciclo For in C

main(){int i, n, s;scanf(“%d”, &n);s = 0;for ( i=1; i<=n; i++ ){s = s + i*i;

}printf(“%d”, s);

}

Dati

i, n, s interi

Risoluzione

leggi n

s = 0

for i=1 to i = n

s = s + i*i

fine for

scrivi s

Pseudo-codice In C

Daniela Fogli – Elementi di Informatica e Programmazione 3030

Ciclo a condizione finale

main(){…/* ciclo a condizione finale */do{/* blocco istruzioni

eseguito almeno una volta e finchècond rimane vera */

} while (cond)

… /* eseguito quando condè falsa */

}

cond

...

blocco

istruzioni

...

No

Daniela Fogli – Elementi di Informatica e Programmazione 3131

Esempio di ciclo a condizione finale

i > 0F

V

j ← j * i

i ← i - 1

j ← 1

i ← 10

Inizio

fine

← j

main(){int i, j;j = 1; i = 10;do{j = j * i;i = i – 1;

} while (i > 0)

printf(“%d”, j);}

Esercizio: cosa calcola questo programma?

Daniela Fogli – Elementi di Informatica e Programmazione 3232

Variabili strutturate: i vettori

Le variabili dichiarate di un tipo predefinito diventano contenitori di singoli valori

int x � significa che la variabile x è un contenitore di un valore intero

E se volessimo memorizzare i guadagni di 12 mesi in 12 variabili? Possiamo…

a) … dichiarare dodici variabili di tipo intero: g1, g2, …, g12

b) … oppure dichiarare un VETTORE (ARRAY) g di 12 posizioni

Ogni vettore ha un nome e un tipo e può contenere un numero stabilito n di elementi, ogni elemento è identificato da un indice che varia fra 1 e n

Daniela Fogli – Elementi di Informatica e Programmazione 3333

Esempio: somma dei guadagni di 1 anno

main()

{

int g[12];

int w, z;

w = 0;

z = 0;

while (w < 12)

{

z = z + g[w];

w = w + 1;

}

printf (“%d, z);

}

Dati

g[12] vettore di interi

w, z interi positivi

Risoluzione

w = 1

z = 0

finchè (w <= 12) ripeti

z = z + g[w]

w = w + 1

fine ciclo

scrivi z

Nota:

In C il primo elemento

di un array è quello con

indice 0

Daniela Fogli – Elementi di Informatica e Programmazione 3434

Esercizio

Si consideri il problema di leggere una sequenza arbitraria di numeri interi in ingresso e mostrarla in uscita in ordine inversoSi supponga che la fine della sequenza sia indicata dal numero 0

Ad esempio: se viene acquisita la sequenza 5, -3, 2, -1, 6, 4, 0 in uscita verrà mostrata la sequenza 0, 4, 6, -1, 2, -3, 5

Risolvere il problema usando i vettori e assumendo che il numero massimo di elementi acquisibili dall’esterno sia 100

Scrivere il diagramma di flusso

Scrivere il corrispondente programma in C

Daniela Fogli – Elementi di Informatica e Programmazione 3535

inizio

conta ← 0

fine ← 0

a[conta]=0

(conta < 100) AND (fine = 0)

a[conta] ←

no

fine ← 1

conta ← conta + 1

conta≥0

conta ← conta - 1

no

fine

(Ipotesi: massimo numero di elementi acquisibili = 100)

← a[conta]

conta ← conta - 1

no

Inversione della sequenza: diagramma di flusso

Daniela Fogli – Elementi di Informatica e Programmazione 3636

Programma ‘inverti-sequenza’

main()

{

int a[100], conta, fine;

conta = 0; fine = 0;

while ((conta < 100) && (!fine))

{

scanf(“%d”, &a[conta]);

if (a[conta] == 0) fine = 1;

conta = conta + 1;

}

conta = conta - 1;

while (conta >= 0)

{

printf(“%d”,a[conta]);

conta = conta – 1;

}

}

Potevo usare un ciclo for?

Daniela Fogli – Elementi di Informatica e Programmazione 3737

Variabili strutturate: matrici

Le matrici sono array multidimensionali, cioè i cui elementi

sono identificati da più indici contemporaneamente

Ogni indice identifica una dimensione della matrice

Esempio: nella gestione del magazzino di un’azienda si vuole

tenere traccia, per ognuno dei suoi 50 prodotti, della disponibilità

mensile

Usiamo una matrice d[i,j] dove i è l’indice che identifica l’i-esimo

prodotto (1..50) e j è l’indice che identifica il mese a cui si riferisce

la disponibilità (1..12)

Daniela Fogli – Elementi di Informatica e Programmazione 3838

Matrice bidimensionale (in generale)

Dati relativi al mese j-esimo

d[1,1] d[1,2]

d[2,1] d[2,2]

d[i,1] d[i,2]

d[50,1]d[50,2] d[50,j] d[50,12]

d[i,j] d[i,12]

d[1,j]

d[2,j]

d[1,12]

d[2,12]… …

……

Dati

relativi

al prodotto

i-esimo

Daniela Fogli – Elementi di Informatica e Programmazione 3939

Matrice bidimensionale (in C)

Indice j da 0 a 11

(per indicare i 12 mesi)

d[0,0] d[0,1]

d[1,0] d[1,1]

d[i,0] d[i,1]

d[49,0] d[49,1] d[49,j] d[49,11]

d[i,j] d[i,11]

d[0,j]

d[1,j]

d[0,11]

d[1,11]… …

……

Indice i da 0 a 49

(per indicare i 50 prodotti)

ATTENZIONE: in C gli indici partono sempre da 0

Daniela Fogli – Elementi di Informatica e Programmazione 4040

Esempio: inizializzazione della matrice d

i < 50F

V

d[i,j] ← 0j ← j + 1

i ← 0

Inizio

fine

main() /* inizializza matrice */{int i, j;int d[50,12];i = 0;while (i < 50){

j = 0;while (j < 12){d[i,j] = 0;j = j + 1;

}i = i + 1;}

}

j < 12

V

i ← i + 1

F

Ordine di

inizializzazione

d(0,0) d(0,1)d(0,2)…d(0,11)d(1,0)d(1,1)…d(1,11)……d(49,0)d(49,1)…d(49,11)

j ← 0

Daniela Fogli – Elementi di Informatica e Programmazione 4141

For anziché While

main() /* inizializza matrice */{int i, j;int d[50,12];

for (i = 0; i<50; i++)

{for (j = 0; j<12; j++) d[i,j] = 0;}

}

main() /* inizializza matrice */{int i, j;int d[50,12];i = 0;while (i < 50){

j = 0;while (j < 12){d[i,j] = 0;j = j + 1;

}i = i + 1;}

}

con una sola istruzione posso omettere le parentesi graffe

… anche queste avrei potuto ometterle

Daniela Fogli – Elementi di Informatica e Programmazione 4242

Variabili strutturate: struct

Nei vettori e nelle matrici gli elementi devono essere tutti dello

stesso tipo

Si supponga che per ogni elemento si vogliano però memorizzare

diversi dati

Ad esempio: per ogni studente si vuole memorizzare numero di

matricola, nome, cognome, numero degli esami sostenuti

Tipi definiti dall’utente: a partire dai tipi di dati disponibili nel

linguaggio l’utente (programmatore) può definire altri tipi

Ad esempio è possibile definire delle strutture

Una variabile avente una certa struttura definita comprende più

componenti (detti campi)

Daniela Fogli – Elementi di Informatica e Programmazione 4343

Esempio: la struttura “studente”

studente

matricola = 25891

nome = Mario

cognome = Rossi

num_esami = 0

DEFINIZIONE DEL

“TIPO” studente

struct studente /* in C */

{

int matricola;

char nome[30];

char cognome[30];

int num_esami;

}

DICHIARAZIONE

struct studente stud;

ASSEGNAMENTO

stud.matricola = 25891;

stud.num_esami = stud.num_esami + 1;

Daniela Fogli – Elementi di Informatica e Programmazione 4444

Array di ‘struct’ e accesso diretto

main(){struct studente{int matricola;char nome[30];char cognome[30];int num_esami;

};

struct studente s[100];…s[3].num_esami = 0;…

}Assegna il valore 0 al numero di esami dello studente di indice 3

Daniela Fogli – Elementi di Informatica e Programmazione 4545

I sottoprogrammi

Soluzione di problemi complessi

Lavoro di più persone in modo coordinato

La struttura dei programmi deve essere il più possibile comprensibile e modulare

Ricordate il concetto di strutturazione in sottoproblemi e di problemi elementari?

I sottoprogrammi corrispondono alla soluzione di sottoproblemi

Facilitati comprensione, controllo correttezza, manutenzione

Daniela Fogli – Elementi di Informatica e Programmazione 4646

Strutturazione in sottoprogrammi

Per ogni problema terminale esiste un’istruzione del linguaggio che

lo risolve

Ogni sottoproblema sufficientemente limitato può essere assunto

come problema terminale

Per ogni sottoproblema si scrive un sottoprogramma

A questo punto è come se il linguaggio si arricchisse di nuove

istruzioni… ogni nuova istruzione è la chiamata di un

sottoprogramma e quindi corrisponde all’esecuzione di un

sottoprogramma (una certa sequenza di istruzioni del linguaggio

di programmazione)

Daniela Fogli – Elementi di Informatica e Programmazione 4747

Esempio di uso di sottoprogrammi

Supponiamo di disporre di una matrice p contenente i valori dei fatturati relativi ai 100 prodotti di un’azienda per ogni mese dell’anno (p ha cioè 100 righe e 12 colonne)

p[i,j] contiene il fatturato del prodotto i nel mese j

Si vuole visualizzare il fatturato mensile medio di ogni prodotto specificato dall’utente attraverso l’inserimento dell’indice relativo al prodotto

Scriviamo il programma supponendo di disporre di un sottoprogramma che calcola la media

Daniela Fogli – Elementi di Informatica e Programmazione 4848

Programma principalein pseudo-codice e in C

main()

{

int w;

float z;

int fine;

fine = 0;

while (!fine)

{

scanf(“%d”,&w);

if (w > -1)

{ z = media(w);

printf(“%d”,z); }

else

fine = 1;

}

}

Dati

w interoz realefine booleano

Risoluzione

fine = falsofinchè (non fine) ripeti

leggi wse (w > -1)

z = media(w)scrivi z

altrimentifine = vero

fine condizionefine ciclo

fine

Daniela Fogli – Elementi di Informatica e Programmazione 4949

Due note

La variabile ‘fine’ è usata per contenere un valore booleano

0 vuol dire “falso”, >0 vuol dire “vero” (usiamo 1 in questo caso per indicare il valore “vero”)

(!fine) vuole dire NOT(fine), per cui se fine=0 allora (!fine) èvero, mentre se fine>0 allora (!fine) è falso

La locazione p[0,0] contiene il fatturato del primo prodotto nel mese di gennaio

la numerazione degli indici di vettori e matrici inizia dallo zero

Se l’utente inserisce un indice (del prodotto) >-1 (cioè 0 o un numero positivo) allora viene fatto il calcolo della media e viene visualizzato il fatturato medio relativo al prodotto altrimenti l’esecuzione termina

Daniela Fogli – Elementi di Informatica e Programmazione 5050

La funzione ‘media’

float media(int w)

{ int i, s;

float z;

int p[100][12];

i = 0; s = 0;

while (i < 12)

{

s = s + p[w][i];

i = i + 1;

}

z = s / 12;

return (z);

}

Funzione media(w)

Dati

i, s interi

z reale

p[100,12] matrice di interi

Risoluzione

i = 0 e s = 0

finchè (i < 12) ripeti

s = s + (p[w, i])

i = i + 1

fine ciclo

z = s / 12

restituisci z

fine funzione

w è il parametro della funzione media

Daniela Fogli – Elementi di Informatica e Programmazione 5151

Domanda

Che controllo manca nei programmi?

…cosa succede se l’utente, come indice di prodotto, inserisse 120?

Nella funzione ‘media’ si va ad accedere alle locazioni p[120,i] con i che varia fra 0 e 11

In ogni caso tutte queste locazioni sono al di fuori della nostra matrice!

Daniela Fogli – Elementi di Informatica e Programmazione 5252

Un altro esempio di uso di sottoprogrammi

Uno stesso sottoproblema si può presentare più volte in momenti

diversi

Con i sottoprogrammi si riduce il numero delle istruzioni del

programma

Invece di ripetere la stessa sequenza di istruzioni più volte si scrive

un sottoprogramma e lo si richiama tutte le volte che serve

Esempio: calcolo di z = x2 + y2

Le stesse funzioni scanf e printf del C che abbiamo visto sono

sottoprogrammi disponibili in (una libreria del) C

Daniela Fogli – Elementi di Informatica e Programmazione 5353

Calcolo di x2 + y2

main()

{

int x,y,x2,y2,q,w,z;

scanf(“%d %d”,&x,&y);

w = x; z = 0;

while (w > 0)

{ z = z + x;

w = w – 1; }

x2 = z;

w = y;

z = 0;

while (w > 0)

{ z = z + y;

w = w - 1; }

y2 = z;

q = x2+y2;

printf(“%d”,q);

}

Inizio

leggi

x e y

w ←←←←x

z ←←←←0

w> 0

z ←←←←z++++y

w ←←←←w -1

x2 ←←←←z

w ←←←←y

z ←←←←0

z ←←←←z++++x

w ←←←←w -1

y2 ←←←←z

q ←←←←x2+y2

scrivi

“x2+ y2=q”

fine

w> 0

F

F

V

V

I prodotti x*x e y*y sono

ottenuti con somme successive

Daniela Fogli – Elementi di Informatica e Programmazione 5454

Funzione quad(a) Calcolo di x2 + y2

Inizio

leggi

x e y

x2 ←←←←quad(x)

y2 ←←←←quad(y)

q ←←←← x2 + y2

scrivi

“x2+ y2=q”

fine

Funzione

quad (a)

w ← a

z ← 0

z ←←←←z + + + + a

w ←←←←w-1

w> 0V

ritorna z

F

Esercizio

Scrivere la

funzione quad e il

main in C

Calcolo di x2 + y2

con chiamata di sottoprogramma

Daniela Fogli – Elementi di Informatica e Programmazione 5555

La funzione ‘quad’

int quad(int a)

{

int w, z;

w = a;

z = 0;

while (w > 0)

{

z = z + a;

w = w - 1;

}

return (z);

}

Funzione

quad (a)

w ← a

z ← 0

z ←←←←z + + + + a

w ←←←←w -1

w> 0V

ritorna z

F

Daniela Fogli – Elementi di Informatica e Programmazione 5656

Inizio

leggi

x e y

x2 ←←←←quad(x)

y2 ←←←←quad(y)

q ←←←← x2 + y2

scrivi

“x2+ y2=q”

fine

Programma principale

main()

{

int x, y, x2, y2, q;

scanf(“%d”,&x);

scanf(“%d”,&y);

x2 = quad(x);

y2 = quad(y);

q = x2 + y2;

printf(“%d”,q);

}

Chiamata di funzione a cui

viene passato il parametro x

Chiamata di funzione a cui

viene passato il parametro y

Elementi di Informatica e Programmazione

Linguaggi di programmazione di alto livello, ambienti di programmazione

Corsi di Laurea in:

Ingegneria CivileIngegneria per l’Ambiente e il Territorio

Università degli Studi di Brescia

Docente: Daniela Fogli

Daniela Fogli – Elementi di Informatica e Programmazione 22

memoria centrale

unità centrale interfaccia di

ingresso-uscita periferica

bus di sistema

interfaccia di

ingresso-uscita periferica

sottosistema

unità centrale-memoria

sottosistema

di ingresso-uscita

Il punto della situazione…

DATI

STATO

Daniela Fogli – Elementi di Informatica e Programmazione 33

istruzioni

MEMORIA

01010111100110011101011110011111011100000001100111010111000111010110011110011001

0101000111011000101001111001100101011111100000000101010010011001

011100000001100101010001110110000101111110000000

0101000111011000

0101110111011000

dati

Ciclo: add $r1, $r1, $r1

sub $r1, $r1, 1

beq $r1, $zero, ciclo

Esempio: gestione e ordinamento di una rubrica telefonica:sarebbe poco praticabile ricorrere al linguaggio assembler

Dati “troppo elementari”

(numeri con segno / virgola mobile)

Strutture di controllo:

solo salti (condiz/incond)

Programma “monolitico”

(no sotto-programmi)

Limiti del linguaggio Assembler

Daniela Fogli – Elementi di Informatica e Programmazione 44

Un passo indietro sull’Assembler …

Supponendo che f, g, h, i, j corrispondano ai registri $r0, $r1, $r2, $r3, $r4, la specifica in Assembler potrebbe essere la seguente

beq $r3, $r4, L1 # va a L1 se i è uguale a j

add $r0, $r1, $r2 # f = g + h

L1: sub $r0, $r0, $r3 # f = f - i

f ←g + h

f ←f - i

i==j

no

Esempio: salto condizionato (beq = branch if equal)

Daniela Fogli – Elementi di Informatica e Programmazione 55

Un passo indietro sull’Assembler …

Supponendo che f, g, h, i, j corrispondano ai registri $r0, $r1, $r2,

$r3, $r4, la traduzione potrebbe essere la seguente

bne $r3, $r4, Allora # branch if not equal

sub $r0, $r1, $r2

j Esci # salto incondizionato (jump)

Allora: add $r0, $r1, $r2

Esci: …

f ←g - h f ←g + h

i!=jsì no

Esempio: salto condizionato e salto incondizionato

Daniela Fogli – Elementi di Informatica e Programmazione 66

Linguaggi di programmazione di alto livello

Permettono di specificare gli algoritmi in manieraPrecisa (termini linguistici di significato preciso e univoco)

Ma più “astratta” rispetto al linguaggio macchina

Ciascuna istruzione in un linguaggio di alto livello corrispondesolitamente a più istruzioni in linguaggio macchina

Vantaggi principali:consentono lo sviluppo di sistemi complessi

gli errori commessi sono inferiori

il codice è più facile da “mantenere”

indipendenza dalla macchina

Daniela Fogli – Elementi di Informatica e Programmazione 77

Paradigmi di programmazione

L’insieme delle caratteristiche che determina il modo di affrontare il progetto e la codifica di un programma, lo “stile di programmazione”

Prolog++PrologLogico

CLOSLisp, APL, HaskellFunzionale

C++, Java,

VisualBasic,…

Pascal, Cobol, C…Imperativo

Ad oggetti-

Daniela Fogli – Elementi di Informatica e Programmazione 88

Tre tipi di istruzioni

Istruzioni di ingresso/uscita

Istruzioni aritmetico-logiche

Ruolo centrale dell’assegnamento

Istruzioni di controllo

NB: le stesse del linguaggiomacchina!

Il paradigma imperativo

Diversi tipi di astrazione

Astrazione sui dati

Tipi di dati predefiniti e definiti dal programmatore (vs. codici binari)

Astrazione sul controllo

Condizionali e cicli (vs. istruz di salto condiz/incondiz)

Astrazione procedurale (scarso supporto da ling. macchina)

Daniela Fogli – Elementi di Informatica e Programmazione 99

A = BV

FB ← C * D

C ← C * 2

main() /* C */

{

int A, B, C, D;

if (A = = B)

{

B = C * D;

C = C * 2;

}

}

// A, B, C, D costanti…

lw $r1, $r0, A

lw $r2, $r0, B

lw $r3, $r0, C

lw $r4, $r0, D

bne $r1, $r2, CONT

mul $r2, $r3, $r4

sw $r2, $r0, B

add $r3, $r3, $r3

sw $r3, $r0, C

CONT:

Astrazione sul controllo: esempio

Daniela Fogli – Elementi di Informatica e Programmazione 1010

Astrazione procedurale

Soluzione di problemi complessi (eventualmente lavoro di più

persone in modo coordinato): è utile scomporre un programma in

sotto-programmi, detti procedure

Facilitano leggibilità, funzionalità (controllo correttezza),

manutenzione del programma

Definizione di una procedura (nome + corpo istruzioni):

nome_procedura(<parametri formali>)

{ istruzioni…}

Parametri formali: sono gli argomenti della procedura (passati

dalla procedura o dal programma chiamante): variabili utilizzate

dalla procedura al suo interno

Daniela Fogli – Elementi di Informatica e Programmazione 1111

Astrazione procedurale (cont.)

Chiamata di una procedura nel programma:nome_procedura (<parametri attuali>)

Parametri attuali: variabili o espressioni il cui valore è attribuito ai parametri formali (passaggio dei parametri)

I tipi dei parametri attuali devono corrispondere ai parametri formali

Effetto della chiamata:passaggio dei parametri

controllo passato alla procedura, le cui istruzioni vengono eseguite (poi il controllo ritorna all’istruzione successiva alla chiamata)

Daniela Fogli – Elementi di Informatica e Programmazione 1212

Passaggio dei parametri: 2 modalità

Passaggio per valore: il corrispondente parametro attuale non è modificato (viene fatta una copia)

Passaggio per indirizzo: la zona di memoria del parametro formale non contiene il valore, ma l’indirizzodel parametro attuale; tutte le operazioni sul parametro formale sono in realtà effettuate sul parametro attuale

In C è disponibile solo il passaggio per valore

Daniela Fogli – Elementi di Informatica e Programmazione 1313

int calcolaFattoriale(int w)

{ int fatt;

fatt=1;

while (w>0)

{ fatt = fatt * w;

w = w – 1;

}

return fatt;

}

main()

{ int numero, fattoriale;

….

numero = 5;

fattoriale = calcolaFattoriale(numero);

printf (“%d”, fattoriale);

}

Esempio (in C)

PROGRAMMA

CHIAMANTE

PROGRAMMA

CHIAMATO

CHIAMATA

w

RITORNO

fatt

numero

fattoriale

Al ritorno dal programma chiamato la variabile numero ha ancora valore 5

Daniela Fogli – Elementi di Informatica e Programmazione 1414

Se fosse un passaggio per indirizzo

int calcolaFattoriale(int w)

{ int fatt;

fatt=1;

while (w>0)

{ fatt = fatt * w;

w = w – 1;

}

return fatt;

}

main()

{ int numero, fattoriale;

….

numero = 5;

fattoriale = calcolaFattoriale(numero);

printf (“%d”, fattoriale);

}

PROGRAMMA

CHIAMANTE

PROGRAMMA

CHIAMATO

CHIAMATA

w numero indirizzo di

“numero”

Al ritorno dal programma chiamato la

variabile “numero” avrebbe valore 0

MA IN C NON E’ COSI’

Daniela Fogli – Elementi di Informatica e Programmazione 1515

Oltre il paradigma imperativo

Il paradigma imperativo si basa sul modello di calcolatore di Von

Neumann (variabili come diretta astrazione delle parole di

memoria, esecuzione stessa di un programma, …)

Paradigma funzionale: si basa sull’osservazione che ogni

programma può essere formulato come la definizione di una

funzione dall’insieme delle variabili di ingresso all’insieme delle

variabili di uscita

Paradigma logico: si basa sull’osservazione che ogni programma

può essere formulato come un’asserzione della quale si voglia

dimostrare la verità (o la falsità); la prova dell’asserzione

corrisponde all’esecuzione del programma

Daniela Fogli – Elementi di Informatica e Programmazione 1616

Paradigma Funzionale

Programma ≡ Funzione: In � Out

Esecuzione di un programma ≡ Valutazione di una funzione in

corrispondenza di determinati valori di ingresso

Esempio:

fattoriale(n) ≡ if n=0 then 1

else n * fattoriale(n-1)

si basa sulla definizione del fattoriale

usa una chiamata ricorsiva

Capostipite dei linguaggi funzionali è il LISP

Daniela Fogli – Elementi di Informatica e Programmazione 1717

Paradigma Logico

Un programma logico è costituito da:Assiomi: asserzioni ritenute sempre vere nel dominio considerato

Regole di inferenza: definiscono relazioni

Asserzioni: rappresentano relazioni delle quali si vuole conoscere se sono vere o false

Esempio:

genitore(adamo, caino)

genitore(adamo, abele)

genitore(eva, abele)

genitore(Y,X) => figlio(Y,X)

genitore(X,Z), genitore(Z,Y) => nonno(X,Y)

assiomi

regole di inferenza

Daniela Fogli – Elementi di Informatica e Programmazione 1818

Paradigma logico: esempio (cont.)

Consideriamo le seguenti asserzioni:

genitore(abele, caino)

figlio(caino, adamo)

genitore(adamo, X)

nonno(abele, X)

L’esecuzione del programma produce:

genitore(abele, caino) falso

figlio(caino, adamo) vero

genitore(adamo, X) vero per X = caino e X = abele

nonno(abele, X) vero per X = nessun valore

Capostipite dei linguaggi logici è il PROLOG

Daniela Fogli – Elementi di Informatica e Programmazione 1919

La programmazione a oggetti

Nella programmazione ad oggetti, un programma è composto da un insieme oggetti che rappresenta una realtà di interesse

Un programma in esecuzione è un insieme dinamico di oggetti che interagiscono tra loro

Esempio: programma per la gestione della segreteria studenti dell’università sarà composto di oggetti che rappresentano oggetti concreti della realtà di interesse (gli studenti) e le entità concettuali relative (esami sostenuti, piani di studio, …)

Esempi di linguaggi a oggetti: Java, VisualBasic, C#

Daniela Fogli – Elementi di Informatica e Programmazione 2020

Occultamento e Incapsulazione nei linguaggi imperativi

Con i linguaggi imperativi possiamo suddividere il programma in sotto-programmi, ognuno ha due parti:

Interfaccia: la specifica delle funzionalità [e.g. functionmedia(w as integer), function radice(i as integer)]Corpo: concreta implementazione delle funzionalità

Realizza information hiding (“occultamento delle informazioni”) a livello di funzionalità

Possiamo anche creare delle “strutture dati”, esempio:

struct punto {

float x;

float y;

float z;}

Ma esse sono accessibili completamente dai moduli del programma che definiscono le procedure per accedere ai dati, manipolandonela struttura interna

Daniela Fogli – Elementi di Informatica e Programmazione 2121

Occultamento e Incapsulazione nella Programmazione ad Oggetti

Realizza l’occultamento sia delle funzionalità che delle strutture

dati

Un oggetto realizza l’incapsulazione di una struttura dati:

nasconde una struttura per la memorizzazione dei dati, rendendo

disponibili all’esterno le procedure per accedervi e modificarla

Realizza il principio dell’information hiding nella sua forma più

completa

Se cambia la rappresentazione interna dei dati, ma le definizioni

delle procedure rimangono invariate, le modalità di utilizzo

dell’oggetto dall’esterno non cambiano

Daniela Fogli – Elementi di Informatica e Programmazione 2222

Caratteristiche di un oggetto

Usiamo un’analogia: il televisore*

⇒ ha un nome per referenziarlo (lo chiamiamo televisore)

⇒ ha un comportamento⇒ ha delle proprietà (dette anche attributi)

*Tratto da [Luca Cabibbo, “Fondamenti di informatica – Oggetti e Java”, McGraw Hill, 2004]

Daniela Fogli – Elementi di Informatica e Programmazione 2323

Il comportamento

Il televisore sa fare delle cose:Sa accendersi

Sa sintonizzarsi su un canale

Sa variare il volume

Sa spegnersi

Obiezione: è l’utente che fa fare al televisore certe cose!

No! L’utente richiede al televisore di eseguire queste operazioni, e il televisore le esegue

L’utente invia un comando al televisore

Daniela Fogli – Elementi di Informatica e Programmazione 2424

Oggetti software e comportamento

Anche un oggetto software sa eseguire delle operazioni che ne

caratterizzano il comportamento

Le operazioni sono dette metodi dell’oggetto

Nella programmazione ad oggetti, la richiesta a un oggetto di

eseguire un’operazione viene fatta attraverso l’invio di un

messaggio all’oggetto (ovvero l’invocazione di un metodo)

Quando l’oggetto riceve un messaggio che è la richiesta di

esecuzione di una operazione, allora esegue l’operazione

richiesta

Daniela Fogli – Elementi di Informatica e Programmazione 2525

Le proprietà (o attributi)

Torniamo alla nostra analogia

Proprietà del televisore:

Accensione: descrive se il televisore è acceso o spento

Canale: descrive il canale su cui il televisore è sintonizzato

Volume: descrive il volume del televisore

Ciascuna proprietà è caratterizzata da:

Nome

Valore corrente

Insieme dei valori ammessiper quella proprietà

Nome → canale

Valore corrente → 3

Insieme dei valori

ammessi → 1..99

Daniela Fogli – Elementi di Informatica e Programmazione 2626

Lo stato di un oggetto

In ogni istante di tempo il televisore è in un certo stato

Lo stato del televisore è descritto dai valori delle sue proprietàin un dato istante

Esempio:

Accensione = il televisore è acceso

Canale = il televisore è sintonizzato sul canale 3

Volume = il volume del televisore è 8

L’insieme dei valori (acceso, 3, 8) identificano lo stato attuale del televisore

Daniela Fogli – Elementi di Informatica e Programmazione 2727

Lo stato di un oggetto software

Ciascun oggetto software ha uno stato

Lo stato di un oggetto software è descritto da un

insieme di proprietà

Lo stato corrente di un oggetto software è dato dai

valori correnti delle sue proprietà

Daniela Fogli – Elementi di Informatica e Programmazione 2828

Relazione fra metodi, proprietà e stato di un oggetto

L’effetto dell’invocazione di un metodo di un oggetto consiste

solitamente in un cambiamento dello stato dell’oggetto che la

esegue

Esempio: invocazione del metodo che fa variare il volume

� il valore della proprietà volume del televisore viene

opportunamente cambiato

Cambiamento di una proprietà = cambiamento del valore

corrente della proprietà (non del nome, né dell’insieme dei valori

ammessi)

Daniela Fogli – Elementi di Informatica e Programmazione 2929

Oggetti e classi

Così come una variabile viene dichiarata a partire da un

determinato tipo, anche un oggetto è dichiarato come istanza di

una particolare classe

La dichiarazione di una classe equivale a dichiarare il tipo di tutti

gli oggetti di quella classe

Una classe definisce quindi le caratteristiche comuni degli oggetti

che da essa possono essere creati (struttura interna e

comportamento)

Per lavorare su un elemento della classe bisogna creare un

oggetto di quella classe (creare un’istanza)

Tra i metodi di una classe esiste anche il costruttore, che

specifica le modalità di creazione degli oggetti

Daniela Fogli – Elementi di Informatica e Programmazione 3030

costruttore

attributi

class punto

public

punto(float x, float y, float z)

sposta(float dx, float dy, float dz)

private

float cx;

float cy;

float cz;

punto(float x, float y, float z)

cx = x

cy = y

cz = z

end

sposta(float dx, float dy, float dz)

cx = cx + dx

cy = cy + dy

cz = cz + dz

end

end-class

Esempio di “classe” (in un linguaggio inventato)

Parte visibile all’esterno (interfaccia)

Parte non visibile all’esterno (comprende attributi e implementazione dei metodi)

Daniela Fogli – Elementi di Informatica e Programmazione 3131

Creazione di un’istanza e uso

Definisco un oggetto di tipo “punto”

class punto mio-punto

Creo l’istanza invocando il costruttore con i parametri (per

inizializzazione)

mio-punto.punto(0, 0, 0)

Assegno un diverso valore alle coordinate attraverso il metodo

“sposta”

mio-punto.sposta(7, 1, 5)

Daniela Fogli – Elementi di Informatica e Programmazione 3232

Programmazione ad oggetti

Si fonda sulla distinzione fra due attività:

Quella di creazione di classi

Quella di uso di classi esistenti (creare istanze)

Es. nella programmazione di un’interfaccia utente

Posso programmare una nuova classe “pulsante”

Posso programmare per istanziare la classe “button” già a disposizione nell’ambiente di sviluppo

Un programmatore può fare entrambe le attività, ma la forza della programmazione ad oggetti sta proprio nella riusabilità di programmi già pronti (le classi)

Daniela Fogli – Elementi di Informatica e Programmazione 3333

Dall’analisi del problema all’esecuzione di un programma

problema

proc. di risoluzione

(informale)

algoritmo (formale)

programma (alto livello)

programma

(ling. macchina)

analisi

specifica

programazione

traduzione

esecuzioneHw

Daniela Fogli – Elementi di Informatica e Programmazione 3434

Traduttori

I traduttori sono programmi che provvedono a convertire il codice di programmi scritti in un dato linguaggio di programmazione di alto livello, nella corrispondente rappresentazione in linguaggio macchina

Due classi:

Compilatori: traducono un programma scritto in un linguaggio di programmazione di alto livello (programma sorgente) in un programma equivalente direttamente eseguibile dal calcolatore (programma oggetto)

Interpreti: traducono ed eseguono direttamente ciascunaistruzione del programma sorgente; in ingresso richiedono anche i dati iniziali

Daniela Fogli – Elementi di Informatica e Programmazione 3535

Compilatore e interprete

compilatorecompilatore

interpreteinterprete

programma

sorgente

programma

sorgente

programma

oggetto

dati

risultati

linguaggio di alto livello

linguaggio di alto livello

linguaggio macchina

segnalazione di errori

segnalazione di errori

Daniela Fogli – Elementi di Informatica e Programmazione 3636

Eseguire un programma scritto in un linguaggio compilato

Il programma P scritto in linguaggio L viene dato in ingresso a un

programma PComp

PComp è il programma compilatore del linguaggio L (ad esempio

il programma compilatore del C)

L’esecuzione da parte di un calcolatore di PComp su P (dove P

è il dato di ingresso) produce Pexe � PRIMA FASE

L’esecuzione da parte di un calcolatore di Pexe su dei dati

iniziali produce dei risultati finali � SECONDA FASE

Daniela Fogli – Elementi di Informatica e Programmazione 3737

Eseguire un programma scritto in un linguaggio interpretato

Il programma P scritto in linguaggio L viene dato in ingresso a un

programma PInt

PInt è il programma interprete del linguaggio L (ad esempio il

programma interprete del Basic)

L’esecuzione da parte di un calcolatore di PInt su P con i dati

in ingresso di P produce i risultati finali

Daniela Fogli – Elementi di Informatica e Programmazione 3838

Domande

In che linguaggio sono scritti Pcomp e Pint ?

Quali proprietà fondamentali distinguono un

compilatore (o un interprete) da un altro?Il linguaggio di alto livello

L’insieme delle istruzioni macchina (ISA) (semplificando, il tipo di processore)

Il sistema operativo (lo vedremo dopo)

Daniela Fogli – Elementi di Informatica e Programmazione 3939

Confronto fra compilatori e interpreti

Velocità di esecuzione: i programmi compilati hanno in genere prestazioni migliori (nella compilazione si possono attuare processi di ottimizzazionedell’eseguibile)

Messa a punto del programma: gli interpreti permettono di correggere gli errori non appena vengono scoperti, senza bisogno di ricompilareinteramente il programma

In conclusione:Compilazione: OK per i prodotti commerciali a larga diffusione

Interpretazione: OK in fase di prototipazione

Daniela Fogli – Elementi di Informatica e Programmazione 4040

Portabilità

Si definisce portabilità la possibilità di utilizzare un programma su piattaforme hardware/software diverse da quella dove è stato sviluppato

Tre modalità:portabilità del file eseguibile: richiede calcolatori con hardware e sistema operativo dello stesso tipo per il quale è stato compilato. Semplice ma restrittivo.

portabilità tramite ricompilazione: richiede l’esistenza di un compilatore e di librerie per la nuova piattaforma e lo svolgimento della ricompilazione. Non fattibile dall’utente medio.

portabilità tramite interpretazione: richiede l’esistenza di un interprete per la nuova piattaforma. Semplice (purchèl’interprete sia già installato) e non restrittivo.

Daniela Fogli – Elementi di Informatica e Programmazione 4141

Compilatore e linker

I compilatori consentono tipicamente la compilazione separata di

parti di programmi (moduli oggetto)

I diversi moduli possono essere progettati, costruiti e messi a

punto separatamente, e archiviati in opportune librerie

Nel momento in cui un programma deve essere eseguito, un

programma apposito, detto linker, si occupa di ritrovare e

collegare opportunamente fra loro i moduli oggetto

Il risultato del linker è un unico modulo, detto modulo

eseguibile, pronto per il caricamento in memoria e l’esecuzione

Daniela Fogli – Elementi di Informatica e Programmazione 4242

Il ruolo del linker

modulo

oggetto

modulo

oggetto

modulo

oggetto

modulo

oggetto

modulo

oggetto

Libreria di moduli oggetto

linkerlinker

modulo

oggetto

modulo

oggetto

modulo

eseguibile

Daniela Fogli – Elementi di Informatica e Programmazione 4343

Editor, Debugger, Strumenti di Interfaccia

Editor: mette a disposizione le funzionalità di un programma per il trattamento di testi + strumenti che aiutano il programmatore nell’uso corretto del linguaggio, nell’inserimento di commenti, nella visualizzazione della struttura del programma

Debugger: aiuta la localizzazione degli errori e la loro correzioneconsentono di arricchire il codice con delle direttive, allo scopo di aumentare le informazioni ricavabili dall’ispezione dei risultati intermedi (es. per vedere il valore di una variabile se si verifica una certa condizione, per vedere traccia dei valori assunti da una variabile)

consentono di eseguire il programma in modo controllato

Strumenti di interfaccia: mettono a disposizione primitive grafiche (finestre, menu, icone, bottoni, etc.) oltre a librerie di programmi che permettono la realizzazione in tempi brevi di interfacce

es. estensioni specifiche incluse all’interno di linguaggi, come in Visual-Basic e Visual-C

Daniela Fogli – Elementi di Informatica e Programmazione 4444

compilatorecompilatore

programma

sorgente

programma

oggetto

CalcoloMedia.c

(programma in C)

linkerlinker

CalcoloMedia.obj

programma

eseguibile

CalcoloMedia.exe

editoreditor

librerielibrerie

Alcuni ambienti di

sviluppo includono gli

strumenti di creazione,

traduzione ed esecuzione

dei programmi