Elementi di Informatica e Cos’è l’informatica? Programmazione · Un programma è una sequenza...
-
Upload
phungkhuong -
Category
Documents
-
view
219 -
download
0
Transcript of Elementi di Informatica e Cos’è l’informatica? Programmazione · Un programma è una sequenza...
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
sì
inizio
max ← xmin ← x
fine
no
‘La sequenza
inserita è nulla”
Schema a
blocchi
x > 0
sì
no
media ← media + xn ← n + 1
sì
no max ← x
x > max
x < min
min ← x
sì
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
sì
i <= r
y ← y + (1/i)
i ← i +1
sì
‘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
sì
‘Errore nell’immissione dei dati’
S ← 0
j ← 1
sì
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
sì
fine
‘MCD =’, ← mcd
sì
(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
sì
sì
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
sì
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ì
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
sì
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
sì
fattoriale ← fattoriale * N
N ← N – 1
N<0
fattoriale ← 1
no
no
‘Fattoriale =’, ←
fattoriale
sì
‘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
sì
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
sì
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
...
Sì
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)
sì
a[conta] ←
no
sì
fine ← 1
conta ← conta + 1
conta≥0
conta ← conta - 1
no
fine
(Ipotesi: massimo numero di elementi acquisibili = 100)
← a[conta]
sì
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
sì
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