Cos’è l’informatica?
Elementi di Informatica e
Programmazione
“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]
Il concetto di Algoritmo e di Calcolatore
Corsi di Laurea in:
L’informatica è dunque una scienza: l’elaborazione
dell’informazione avviene in modo sistematico e
rigoroso
Ingegneria Civile
Ingegneria per l’Ambiente e il Territorio
Università degli Studi di Brescia
L’elaborazione può essere automatizzata
Docente: Daniela Fogli
Daniela Fogli – Elementi di Informatica e Programmazione
Alcuni concetti chiave
I problemi e la loro risoluzione…
Problema: classe di domande omogenee alle quali è possibile
dare risposta mediante una procedura uniforme
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,
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
ovvero la descrizione formale di un algoritmo
Dati: valori che possono assumere le variabili d’ingresso
Necessità di linguaggi per la descrizione formale di
algoritmi: linguaggi di programmazione
Risultati: valori che possono assumere le variabili d’uscita
Soluzione di un’istanza di un problema: risposta alla specifica
domanda che l’istanza rappresenta
Gli algoritmi di fatto “risolvono problemi”… vediamo
cosa significa …
Daniela Fogli – Elementi di Informatica e Programmazione
2
3
Daniela Fogli – Elementi di Informatica e Programmazione
4
Esempio
Problema
Quanto vale la radice
quadrata intera Y di un
numero intero positivo X ?
Classe di
domande
omogenee
Esempio
Variabile
di uscita
Problema
Variabile di
ingresso
Istanza
Quanto vale la
radice quadrata
intera Y del
numero 49?
Quanto vale la
radice quadrata
Y del numero
50?
Dati = Interi positivi
Soluzione
dell’istanza = 7
Risultati = Interi
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
5
3*3=9
Y=2
3*3=9
Y=3
2*2=4
Y=1
3*3=9, 4*4=16
6
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 istanze
2*2=4,
2*2=4,
1*1=1,
2*2=4,
Soluzione
dell’istanza = 7,07…
Risultati = Reali
Un esempio di problema e di
procedura di risoluzione
X=5:
X=9:
X=1:
X=10:
Variabile di
ingresso
Quanto vale la radice
quadrata Y di un numero
intero positivo X ?
Classe di
domande
omogenee
Istanza
Dati = Interi positivi
Variabile
di uscita
Una possibile procedura di risoluzione per il
problema dato è dunque:
1.
2.
3.
4.
5.
Y=3
Idea!
INIZIO: Assegna a Y il valore 0
Incrementa Y di 1
Se Y2< X allora torna all’istruzione 2
Se Y2 = X allora FINE
Se Y2> X allora decrementa Y di 1: FINE
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
7
Daniela Fogli – Elementi di Informatica e Programmazione
8
Procedure di risoluzione
e algoritmi…
Computazione
Computazione: esecuzione di un algoritmo in corrispondenza
di certi dati
La procedura di risoluzione è quindi espressa come
sequenza di istruzioni la cui esecuzione porta alla
soluzione del problema ALGORITMO RISOLUTIVO
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 iniziali
durante l’esecuzione di un algoritmo
Algoritmo = concetto statico
Computazione = concetto dinamico
ALGORITMO
DATI
SOLUZIONE
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
9
Più formalmente …
Esempio di sequenza di computazione
Supponendo che la variabile in ingresso X = 8
eseguiamo l’algoritmo passo-passo
1
2
3
4
5
6
7
8
9
10
11
Problema
P[X, Y]
Y←0
Calcolo di Y+1 e risultato in Y Y =1
Controllo se Y2 < X è vero
Calcolo di Y+1 e risultato in Y Y =2
Controllo se Y2 < X è vero
Calcolo di Y+1 e risultato in Y Y =3
Controllo se Y2 < X è falso
Controllo se Y2 = X è falso
Controllo se Y2 > X è vero (ovviamente!)
Calcolo di Y-1 e risultato in Y Y =2
Fine
Daniela Fogli – Elementi di Informatica e Programmazione
10
(X1, X2, …, Xn): variabili di ingresso, con domini
D1, D2, …, Dn (insiemi di dati)
(Y1, Y2, …, Ym): variabili di uscita, con domini
R1, R2, …, Rm (insiemi di risultati)
Istanza del problema
P[X, Y]
11
con X ∈ D = D1 x D2 x … x Dn
Daniela Fogli – Elementi di Informatica e Programmazione
12
Calcolatore come
Esecutore Universale di Algoritmi
Algoritmo risolvente del problema
Denotiamo con A[X, Y] l’algoritmo risolvente di P[X, Y]
algoritmo
A[X, Y] produce una soluzione per ogni possibile istanza di P[X, Y]
A[X, Y]
problema
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]
dato: X
Algoritmo A[X, Y]
CALCOLATORE
risultato: Y
soluzione
Esecuzione di A
con il dato X
Sostituzione di X con X
P[X, Y]
Istanza P[X, Y]
Risultato Y:
soluzione di P[X, Y]
Daniela Fogli – Elementi di Informatica e Programmazione
istanza
13
Calcolatore come esecutore
Daniela Fogli – Elementi di Informatica e Programmazione
14
Algoritmi, programmi e calcolatori
Un esecutore deve essere in grado di interpretare la descrizione
della procedura di risoluzione (algoritmo risolvente)
Un algoritmo deve essere comprensibile per il suo esecutore
Deve inoltre essere in grado di eseguire le azioni presenti nella
descrizione interpretata
Per essere comprensibili da un calcolatore, gli algoritmi devono
essere espressi in un linguaggio di programmazione
Il calcolatore è un esecutore di algoritmi identificate e
descritte da esseri umani (in genere un team di progettisti,
programmatori e utenti)
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
15
Daniela Fogli – Elementi di Informatica e Programmazione
16
Il calcolatore come esecutore
di programmi
Il calcolatore come esecutore
(una definizione rivisitata)
Programma
sequenza di istruzioni di un linguaggio di
programmazione (descrive un algoritmo)
CALCOLATORE
Dati iniziali
Risultati
dell’esecuzione in
corrispondenza dei dati
iniziali
Assegnati a
variabili di
ingresso
18
Almeno 3 aspetti lo fanno preferire a un esecutore umano
potenza n-esima di a: P[a, n, b]
X
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 una
enorme quantità di dati – es. gestione anagrafe fiscale
Y
CALCOLATORE
Risultati
dell’esecuzione in
corrispondenza dei
dati iniziali
Istanza del problema =
P[2,5,b]
Daniela Fogli – Elementi di Informatica e Programmazione
Perché usare un calcolatore come
esecutore
Programma per il calcolo della
a = 2, n = 5
programmi
17
Esempio
dati iniziali
Un calcolatore è un esecutore universale di
elabora puri simboli (per esso “privi di significato”)
non risolve problemi (il problema non è un suo ingresso) ma
esegue programmi!
Assegnati a
variabili di uscita
Daniela Fogli – Elementi di Informatica e Programmazione
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]
Affidabilità
basso tasso di errore
Economicità
b = 32
Daniela Fogli – Elementi di Informatica e Programmazione
ottimo compromesso costi/benefici
19
Daniela Fogli – Elementi di Informatica e Programmazione
20
L’ “unicità” del calcolatore nella
storia della tecnologia
Proprietà di un algoritmo
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à:
Il fatto fondamentale: il calcolatore è un dispositivo
programmabile
Finitezza: un algoritmo deve essere costituito da un numero finito
Consente di svolgere compiti diversi senza alcuna
modifica della sua struttura fisica
di istruzioni
Definitezza: le istruzioni di cui un algoritmo è costituito devono
appartenere a un insieme finito e prefissato di tipi elementari
Basta intervenire sul livello software (programmi)
lasciando inalterato il livello hardware (struttura
fisica) per modificarne il comportamento
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
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
21
Altre proprietà
22
Sequenza di computazione finita
A[X, Y]
Determinismo: per qualunque dato di ingresso, a ogni passo
algoritmo
della computazione, esiste al più un passo successivo. Ovvero:
assegnato un dato di ingresso, esiste una e una sola
computazione possibile dell’algoritmo
dato: X
ESECUTORE
risultato: Y
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, ….
passo 1 passo 2 passo 3 … … passo n
Terminazione: l’esecuzione di un algoritmo deve terminare in
un numero finito di passi
Daniela Fogli – Elementi di Informatica e Programmazione
In questo caso, la computazione produce un risultato
23
Daniela Fogli – Elementi di Informatica e Programmazione
24
Funzione calcolata da un algoritmo
Sequenza di computazione infinita
A[X, Y]
algoritmo
dato: X
NB: l’algoritmo
è comunque finito!
D
ESECUTORE
fA
• 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!
passo 1 passo 2 passo 3 … … … …
In questo caso, il risultato rimane indefinito
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
25
26
Due algoritmi che risolvono lo stesso
problema
Note
1.
2.
3.
4.
5.
Funzione come concetto equivalente di problema
Problema: come lo risolvo?
Funzione: come la calcolo?
Un algoritmo risolve 1 problema (calcola 1 funzione)
INIZIO: Assegna a Y il valore 0
Incrementa Y di 1
Se Y2< X allora torna all’istruzione 2
Se Y2 = X allora FINE
Se Y2> X allora decrementa Y di 1: FINE
Viceversa, per ogni problema risolubile (ovvero, se esiste un
algoritmo che lo risolve), esistono infiniti algoritmi che lo risolvono,
infatti:
Algoritmo
modificato ma
equivalente
• 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
R
A[X, Y]
27
Algoritmo di
partenza
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.Incrementa Y di 1
6.Decrementa Y di 1
7.Se Y2> X allora decrementa Y di 1: FINE
Daniela Fogli – Elementi di Informatica e Programmazione
28
Cenni sulla macchina di Turing
Informatica Teorica
• Utilizzando strumenti matematici, studia macchine astratte
Macchina astratta utilizzata nell’informatica teorica per
formalizzare i concetti di algoritmo, esecutore e computazione
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:
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)
- 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
Daniela Fogli – Elementi di Informatica e Programmazione
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
29
La macchina di Turing …
Daniela Fogli – Elementi di Informatica e Programmazione
30
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
s1
nastro
B
Testina di lettura/scrittura
Unità di spostamento testina
q1
31
Unità di controllo
(contenente un
elemento di stato)
Daniela Fogli – Elementi di Informatica e Programmazione
32
Esecuzione di un programma
Esempio di Macchina di Turing
Tabella delle transizioni di stato
Il programma per una macchina di Turing consiste in
un insieme di istruzioni, ciascuna formata da una
quintupla <qi, sj, sk, D, qu> dove
Stati
Ingressi
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
q1
q2
0
0q1R
0q2R
1
0q2R
0q1R
b
0qhN
1qhN
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)
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
33
Funzioni calcolate e
Macchine di Turing
Daniela Fogli – Elementi di Informatica e Programmazione
34
Macchina di Turing Universale
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 fi
Non è 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
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)
Daniela Fogli – Elementi di Informatica e Programmazione
35
Daniela Fogli – Elementi di Informatica e Programmazione
36
Esercizio 1
Elementi di Informatica e
Programmazione
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
Esercizi sugli Algoritmi
Corsi di Laurea in:
Ingegneria Civile
Ingegneria per l’Ambiente e il Territorio
Università degli Studi di Brescia
Docente: Daniela Fogli
2
inizio
Algoritmo per esercizio 1
Schema a
blocchi
media ← 0
n←0
Descrizione dell’algoritmo in linguaggio naturale:
sì
x > max
max ← x
no
x←
sì
n ← 0, media ← 0
Leggi un valore dall’esterno e inseriscilo nella variabile x
Se x > 0 allora
max ← x, min ← x
Finché x > 0 ripeti
Se x > max allora max ← x
Se x < min allora min ← x
media ← media + x
n←n+1
Leggi un valore dall’esterno e inseriscilo nella variabile x
Fine ciclo
media ← media / n
Visualizza “Massimo, minimo, media = ” seguita dai valori in max, min, media
altrimenti
Visualizza “La sequenza inserita è nulla”
Fine
x < min
no
min ← x
x>0
no
max ← x
min ← x
‘La sequenza
inserita è nulla”
sì
no
media ← media / n
x>0
media ← media + x
n←n+1
x←
sì
Corpo del ciclo
← max
← min
← media
3
Corpo del ciclo
fine
4
Esecuzione passo passo dell’algoritmo:
data la sequenza 5, 1, 2, 3, 6, -5
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Esecuzione passo passo dell’algoritmo:
data la sequenza 5, 1, 2, 3, 6, -5
media ← 0, n ← 0
Lettura di un numero e memorizzazione nella variabile x (x ← 5)
Controllo se x > 0 è vero
max ← 5, min ← 5
Controllo se x > 0 è vero
Controllo se x > max non è vero
Controllo se x < min non è vero
media ← 0 + 5 = 5
n←0+1=1
Lettura di un numero e memorizzazione nella variabile x (x ← 1)
Controllo se x > 0 è vero
Controllo se x > max non è vero
Controllo se x < min è vero
min ← 1
15.
16.
media ← 1 + 5 = 6
n←1+1=2
17.
18.
19.
20.
Lettura di un numero e memorizzazione nella variabile x (x=2)
Controllo se x > 0 è vero
Controllo se x > max non è vero
Controllo se x < min non è vero
media ← 6 + 2 = 8
n←2+1=3
Lettura di un numero e memorizzazione nella variabile x (x=3)
Controllo se x > 0 è vero
Controllo se x > max non è vero
Controllo se x < min non è vero
media ← 8 + 3 = 11
n←3+1= 4
21.
22.
23.
24.
25.
26.
27.
28.
5
6
Esecuzione passo passo dell’algoritmo:
data la sequenza 5, 1, 2, 3, 6, -5
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Esecuzione passo passo dell’algoritmo: data la
sequenza –2 (cioè sequenza nulla)
Lettura di un numero e memorizzazione nella variabile x (x = 6)
Controllo se x > 0 è vero
Controllo se x > max è vero
max ← 6
Controllo se x < min non è vero
media ← 11 + 6 = 17
n←4+1=5
Lettura di un numero e memorizzazione nella variabile x (x = -5)
Controllo se x > 0 non è vero
media ← 17 / 5 = 3
Visualizza “il Massimo è” 6
Visualizza “Il minimo è” 1
Visualizza “La media è” 3.4
Fine
7
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
8
Esercizio 2
Sia y =
r
Algoritmo per esercizio 2
1
Descrizione dell’algoritmo in linguaggio naturale:
∑i
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
i =q
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
9
10
r
inizio
Esercizio 3
1
y=∑
i =q i
r←
q←
(r > 0) AND (q >
0) AND (r > q)
k
Sia y =
y←0
i←q
2
j =1
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.
‘Errore
nell’immissione
dei dati’
sì
1
∑ (∑ i + j )
i =1
no
i
no
i <= r
sì
y ← y + (1/i)
i ← i +1
←y
fine
11
12
Algoritmo per esercizio 3
inizio
k←
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
Fine
sì
k <= 0
k
i
1 2
)
j =1 i + j
y =∑ (∑
no
y←0
i←1
i =1
i<=k
S ← S*S
y←y+S
i←i+1
Ciclo a condizione
finale
‘Errore
nell’immissione
dei dati’
no
sì
←y
S←0
j←1
fine
no
j<=i
sì
13
S ← S + 1/(i+j)
j ← j+1
14
Risoluzione di un problema
Elementi di Informatica e
Programmazione
Dato un problema da risolvere, non è facile né
efficiente, scrivere un programma in linguaggio
macchina che lo risolva
Il Progetto degli Algoritmi
Facciamo un passo indietro …
Corsi di Laurea in:
Fasi del procedimento di risoluzione di un
problema:
Ingegneria Civile
Ingegneria per l’Ambiente e il Territorio
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
Università degli Studi di Brescia
Docente: Daniela Fogli
Daniela Fogli – Elementi di Informatica e Programmazione
Esempio: montaggio di un
elettrodomestico
Processo di risoluzione di un problema
Soggetto 1
Problema
SOGGETTO 1
Individuazione procedura
Analisi
Stesura
descrizione
procedura
attività
ingresso/uscita
2
Soggetto 2
Conoscenza di come
si risolve il problema
Descrizione procedura
Interpretazione
descrizione
Es. progettista di un
elettrodomestico
Descrizione interpretata
Attuazione
procedura
oppure
Daniela Fogli – Elementi di Informatica e Programmazione
Soluzione
3
SOGGETTO 2
Effettiva capacità di
risolvere il problema
Es. l’acquirente
dell’elettrodomestico
Daniela Fogli – Elementi di Informatica e Programmazione
4
Analisi del problema
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
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
Esempio: l’archivio di una biblioteca
-
Mondo reale
Daniela Fogli – Elementi di Informatica e Programmazione
6
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
Un MODELLO è un’astrazione
del problema. Rappresenta una
semplificazione completa e
autoconsistente della realtà,
creata per comprendere il
problema
primitivi)
Astrae dai dettagli
irrilevanti del mondo
analisi
Modello
Daniela Fogli – Elementi di Informatica e Programmazione
5
Relazione tra realtà e modello
Mondo
reale
Titolo
Autori
stanza, scaffale
…
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
MODELLO
f(x) = g'(y) ° h(z)
Daniela Fogli – Elementi di Informatica e Programmazione
7
Daniela Fogli – Elementi di Informatica e Programmazione
8
Un esempio (informale) di
scomposizione di un problema
Problema: richiesta di un libro
Gestione di una biblioteca in cui:
Come procedo?
1. Decido quale libro richiedere
2. Prelevo il libro
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
Il secondo passo va dettagliato, ovvero va scomposto
in sotto-problemi (procedura per raffinamenti
successivi o top-down)
9
Il problema diventa…
1.
2.
3.
4.
5.
6.
Daniela Fogli – Elementi di Informatica e Programmazione
10
Cercare la scheda…
Decido quale libro richiedere
Cerco la scheda del libro nello schedario
Mi segno numero dello scaffale e posizione nello
scaffale
Cerco lo scaffale
Cerco il libro nella sua posizione all’interno dello
scaffale
Prelevo il libro
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?
Non è un problema elementare!
Daniela Fogli – Elementi di Informatica e Programmazione
11
Daniela Fogli – Elementi di Informatica e Programmazione
12
Un metodo più efficiente…
1.
2.
3.
Più precisamente …
Dal problema a un programma
comprensibile dal calcolatore
Esamino la scheda centrale dello schedario
Se la scheda corrisponde al libro cercato allora termino la ricerca
Altrimenti cerco (con lo stesso metodo) nella metà inferiore o
superiore dello schedario a seconda che il libro cercato preceda
o segua il libro indicato sulla scheda
•
Analisi del problema e identificazione procedura di
risoluzione
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
•
Specifica dell’algoritmo risolutivo
•
Programmazione in linguaggio di alto livello
•
Traduzione del programma in linguaggio macchina
•
Esecuzione del programma
Daniela Fogli – Elementi di Informatica e Programmazione
13
Dall’analisi del problema all’esecuzione
problema
analisi
Algoritmo
Attività
dell’uomo svolte
con l’ausilio di
procedura di
strumenti CASE e
risoluzione (informale)
e ambienti di
sviluppo
algoritmo (formale)
specifica
programazione
La procedura di risoluzione è specificata in maniera
formale come sequenza di istruzioni
ALGORITMO RISOLUTIVO
Attività
programma automatica svolta
(alto livello) da programmi
traduttori
traduzione
Esecutore del
linguaggio
macchina
Daniela Fogli – Elementi di Informatica e Programmazione
14
ALGORITMO
Dati iniziali
Dati finali
(soluzione)
programma
(ling. macchina)
Istruzioni che
operano sui dati
esecuzione
15
Daniela Fogli – Elementi di Informatica e Programmazione
16
Algoritmo = Dati + Istruzioni
Come posso classificare i dati?
In base alla visibilità da parte dell’utente
Dati:
Visibile (di ingresso o uscita)
Trasparente (dati temporanei di supporto)
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, …
In base alla variabilità nel tempo
Costanti
Variabili (acquisizione dall’esterno o assegnazione)
Istruzioni:
In base alla struttura
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
Elementari (interi, alfanumerici, logici, …)
Strutturati (vettori, matrici, …)
Daniela Fogli – Elementi di Informatica e Programmazione
17
Variabili, espressioni e
assegnamenti
18
Espressioni aritmetiche
Variabile: “contenitore” di dati
Ha un nome (es. x)… nel calcolatore i nomi delle variabili
… sono formate da:
Operandi: variabili e costanti (si ipotizza di considerare solo
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. xy) o logiche, e in predicati logici
Le 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
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
19
Daniela Fogli – Elementi di Informatica e Programmazione
20
Espressioni logiche
Predicati logici
… sono formati da:
… sono formate da:
Operandi: espressioni logiche e/o predicati
Operandi: espressioni aritmetiche
Operatori: operatori logici di congiunzione (AND), disgiunzione
Operatori: operatori relazionali di uguaglianza (=),
(OR) e negazione (NOT)
minoranza (<) e maggioranza (>) fra numeri
Semantica: quella dell’Algebra di Boole
Semantica: quella delle disequazioni fra numeri
Hanno un
valore logico
(vero o falso)
Esempi
Esempi
a=b
(b + d) < (10 * c)
(a < b) AND (b < c) OR (c = d+2)
Hanno un
valore logico
(vero o falso)
Daniela Fogli – Elementi di Informatica e Programmazione
Not( ( (a=10*b) AND (b = c) ) OR (c = 20) )
21
Rappresentazione degli algoritmi
Daniela Fogli – Elementi di Informatica e Programmazione
22
Linguaggio naturale/pseudo-codice
Problema: determinare il maggiore di due numeri interi ricevuti in ingresso
(si assuma di avere a disposizione solo le istruzioni aritmetiche e quella
di confronto con lo zero)
1.
Linguaggio naturale/pseudo-codice
2.
Diagrammi di flusso
3.
Linguaggi di programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
Algoritmo in linguaggio naturale:
Leggi un valore dall’esterno e inseriscilo nella variabile x
Leggi un secondo valore e inseriscilo nella variabile y
Calcola x-y e assegna il risultato a d
Se d è diverso a 0
allora
Se d è maggiore di 0
allora Visualizza “Il massimo è …” seguita dal valore contenuto in x
altrimenti Visualizza “Il massimo è …” seguita dal valore contenuto in y
altrimenti
Visualizza “I due numeri sono uguali!”
Fine
23
Daniela Fogli – Elementi di Informatica e Programmazione
24
I diagrammi di flusso
La simbologia comunemente utilizzata
Termini equivalenti: diagrammi a blocchi, schemi a
blocchi, flowchart
Formalismo grafico per descrivere algoritmi
inizio
Elementi del linguaggio: simboli per indicare inizio e
fine, operazioni di ingresso/uscita (I/O), elaborazioni,
condizioni, sottoprogrammi
sì
elaborazione
Daniela Fogli – Elementi di Informatica e Programmazione
Fine
no
selezione a 2 vie
sottoprogramma
26
Blocco di I/O
Il blocco ‘Inizio’ denota il
punto da cui l’esecuzione
dell’algoritmo deve iniziare
x←
Il blocco ‘Fine’ denota il
punto in cui l’esecuzione
dell’algoritmo termina
Daniela Fogli – Elementi di Informatica e Programmazione
cond
Daniela Fogli – Elementi di Informatica e Programmazione
25
Blocchi Inizio e Fine
Inizio
fine
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
27
Daniela Fogli – Elementi di Informatica e Programmazione
28
Selezione a 2 vie
(Blocco decisionale)
Blocco di Elaborazione
Condizione
(predicato)
Contiene un’istruzione di
assegnamento come ad esempio:
Esempi di condizioni:
x←y
x←0
Rappresenta un’istruzione di controllo
sì
x ← x+1
x=0
no
x<z
x >= z*w
x ← y+z*w
…
…
Possono anche
indicarsi con V
(vero) ed F (falso)
Nei linguaggi di programmazione più comuni il
simbolo ‘=‘ oppure ‘:=‘ viene usato al posto di ‘←’
Daniela Fogli – Elementi di Informatica e Programmazione
x=y
Daniela Fogli – Elementi di Informatica e Programmazione
29
Blocco Sottoprogramma
Se la condizione risulta vera allora l’esecuzione
prosegue lungo l’arco denotato con ‘sì’
altrimenti prosegue lungo l’arco denotato con
‘no’
30
Collegamenti fra i blocchi
I blocchi sono collegati fra loro da archi
Contiene un’istruzione di chiamata
di un sottoprogramma come ad
esempio:
orientati
Max(x,y)
Media(x,y,z)
• L’arco identifica la sequenza delle operazioni
da compiere
MCD(y,z)
…
Nei linguaggi di programmazione più comuni si
distingue fra chiamate di procedura e chiamate di
funzione
• La freccia identifica il flusso di esecuzione
In ogni caso sono sottoprogrammi richiamabili dal
programma principale o da altri sottoprogrammi
Daniela Fogli – Elementi di Informatica e Programmazione
31
Daniela Fogli – Elementi di Informatica e Programmazione
32
Esempio: Problema 1
inizio
Problema: determinare il maggiore di due numeri interi ricevuti in ingresso
(si assuma di avere a disposizione solo le istruzioni aritmetiche e quella
di confronto con lo zero)
x←
y←
Algoritmo in linguaggio naturale:
d←x-y
Diagramma di
flusso
dell’algoritmo che
risolve
il problema 1
Leggi un valore dall’esterno e inseriscilo nella variabile x
Leggi un secondo valore e inseriscilo nella variabile y
Calcola x-y e assegna il risultato a d
Se d è diverso a 0
allora
Se d è maggiore di 0
allora Visualizza “Il massimo è …” seguita dal valore contenuto in x
altrimenti Visualizza “Il massimo è …” seguita dal valore contenuto in y
altrimenti
Visualizza “I due numeri sono uguali!”
Fine
Daniela Fogli – Elementi di Informatica e Programmazione
33
sì
d>0
no
‘Il max
è’, ← y
Daniela Fogli – Elementi di Informatica e Programmazione
34
Esempio: Problema 2
Lettura di un numero e memorizzazione nella variabile
Calcolo del Massimo Comune Divisore (MCD)
di due interi x ed y
Lettura di un numero e memorizzazione nella variabile
Individuazione della procedura di risoluzione:
y (supponiamo che il numero acquisito sia 6, quindi in
memoria si avrà y=6)
Calcolo di x-y e risultato in d d = 2
Controllo se d ≠ 0 è vero
Controllo se d>0 è vero
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.
Visualizzo “Il massimo è 8”
Fine
Daniela Fogli – Elementi di Informatica e Programmazione
‘numeri
uguali’
fine
x (supponiamo che il numero acquisito sia 8, quindi in
memoria si avrà x=8)
2
3
4
5
6
sì
d≠0
‘Il max
è’, ← x
Esecuzione passo passo del
programma
1
no
35
Daniela Fogli – Elementi di Informatica e Programmazione
36
Algoritmo per il Massimo Comune
Divisore
inizio
Diagramma di
flusso
dell’algoritmo
che risolve il
problema 2
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
Se 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))
mcd ← contatore
allora
contatore ← contatore + 1
fine ciclo
Stampa “MCD =“ seguito dal valore in mcd
Fine
x←
y←
sì
min ← x
no
… e se x e y
sono uguali?
… e il ramo
“altrimenti” ?
sì
no
mcd ← contatore
contatore ← contatore + 1
Daniela Fogli – Elementi di Informatica e Programmazione
37
38
Esecuzione passo passo
dell’algoritmo (cont.)
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)
Controllo se x < y è vero
min ← 6
mcd ← 1, contatore ← 1
controllo se (contatore <= min) è vero
controllo se ((x mod contatore = 0) e (y mod contatore = 0)),
cioè se 6 è divisibile per 1 e 9 è divisibile per 1 è vero
mcd ← 1
contatore ← 2
controllo se (contatore <= min) è vero
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
sì
(x mod contatore = 0) AND
(y mod contatore = 0)
‘MCD =’, ← mcd
Esecuzione passo passo
dell’algoritmo
7
8
9
10
Ciclo a
condizione
iniziale
contatore<=min
Daniela Fogli – Elementi di Informatica e Programmazione
2
3
4
5
6
min ← y
mcd ← 1
contatore ← 1
fine
1.
no
x<y
11
12
13
14
15
16
17
18
19
20
39
contatore ← 3
controllo se (contatore <= min) è vero
controllo se ((x mod contatore = 0) e (y mod contatore = 0)),
cioè se 6 è divisibile per 3 e 9 è divisibile per 3 è vero
mcd ← 3
contatore ← 4
controllo se (contatore <= min) è vero
controllo se ((x mod contatore = 0) e (y mod contatore = 0)),
cioè se 6 è divisibile per 4 e 9 è divisibile per 4 non è vero
contatore ← 5
controllo se (contatore <= min) è vero
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
40
Esecuzione passo passo
dell’algoritmo (cont.)
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
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)
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
Se x < y allora scambia x con y
Dividi x per y: sia q il quoziente ed r il resto (cioè q ← x div y; r ← x mod y)*
Finché r ≠ 0 ripeti
x ←y
y←r
q ← x div y
r ← x mod y
Fine ciclo
Visualizza “MCD = ” seguita dal valore in y
* div = divisione
Fine
intera, mod = resto
Esercizio:
Rifare l’esecuzione passo
passo assumendo di
acquisire x = 18 e y = 12
della divisione
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
41
42
Esecuzione passo passo dell’algoritmo di
Euclide che risolve il problema 2
inizio
x←
y←
sì
Diagramma di
flusso che descrive
l’algoritmo di
Euclide (che risolve
il problema 2)
1
x<y
nota: per realizzare lo
scambio ho bisogno di una
variabile di appoggio (a)
no
a←x
x←y
y←a
2
3
4
5
6
7
8
9
10
q ← x div y
r ← x mod y
r≠0
no
sì
x←y
y←r
‘MCD =’, ← y
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)
Controllo se x < y è vero
Faccio lo scambio: a ←6, x ←9, y ←6
q ← x div y (q ← 1), r ← x mod y (r ← 3)
controllo se r ≠ 0 è vero
x ← y (x ← 6), y ← r (y ← 3)
q ← x div y (q ← 2), r ← x mod y (r ← 0)
controllo se r ≠ 0 non è vero
Stampa/visualizza “MCD = 3”
Esercizio:
Fine
Rifare l’esecuzione passo
passo assumendo di
acquisire x = 18 e y = 12
q ← x div y
r ← x mod y
fine
Daniela Fogli – Elementi di Informatica e Programmazione
43
Daniela Fogli – Elementi di Informatica e Programmazione
44
L’algoritmo di Euclide in forma più
semplice
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
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
allora
MCD(x,y) = MCD(x-y,y)
altrimenti MCD(y,x) = MCD(y-x,x)
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
45
46
Esecuzione passo passo
dell’algoritmo
inizio
x←
y←
Diagramma di
flusso
dell’algoritmo di
Euclide (versione
semplificata)
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”
Esercizio:
10. Fine
1.
no
x≠y
sì
sì
no
x>y
x←x–y
y←y –x
‘MCD =’, ← y
Rifare l’esecuzione passo
passo assumendo di
acquisire x = 24 e y = 9
fine
Daniela Fogli – Elementi di Informatica e Programmazione
47
Daniela Fogli – Elementi di Informatica e Programmazione
48
Due proprietà degli algoritmi
Esempio: Problema 3
Determinare il massimo fra n numeri positivi, finchè non si
inserisce 0
Correttezza: l’algoritmo risolve il problema per cui è
stato progettato (efficacia). Gli algoritmi visti per il
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 x
Finché x ≠ 0 ripeti
chiama il sottoprogramma Massimo(x, max) e inserisci il risultato
nella variabile c
Se 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 max
Fine
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)
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
49
max ← 0
Calcolo della moltiplicazione fra due numeri naturali x e y
utilizzando solo operazioni di somma e sottrazione
x←
Diagramma di
flusso
dell’algoritmo
che risolve il
problema 3
no
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
z←0
Finché y > 0 ripeti
z←z+x
y←y–1
Fine ciclo
Stampa/visualizza la frase “Prodotto = ” seguita dal valore in z
Fine
sì
x≠0
c ← Massimo
(x,max)
c=‘Vero’
‘Il massimo
è’, ← max
50
Calcolo della moltiplicazione
Esercizio:
Fare l’esecuzione passo
passo assumendo di
acquisire la sequenza
3,5,1,4,0
inizio
Daniela Fogli – Elementi di Informatica e Programmazione
no
sì
max ← x
x←
fine
Daniela Fogli – Elementi di Informatica e Programmazione
51
Daniela Fogli – Elementi di Informatica e Programmazione
52
Esecuzione passo passo
dell’algoritmo
inizio
Diagramma di
flusso
dell’algoritmo della
moltiplicazione
x←
y←
1.
z←0
2.
3.
4.
5.
y>0
no
sì
6.
z←z+x
y←y–1
7.
8.
9.
10.
11.
‘Prodotto =’, ← z
12.
13.
14.
15.
fine
Daniela Fogli – Elementi di Informatica e Programmazione
Lettura di un numero e memorizzazione nella variabile x
(supponiamo x=8)
Lettura di un numero e memorizzazione nella variabile y
(supponiamo y=3)
Assegna 0 alla variabile z (che conterrà il risultato)
Controllo se y > 0 è vero
z=0+8=8
y=3–1=2
Controllo se y > 0 è vero
z = 8 + 8 = 16
y=2–1=1
Controllo se y > 0 è vero
z = 16 + 8 = 24
y=1–1=0
Controllo se y > 0 non è vero
Stampa/visualizza “Prodotto = 24”
Fine
Daniela Fogli – Elementi di Informatica e Programmazione
53
54
Calcolo di xy
inizio
x←
y←
Calcolo di xy (con x e y numeri naturali) utilizzando il
sottoprogramma ‘moltiplica(a,b)’
z←1
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
z←1
Finché y > 0 ripeti
z ← moltiplica(z, x)
y←y–1
Fine ciclo
Stampa/visualizza la frase “xy = ” seguita dal valore in z
Fine
Diagramma di
flusso
dell’algoritmo per il
calcolo di xy
sì
z ← moltiplica(z,x)
y←y–1
‘xy =’, ← z
fine
* 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
y>0
no
55
Daniela Fogli – Elementi di Informatica e Programmazione
chiamata di un
sottoprogramma
56
Esecuzione passo passo
dell’algoritmo
1
2
3
4
5
6
7
8
9
Esecuzione passo passo dell’
algoritmo (cont.)
Lettura di un numero e memorizzazione nella variabile x
(supponiamo x=2)
Lettura di un numero e memorizzazione nella variabile y
(supponiamo y=4)
Assegna 1 alla variabile z (che conterrà il risultato)
Controllo se y > 0 è vero
z = moltiplica(1, 2) = 2
y=4–1=3
Controllo se y > 0 è vero
z = moltiplica(2, 2) = 4
y=3–1=2
Controllo se y > 0 è vero
Daniela Fogli – Elementi di Informatica e Programmazione
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
57
Calcolo del fattoriale
58
inizio
N←
Calcolo del fattoriale del numero N
sì
N! = N x (N-1) x (N-2) x … x 1
Esempio: 5! = 5 x 4 x 3 x 2 x 1 = 120
no
N<0
‘Errore
nell’inserimento…’
Descrizione dell’algoritmo in linguaggio naturale:
Inizio ciclo
Leggi un valore dall’esterno e inseriscilo nella variabile N
Se N < 0 allora Stampa/visualizza la frase “Errore nell’inserimento del valore di N”
Torna a Inizio Ciclo Finché N < 0
fattoriale ← 1
no
Diagramma di
flusso
dell’algoritmo del
fattoriale
fattoriale ← 1
Finché N > 1 ripeti
fattoriale ← fattoriale x N
N←N–1
Fine ciclo
Stampa/visualizza la frase “Fattoriale = ” seguita dal valore in fattoriale
Fine
N>1
sì
fattoriale ← fattoriale * N
N←N–1
‘Fattoriale =’, ←
fattoriale
fine
Daniela Fogli – Elementi di Informatica e Programmazione
59
Daniela Fogli – Elementi di Informatica e Programmazione
60
Esecuzione passo passo
dell’algoritmo
1
Esercizio 1
Lettura di un numero e memorizzazione nella variabile N (supponiamo
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
N=4)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Controllo se N < 0 non è vero
Assegna 1 alla variabile fattoriale (che conterrà il risultato)
Controllo se N > 1 è vero
fattoriale = 1 * 4 = 4
N=4–1=3
Controllo se N > 1 è vero
fattoriale = 4 * 3 = 12
N=3–1=2
Controllo se N > 1 è vero
fattoriale = 12 * 2 = 24
N=2–1=1
Controllo se N > 1 non è vero (esce dal ciclo)
Stampa/visualizza “Fattoriale = 24”
Fine
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
61
Esercizio 2
r
Sia y =
62
Esercizio 3
1
k
∑i
Sia y =
i =q
i
1
∑ (∑ i + j )
i =1
2
j =1
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.
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
Daniela Fogli – Elementi di Informatica e Programmazione
63
Daniela Fogli – Elementi di Informatica e Programmazione
64
Perché gli algoritmi non bastano…
Elementi di Informatica e
Programmazione
Un algoritmo descritto con i linguaggi visti è spesso interpretabile
in modo ambiguo
Dagli Algoritmi ai Programmi
Non è utilizzabile da un esecutore automatico
Ad esempio, in quegli algoritmi non si parlava di:
Corsi di Laurea in:
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
Ingegneria Civile
Ingegneria per l’Ambiente e il Territorio
Università degli Studi di Brescia
Docente: Daniela Fogli
Daniela Fogli – Elementi di Informatica e Programmazione
Dall’analisi del problema
all’esecuzione di un programma
Programma
problema
analisi
2
Un programma è la descrizione formale di un algoritmo
attraverso un linguaggio di programmazione
proc. di risoluzione
(informale)
specifica
Scrivere programmi è un compito complesso (alcuni programmi
possono arrivare ad essere composti da alcuni milioni di righe di
istruzioni)
algoritmo (formale)
programazione
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
programma (alto livello)
traduzione
Hw
Daniela Fogli – Elementi di Informatica e Programmazione
programma
(ling. macchina)
esecuzione
3
Daniela Fogli – Elementi di Informatica e Programmazione
4
Il lavoro dei programmatori
Linguaggi di programmazione
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
I linguaggi di programmazione di alto livello sono nati per
consentire uno sviluppo “rapido” e “facile” di applicazioni
informatiche
Questo tipo di linguaggi:
hanno costrutti più vicini al ragionamento umano
consentono al programmatore di descrivere i problemi a un livello di astrazione
di poco inferiore a quello degli algoritmi
permettono 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
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
5
Sintassi e semantica
Daniela Fogli – Elementi di Informatica e Programmazione
Cos’è in pratica un programma?
Sintassi di un linguaggio:
(ben formate), indipendentemente dal loro
significato
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)
Semantica di un linguaggio:
Un programma viene poi tradotto in linguaggio
macchina per essere eseguito dal calcolatore
insieme delle regole che specificano la
scrittura di istruzioni formalmente corrette
insieme delle regole che specificano il
significato di ciascuna istruzione, cioè
La struttura
Il significato
Noi vedremo una parte del linguaggio C per scrivere
programmi in C
l’azione che viene compiuta quando
l’istruzione viene eseguita
Daniela Fogli – Elementi di Informatica e Programmazione
6
7
Daniela Fogli – Elementi di Informatica e Programmazione
8
Esempio: moltiplicazione tra numeri
interi positivi
Dallo pseudo-codice al programma in C
inizio
x←
y←
Aggiungiamo una
dichiarazione dei
dati
Dati
x, y interi positivi
main() /* prodotto in C */
{ unsigned int x, y;
w, z interi
z←0
int w, z;
w>0
sì
z←z+x
w←w–1
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
‘Prodotto =’, ← z
}
scrivi z
printf(“%d”, z);
fine
fine
Daniela Fogli – Elementi di Informatica e Programmazione
9
corpo del
programma
}
Daniela Fogli – Elementi di Informatica e Programmazione
10
Dichiarazioni di variabili e
assegnamento di valori
Variabili e tipi
Ogni variabile ha un tipo
La dichiarazione della variabile
‘z’ di tipo ‘intero’ crea un
contenitore per memorizzare
un valore intero positivo
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
La dichiarazione associa il
nome ‘z’ a tale contenitore
Assegnamento dei valori alle variabili
L’assegnamento usa il
contenitore per
memorizzarvi il valore
Daniela Fogli – Elementi di Informatica e Programmazione
dichiarazione
variabili
Risoluzione
w←y
no
identificazione
programma
11
z
z
Daniela Fogli – Elementi di Informatica e Programmazione
0
12
Tipi di dati in C
Le istruzioni
Il corpo del programma è composto da una
sequenza di istruzioni
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)
Nei linguaggi di programmazione si distinguono
solitamente 3 tipi di istruzioni:
Istruzioni di ingresso/uscita
Istruzioni aritmetico-logiche
Istruzioni di controllo
Negli esempi seguenti useremo principalmente il tipo
int
Su variabili di tipo intero saranno applicabili
operatori aritmetici (+, *, -, /, %)
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
13
Istruzioni di ingresso/uscita e
istruzioni aritmetico-logiche
Operazioni logiche
Le operazioni logiche fanno riferimento a variabili o
costanti di tipo booleano
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)
Al contrario di altri linguaggi, in C non esiste il tipo
“boolean”, si usa il tipo int
In C:
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
14
NOT corrisponde a ‘!’
OR corrisponde a ‘| |’
AND corrisponde a ‘&&’
Gli operatori logici restituiscono tutti un numero:
0 per “falso”, >0 per “vero”
15
Daniela Fogli – Elementi di Informatica e Programmazione
16
Esempi di utilizzo delle operazioni
logiche
main()
{
int h, i, j, k;
int b1, b2, b3;
…
b1 = h > j;
b2 = (h > j) || (j == k);
b3 = b1 && b2;
…
Istruzioni di controllo
Le istruzioni di controllo consentono di modificare il
flusso 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:
Nota: commenti delimitati da /* e */
Non sono istruzioni C ma servono al
programmatore per “spiegare” il
significato del codice
/* b1 ← vero se h è maggiore di j */
/* b2 ← vero se h è maggiore di j
o se j e k hanno lo stesso valore */
/* b3 ← vero se sia b1 che b2 sono veri */
dalle selezioni (semplici o a due vie)
dai cicli (a condizione iniziale e a condizione finale)
}
Notare differenza fra = (per assegnamento) e == per
confronto (valutazione di uguaglianza fra due valori)
Daniela Fogli – Elementi di Informatica e Programmazione
Selezione semplice
…
Sì
Daniela Fogli – Elementi di Informatica e Programmazione
17
Esempio di selezione semplice
main()
{
…
V
/* selezione semplice */
if (cond)
{…
/* blocco istruzioni */
/* eseguito solo se */
/* cond è vera */
…
}
…
cond
No
blocco
istruzioni
…
18
B←C*D
C←C+1
A=5
F
main()
{
int A, B, C, D;
…
if (A = = 5)
{
B = C * D;
C = C + 1;
}
…
}
}
Daniela Fogli – Elementi di Informatica e Programmazione
19
Daniela Fogli – Elementi di Informatica e Programmazione
20
Selezione a due vie
main()
{…
...
Sì
…
V
/* selezione a 2 vie */
if (cond)
{ … /* blocco 1 */ }
else
{ … /* blocco 2 */ }
No
cond
blocco 1
Esempio di selezione a 2 vie
F
A>B
A←A-B
B←B-1
B←B-A
A←A-1
blocco 2
…
}
…
...
Daniela Fogli – Elementi di Informatica e Programmazione
...
Si
No
test 1
blocco 1
Si
No
test 2
blocco 2
Si
blocco n
test n
No
blocco
n+1
Daniela Fogli – Elementi di Informatica e Programmazione
21
Selezione a più vie
main()
{
int A, B;
…
if (A > B)
{
A = A - B;
B = B - 1;
}
else
{
B = B - A;
A = A - 1;
}
…
}
22
Ciclo a condizione iniziale
main()
{…
/* selezione a più vie */
if (test1)
{ … /* blocco 1 */ }
else if (test2)
{ … /* blocco 2 */ }
…
else if (testn)
{ … /* blocco n */ }
else
{ … /* blocco n + 1*/ }
...
}
cond
V
Blocco
istruzioni
F
main()
{…
/* ciclo a condizione
iniziale */
while (cond)
{
/* blocco istruzioni
eseguito quando cond
è vero */
}
… /* eseguito quando
cond è falso */
}
...
Daniela Fogli – Elementi di Informatica e Programmazione
23
Daniela Fogli – Elementi di Informatica e Programmazione
24
Esempio di ciclo a condizione
iniziale
Algoritmo di Euclide per il MCD in C
inizio
Tralasciamo
dichiarazione dati
Inizio
J←0
I←0
I <= 10
V
F
fine
I←I+1
J←J+I
x←
y←
main()
{
int I, J;
J = 0;
I = 0;
while (I <= 10)
{
I = I + 1;
J = J + I;
}
}
no
x≠y
sì
sì
no
x>y
x←x–y
y←y –x
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);
}
‘MCD =’, ← y
Esercizio: cosa fa il programma? Quali
sono i valori finali di I e J?
Daniela Fogli – Elementi di Informatica e Programmazione
fine
Daniela Fogli – Elementi di Informatica e Programmazione
25
Ciclo For
Esempio di uso del ciclo For
Pseudo-codice
Si utilizza quando è noto a priori il numero di iterazioni da
compiere
Schema a blocchi
Inizio
Dati
Ad esempio:
Algoritmo che, preso in ingresso un numero n, calcola la
somma dei quadrati dei numeri compresi fra 1 e n
i, n, s interi
n←
Risoluzione
Nell’algoritmo avrò un ciclo di n iterazioni (con n noto a priori,
cioè prima di entrare nel ciclo)
leggi n
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
for i=1 to i = n
s←0
i←1
s=0
s = s + i*i
fine for
scrivi s
Daniela Fogli – Elementi di Informatica e Programmazione
26
27
È un ciclo a
condizione
iniziale
F
i <= n
V
s←s+i*i
i←i+1
Daniela Fogli – Elementi di Informatica e Programmazione
←s
fine
28
Ciclo For in C
Pseudo-codice
Ciclo a condizione finale
In C
...
Dati
i, n, s interi
Risoluzione
leggi n
s=0
for i=1 to i = n
s = s + i*i
fine for
main()
{
int i, n, s;
scanf(“%d”, &n);
s = 0;
for ( i=1; i<=n; i++ )
{
s = s + i*i;
}
printf(“%d”, s);
}
blocco
istruzioni
Sì
cond
main()
{
…
/* ciclo a condizione finale */
do
{
/* blocco istruzioni
eseguito almeno
una volta e finchè
cond rimane vera */
} while (cond)
No
… /* eseguito quando cond
è falsa */
...
scrivi s
}
Daniela Fogli – Elementi di Informatica e Programmazione
29
Esempio di ciclo a condizione finale
Daniela Fogli – Elementi di Informatica e Programmazione
30
Variabili strutturate: i vettori
Inizio
j←1
i ← 10
j←j*i
i←i-1
i>0
V
F
←j
fine
main()
{
int i, j;
j = 1; i = 10;
do
{
j = j * i;
i = i – 1;
} while (i > 0)
printf(“%d”, j);
}
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
Esercizio: cosa calcola questo programma?
Daniela Fogli – Elementi di Informatica e Programmazione
31
Daniela Fogli – Elementi di Informatica e Programmazione
32
Esempio:
somma dei guadagni di 1 anno
main()
{
int g[12];
int w, z;
Dati
g[12] vettore di interi
w, z interi positivi
Risoluzione
Esercizio
Si consideri il problema di leggere una sequenza
arbitraria di numeri interi in ingresso e mostrarla
in uscita in ordine inverso
Nota:
In C il primo elemento
di un array è quello con
indice 0
w = 0;
z = 0;
while (w < 12)
{
z = z + g[w];
w = w + 1;
}
printf (“%d, z);
w=1
z=0
finchè (w <= 12) ripeti
z = z + g[w]
w=w+1
fine ciclo
scrivi z
}
Scrivere il corrispondente programma in C
Daniela Fogli – Elementi di Informatica e Programmazione
conta ← 0
fine ← 0
conta ← conta - 1
a[conta] ←
conta≥0
no
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;
}
}
no
sì
sì
no
sì
← a[conta]
fine
fine ← 1
conta ← conta - 1
conta ← conta + 1
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
34
Programma ‘inverti-sequenza’
(Ipotesi: massimo numero di elementi acquisibili = 100)
(conta < 100)
AND (fine = 0)
a[conta]=0
33
Inversione della sequenza:
diagramma di flusso
inizio
Si 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
35
Daniela Fogli – Elementi di Informatica e Programmazione
Potevo usare
un ciclo for?
36
Variabili strutturate: matrici
Matrice bidimensionale (in generale)
Le matrici sono array multidimensionali, cioè i cui elementi
sono identificati da più indici contemporaneamente
Dati relativi al mese j-esimo
Ogni indice identifica una dimensione della matrice
Dati
relativi
al prodotto
i-esimo
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
d[0,0] d[0,1]
…
d[1,0] d[1,1]
…
…
d[i,j]
d[50,1]d[50,2]
…
d[50,j]
d[i,0] d[i,1]
…
d[i,j]
F
d[0,11]
i < 50
V
fine
d[i,11]
F
j < 12
d[49,0] d[49,1]
…
d[49,j]
V
… d[49,11]
d[i,j] ← 0
j←j+1
Daniela Fogli – Elementi di Informatica e Programmazione
d[2,12]
…
d[i,12]
… d[50,12]
38
Inizio
d[1,11]
…
d[1,12]
Daniela Fogli – Elementi di Informatica e Programmazione
j←0
Indice i da 0 a
49
(per indicare i
50 prodotti)
…
d[2,j]
d[i,1] d[i,2]
i←0
d[1,j]
d[1,j]
Esempio: inizializzazione della
matrice d
ATTENZIONE:
in C gli indici partono
sempre da 0
d[0,j]
…
d[2,1] d[2,2]
37
Matrice bidimensionale (in C)
Indice j da 0 a 11
(per indicare i 12 mesi)
d[1,1] d[1,2]
39
i←i+1
main() /* inizializza matrice */ Ordine di
{
inizializzazione
int i, j;
d(0,0)
int d[50,12];
d(0,1)
i = 0;
d(0,2)
while (i < 50)
…
{
d(0,11)
d(1,0)
j = 0;
d(1,1)
while (j < 12)
…
{
d(1,11)
d[i,j] = 0;
…
j = j + 1;
…
}
d(49,0)
i = i + 1;
d(49,1)
}
…
}
Daniela Fogli – Elementi di Informatica e Programmazione
d(49,11)
40
For anziché While
Variabili strutturate: struct
main() /* inizializza matrice */
{
main() /* inizializza matrice */
int i, j;
{
int d[50,12];
int i, j;
i = 0;
int d[50,12];
while (i < 50)
{
j = 0;
for (i = 0; i<50; i++)
while (j < 12)
{
{
for (j = 0; j<12; j++) d[i,j] = 0;
d[i,j] = 0;
}
j = j + 1;
}
}
i = i + 1;
… anche queste avrei potuto
con una sola istruzione posso
}
}
ometterle
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)
omettere le parentesi graffe
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
41
Esempio: la struttura “studente”
42
Array di ‘struct’ e accesso diretto
main()
{
struct studente
{
int matricola;
char nome[30];
char cognome[30];
int num_esami;
};
studente
matricola = 25891
nome = Mario
cognome = Rossi
num_esami = 0
DEFINIZIONE DEL
“TIPO” studente
DICHIARAZIONE
struct studente /* in C */
{
int
matricola;
char nome[30];
char cognome[30];
int
num_esami;
}
Nei vettori e nelle matrici gli elementi devono essere tutti dello
stesso tipo
struct studente stud;
struct studente s[100];
…
s[3].num_esami = 0;
…
ASSEGNAMENTO
}
stud.matricola = 25891;
Assegna il valore 0 al numero di
esami dello studente di indice 3
stud.num_esami = stud.num_esami + 1;
Daniela Fogli – Elementi di Informatica e Programmazione
43
Daniela Fogli – Elementi di Informatica e Programmazione
44
I sottoprogrammi
Strutturazione in 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
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
problemi elementari?
I sottoprogrammi corrispondono alla soluzione di
sottoproblemi
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)
Facilitati comprensione, controllo correttezza, manutenzione
Daniela Fogli – Elementi di Informatica e Programmazione
45
46
Programma principale
in pseudo-codice e in C
Esempio di uso di sottoprogrammi
Dati
w intero
z reale
fine booleano
Risoluzione
fine = falso
finchè (non fine) ripeti
leggi w
se (w > -1)
z = media(w)
scrivi z
altrimenti
fine = vero
fine condizione
fine ciclo
fine
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
Daniela Fogli – Elementi di Informatica e Programmazione
47
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;
}
}
Daniela Fogli – Elementi di Informatica e Programmazione
48
Due note
La funzione ‘media’
Funzione media(w)
Dati
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
i, s interi
z reale
p[100,12] matrice di interi
Risoluzione
i = 0; s = 0;
while (i < 12)
{
s = s + p[w][i];
i = i + 1;
}
z = s / 12;
return (z);
i=0es=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
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
float media(int w)
{ int i, s;
float z;
int p[100][12];
49
Daniela Fogli – Elementi di Informatica e Programmazione
50
Un altro esempio di uso di
sottoprogrammi
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!
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
51
Daniela Fogli – Elementi di Informatica e Programmazione
52
Calcolo di
Inizio
leggi
xey
w ←x
z ←0
V
w> 0
z ←z+
+x
w ←w -1
F
x2 ←z
w ←y
z ←0
V
w> 0
z ←z+
+y
w ←w -1
F
y2 ←z
q ←x2+y2
scrivi
“x2+ y2=q”
I prodotti x*x e y*y sono
ottenuti con somme successive
fine
x2
+
Calcolo di x2 + y2
con chiamata di sottoprogramma
y2
Funzione quad(a)
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);
}
Funzione
quad (a)
leggi
xey
V
z ←z + a
w ←w -1
w> 0
F
Esercizio
w←a
z←0
Scrivere la
funzione quad e il
main in C
x2 ←quad(x)
y2 ←quad(y)
V
w> 0
F
z ←z + a
w ←w-1
q ← x2 + y2
scrivi
“x2+ y2=q”
ritorna z
Daniela Fogli – Elementi di Informatica e Programmazione
53
La funzione ‘quad’
w←a
z←0
Inizio
fine
Daniela Fogli – Elementi di Informatica e Programmazione
Funzione
quad (a)
Calcolo di x2 + y2
Programma principale
Inizio
int quad(int a)
{
int w, z;
w = a;
z = 0;
while (w > 0)
{
z = z + a;
w = w - 1;
}
return (z);
}
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);
leggi
xey
x2 ←quad(x)
y2 ←quad(y)
}
q ← x2 + y2
scrivi
y2=q”
“x2+
ritorna z
fine
Daniela Fogli – Elementi di Informatica e Programmazione
54
55
Chiamata di funzione a cui
viene passato il parametro y
Chiamata di funzione a cui
viene passato il parametro x
Daniela Fogli – Elementi di Informatica e Programmazione
56
Elementi di Informatica e
Programmazione
Il punto della situazione…
STATO
DATI
Linguaggi di programmazione di alto livello,
ambienti di programmazione
sottosistema
di ingresso-uscita
periferica
Corsi di Laurea in:
periferica
sottosistema
unità centrale-memoria
interfaccia di
ingresso-uscita
unità centrale
interfaccia di
ingresso-uscita
Ingegneria Civile
Ingegneria per l’Ambiente e il Territorio
memoria centrale
Università degli Studi di Brescia
bus di sistema
Docente: Daniela Fogli
Daniela Fogli – Elementi di Informatica e Programmazione
Limiti del linguaggio Assembler
2
Un passo indietro sull’Assembler …
Esempio: gestione e ordinamento di una rubrica telefonica:
Esempio: salto condizionato (beq = branch if equal)
sarebbe poco praticabile ricorrere al linguaggio assembler
istruzioni
dati
0101011110011001
1101011110011111
0111000000011001
1101011100011101
0110011110011001
0101000111011000
1010011110011001
0101111110000000
0101010010011001
0111000000011001
0101000111011000
0101111110000000
0101000111011000
0101110111011000
MEMORIA
…
i==j
Ciclo: add $r1, $r1, $r1
sì
sub $r1, $r1, 1
beq $r1, $zero, ciclo
no
f ←g + h
f ←f - i
…
Supponendo che f, g, h, i, j corrispondano ai registri $r0, $r1, $r2,
$r3, $r4, la specifica in Assembler potrebbe essere la seguente
Strutture di controllo:
solo salti (condiz/incond)
Programma “monolitico”
(no sotto-programmi)
Dati “troppo elementari”
(numeri con segno / virgola mobile)
Daniela Fogli – Elementi di Informatica e Programmazione
3
beq
add
L1: sub
$r3, $r4, L1
$r0, $r1, $r2
$r0, $r0, $r3
# va a L1 se i è uguale a j
#f=g+h
#f=f-i
Daniela Fogli – Elementi di Informatica e Programmazione
4
Linguaggi di programmazione
di alto livello
Un passo indietro sull’Assembler …
Esempio: salto condizionato e salto incondizionato
sì
i!=j
f ←g + h
Permettono di specificare gli algoritmi in maniera
no
Precisa (termini linguistici di significato preciso e univoco)
Ma più “astratta” rispetto al linguaggio macchina
f ←g - h
Ciascuna istruzione in un linguaggio di alto livello corrisponde
solitamente a più istruzioni in linguaggio macchina
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
Allora: add
Esci:
Vantaggi principali:
consentono lo sviluppo di sistemi complessi
gli errori commessi sono inferiori
il codice è più facile da “mantenere”
indipendenza dalla macchina
# salto incondizionato (jump)
$r0, $r1, $r2
…
Daniela Fogli – Elementi di Informatica e Programmazione
Tre tipi di istruzioni
L’insieme delle caratteristiche che determina il modo di
affrontare il progetto e la codifica di un programma,
lo “stile di programmazione”
Istruzioni di ingresso/uscita
Istruzioni aritmetico-logiche
Ruolo centrale dell’assegnamento
Ad oggetti
Imperativo
Pascal, Cobol, C… C++, Java,
VisualBasic,…
Funzionale
Lisp, APL, Haskell
6
Il paradigma imperativo
Paradigmi di programmazione
-
Daniela Fogli – Elementi di Informatica e Programmazione
5
NB: le stesse del linguaggio
macchina!
Istruzioni di controllo
Diversi tipi di astrazione
CLOS
Astrazione sui dati
Tipi di dati predefiniti e definiti dal programmatore (vs. codici binari)
Logico
Prolog
Astrazione sul controllo
Prolog++
Condizionali e cicli (vs. istruz di salto condiz/incondiz)
Astrazione procedurale (scarso supporto da ling. macchina)
Daniela Fogli – Elementi di Informatica e Programmazione
7
Daniela Fogli – Elementi di Informatica e Programmazione
8
Astrazione sul controllo: esempio
Astrazione procedurale
Soluzione di problemi complessi (eventualmente lavoro di più
persone in modo coordinato): è utile scomporre un programma in
sotto-programmi, detti procedure
// A, B, C, D costanti…
V
B←C*D
C←C*2
A=B
F
main() /* C */
{
int A, B, C, D;
…
if (A = = B)
{
B = C * D;
C = C * 2;
}
…
}
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
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
CONT:
…
Daniela Fogli – Elementi di Informatica e Programmazione
9
Daniela Fogli – Elementi di Informatica e Programmazione
10
Passaggio dei parametri:
2 modalità
Astrazione procedurale (cont.)
Chiamata di una procedura nel programma:
nome_procedura (<parametri attuali>)
Parametri attuali: variabili o espressioni il cui valore
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’indirizzo
del parametro attuale; tutte le operazioni sul parametro
formale sono in realtà effettuate sul parametro attuale
è attribuito ai parametri formali (passaggio dei
parametri)
I tipi dei parametri attuali devono corrispondere ai
parametri formali
Effetto della chiamata:
In C è disponibile solo il passaggio per valore
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
11
Daniela Fogli – Elementi di Informatica e Programmazione
12
Esempio (in C)
int calcolaFattoriale(int w)
{ int fatt;
fatt=1;
while (w>0)
{ fatt = fatt * w;
w = w – 1;
}
return fatt;
PROGRAMMA
CHIAMANTE
Se fosse un passaggio per indirizzo
PROGRAMMA
CHIAMATO
CHIAMATA
numero
w
int calcolaFattoriale(int w)
{ int fatt;
fatt=1;
while (w>0)
{ fatt = fatt * w;
CHIAMATA
w = w – 1;
numero
}
PROGRAMMA
CHIAMANTE
PROGRAMMA
CHIAMATO
indirizzo di
“numero”
w
return fatt;
RITORNO
}
}
fatt
fattoriale
main()
{ int numero, fattoriale;
….
numero = 5;
fattoriale = calcolaFattoriale(numero);
printf (“%d”, fattoriale);
}
Al ritorno dal
programma chiamato la
variabile numero ha
ancora valore 5
Daniela Fogli – Elementi di Informatica e Programmazione
Al ritorno dal
programma chiamato la
variabile “numero”
avrebbe valore 0
main()
{ int numero, fattoriale;
….
numero = 5;
fattoriale = calcolaFattoriale(numero);
printf (“%d”, fattoriale);
}
MA IN C NON E’ COSI’
Daniela Fogli – Elementi di Informatica e Programmazione
13
Oltre il paradigma imperativo
14
Paradigma Funzionale
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, …)
Programma ≡ Funzione: In Out
Esecuzione di un programma ≡ Valutazione di una funzione in
corrispondenza di determinati valori di ingresso
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
Esempio:
fattoriale(n) ≡
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
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
15
Daniela Fogli – Elementi di Informatica e Programmazione
16
Paradigma Logico
Paradigma logico: esempio (cont.)
Consideriamo le seguenti asserzioni:
genitore(abele, caino)
figlio(caino, adamo)
genitore(adamo, X)
nonno(abele, X)
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
L’esecuzione del programma
genitore(abele, caino)
figlio(caino, adamo)
genitore(adamo, X)
nonno(abele, X)
Esempio:
genitore(adamo, caino)
genitore(adamo, abele)
genitore(eva, abele)
assiomi
genitore(Y,X) => figlio(Y,X)
genitore(X,Z), genitore(Z,Y) => nonno(X,Y)
Capostipite dei linguaggi logici è il PROLOG
regole di
inferenza
Daniela Fogli – Elementi di Informatica e Programmazione
produce:
falso
vero
vero per X = caino e X = abele
vero per X = nessun valore
Daniela Fogli – Elementi di Informatica e Programmazione
17
18
Occultamento e Incapsulazione nei
linguaggi imperativi
La programmazione a oggetti
Con i linguaggi imperativi possiamo suddividere il programma in
sotto-programmi, ognuno ha due parti:
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#
Interfaccia: la specifica delle funzionalità [e.g. function
media(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, manipolandone
la struttura interna
Daniela Fogli – Elementi di Informatica e Programmazione
19
Daniela Fogli – Elementi di Informatica e Programmazione
20
Occultamento e Incapsulazione nella
Programmazione ad Oggetti
Caratteristiche di un oggetto
Usiamo un’analogia: il televisore*
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
⇒ ha un nome per referenziarlo (lo chiamiamo
televisore)
⇒ ha un comportamento
⇒ ha delle proprietà (dette anche attributi)
Se cambia la rappresentazione interna dei dati, ma le definizioni
delle procedure rimangono invariate, le modalità di utilizzo
dell’oggetto dall’esterno non cambiano
*Tratto da [Luca Cabibbo, “Fondamenti di informatica – Oggetti e Java”, McGraw Hill, 2004]
Daniela Fogli – Elementi di Informatica e Programmazione
21
Il comportamento
Daniela Fogli – Elementi di Informatica e Programmazione
22
Oggetti software e comportamento
Il televisore sa fare delle cose:
Sa accendersi
Sa sintonizzarsi su un canale
Sa variare il volume
Sa spegnersi
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)
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
Quando l’oggetto riceve un messaggio che è la richiesta di
esecuzione di una operazione, allora esegue l’operazione
richiesta
L’utente invia un
comando al televisore
Daniela Fogli – Elementi di Informatica e Programmazione
23
Daniela Fogli – Elementi di Informatica e Programmazione
24
Le proprietà (o attributi)
Lo stato di un oggetto
Torniamo alla nostra analogia
In ogni istante di tempo il televisore è in un certo stato
Proprietà del televisore:
Lo stato del televisore è descritto dai valori delle sue proprietà
in un dato istante
Accensione: descrive se il televisore è acceso o spento
Canale: descrive il canale su cui il televisore è sintonizzato
Volume: descrive il volume del televisore
Esempio:
Accensione = il televisore è acceso
Canale = il televisore è sintonizzato sul canale 3
Volume = il volume del televisore è 8
Ciascuna proprietà è caratterizzata da:
Nome
Valore corrente
Insieme dei valori ammessi
per quella proprietà
Nome → canale
L’insieme dei valori (acceso, 3, 8) identificano lo stato attuale del
televisore
Valore corrente → 3
Insieme dei valori
ammessi → 1..99
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
25
26
Relazione fra metodi, proprietà e
stato di un oggetto
Lo stato di un oggetto software
L’effetto dell’invocazione di un metodo di un oggetto consiste
solitamente in un cambiamento dello stato dell’oggetto che la
esegue
Ciascun oggetto software ha uno stato
Lo stato di un oggetto software è descritto da un
insieme di proprietà
Esempio: invocazione del metodo che fa variare il volume
il valore della proprietà volume del televisore viene
opportunamente cambiato
Lo stato corrente di un oggetto software è dato dai
valori correnti delle sue proprietà
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
27
Daniela Fogli – Elementi di Informatica e Programmazione
28
Esempio di “classe”
(in un linguaggio inventato)
Oggetti e classi
class punto
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
public
punto(float x, float y, float z)
sposta(float dx, float dy, float dz)
Parte visibile all’esterno
(interfaccia)
private
attributi
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
costruttore
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
Parte non visibile
all’esterno (comprende
attributi e
implementazione dei
metodi)
end-class
Daniela Fogli – Elementi di Informatica e Programmazione
29
Creazione di un’istanza e uso
Daniela Fogli – Elementi di Informatica e Programmazione
30
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
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)
Un programmatore può fare entrambe le attività, ma la forza della
programmazione ad oggetti sta proprio nella riusabilità di
programmi già pronti (le classi)
Assegno un diverso valore alle coordinate attraverso il metodo
“sposta”
mio-punto.sposta(7, 1, 5)
Daniela Fogli – Elementi di Informatica e Programmazione
31
Daniela Fogli – Elementi di Informatica e Programmazione
32
Dall’analisi del problema
all’esecuzione di un programma
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
problema
proc. di risoluzione
(informale)
analisi
specifica
algoritmo (formale)
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 ciascuna
programma (alto livello)
programazione
programma
(ling. macchina)
traduzione
Hw
istruzione del programma sorgente; in ingresso richiedono
anche i dati iniziali
esecuzione
Daniela Fogli – Elementi di Informatica e Programmazione
33
compilatore
linguaggio di alto livello
Il programma P scritto in linguaggio L viene dato in ingresso a un
programma PComp
programma
oggetto
PComp è il programma compilatore del linguaggio L (ad esempio
il programma compilatore del C)
linguaggio macchina
L’esecuzione da parte di un calcolatore di PComp su P (dove P
è il dato di ingresso) produce Pexe PRIMA FASE
segnalazione di errori
L’esecuzione da parte di un calcolatore di Pexe su dei dati
iniziali produce dei risultati finali SECONDA FASE
dati
interprete
programma
sorgente
34
Eseguire un programma scritto in
un linguaggio compilato
Compilatore e interprete
programma
sorgente
Daniela Fogli – Elementi di Informatica e Programmazione
risultati
linguaggio di alto livello
segnalazione di errori
Daniela Fogli – Elementi di Informatica e Programmazione
35
Daniela Fogli – Elementi di Informatica e Programmazione
36
Eseguire un programma scritto in
un linguaggio interpretato
Domande
Il programma P scritto in linguaggio L viene dato in ingresso a un
programma PInt
In che linguaggio sono scritti Pcomp e Pint ?
PInt è il programma interprete del linguaggio L (ad esempio il
programma interprete del Basic)
Quali proprietà fondamentali distinguono un
compilatore (o un interprete) da un altro?
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
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
37
Confronto fra compilatori e
interpreti
Portabilità
Velocità di esecuzione: i programmi compilati hanno in
Si definisce portabilità la possibilità di utilizzare un
programma su piattaforme hardware/software diverse
da quella dove è stato sviluppato
genere prestazioni migliori (nella compilazione si
possono attuare processi di ottimizzazione
dell’eseguibile)
Messa a punto del programma: gli interpreti
permettono di correggere gli errori non appena
vengono scoperti, senza bisogno di ricompilare
interamente il programma
In conclusione:
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.
Compilazione: OK per i prodotti commerciali a larga
diffusione
Interpretazione: OK in fase di prototipazione
Daniela Fogli – Elementi di Informatica e Programmazione
38
39
Daniela Fogli – Elementi di Informatica e Programmazione
40
Compilatore e linker
Il ruolo del linker
I compilatori consentono tipicamente la compilazione separata di
parti di programmi (moduli oggetto)
Libreria di moduli oggetto
I diversi moduli possono essere progettati, costruiti e messi a
punto separatamente, e archiviati in opportune librerie
modulo
oggetto
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
modulo
oggetto
modulo
oggetto
modulo
oggetto
modulo
oggetto
Il risultato del linker è un unico modulo, detto modulo
eseguibile, pronto per il caricamento in memoria e l’esecuzione
modulo
oggetto
modulo
eseguibile
linker
modulo
oggetto
Daniela Fogli – Elementi di Informatica e Programmazione
Daniela Fogli – Elementi di Informatica e Programmazione
41
42
Editor, Debugger, Strumenti di
Interfaccia
Alcuni ambienti di
sviluppo includono gli
strumenti di creazione,
traduzione ed esecuzione
dei programmi
editor
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 correzione
programma
sorgente
consentono 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
CalcoloMedia.c
(programma in C)
compilatore
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
programma
oggetto
CalcoloMedia.obj
linker
es. estensioni specifiche incluse all’interno di linguaggi, come in
Visual-Basic e Visual-C
librerie
programma
eseguibile
CalcoloMedia.exe
Daniela Fogli – Elementi di Informatica e Programmazione
43
Daniela Fogli – Elementi di Informatica e Programmazione
44