2. Per determinare la soluzione algoritmica di un
problema complesso è, in generale
conveniente adottare la seguente metodologia:
• scomporre il problema originale in un
insieme di sottoproblemi;
• fornire una soluzione algoritmica del
problema originale, assumendo di
conoscere una soluzione algoritmica per i
sottoproblemi individuati;
• affrontare singolarmente e con la stessa
metodologia i singoli sottoproblemi.
Prof. Filippo TROTTA
3. METODOLOGIA DI
PROGRAMMAZIONE
TOP-DOWN
dal generale al particolare, per
affinamenti successivi o per individuazione
di sottoproblemi
Prof. Filippo TROTTA
4. I vantaggi di tale approccio sono:
• migliore schematizzazione del problema;
• migliore comprensibilità;
• facilità di individuazione di sottoproblemi
che ricorrono più volte nella soluzione
iniziale;
• individuazione di problemi già risolti,
eventualmente anche in ambito diverso.
Prof. Filippo TROTTA
5. PROBLEMA 1
Determinare il peso massimo, date tre parole
binarie a, b, c di 18 bit.
(Ricordimano che per peso P(X) di una parola
binaria X, si intende il numero di bit ad 1 di X).
101 101 101
Prof. Filippo TROTTA
6. L’algoritmo 1 sarà:
(H) <<CARICA I VALORI BINARI IN TRE ARRAY DI NOME
(a,b,c)>>
(A) <<ASSEGNA A d IL PESO DI a>>
(B) <<ASSEGNA A e IL PESO DI b>>
IF d <= e THEN d = e
(C) <<ASSEGNA A e IL PESO DI c>>
IF d <= e THEN d = e
MSGBOX(“Il massimo è “ &d)
Si assume di conoscere la soluzione algoritmica di A, B, C, H
Prof. Filippo TROTTA
7. PROBLEMA 2
Determinare il peso di una parola binaria X
di N bit.
(La parola X è considerata inserita in un vettore di
N elementi).
101 101 101
Prof. Filippo TROTTA
8. L’algoritmo 2 sarà:
I=1
P=0
DO
P = P + X(I)
I=I+1
LOOP UNTIL I > N
Prof. Filippo TROTTA
9. A questo punto abbiamo tutti gli
elementi per risolvere il problema 1,
ma dobbiamo trovare il modo e le
regole per l’utilizzazione congiunta
del problema 1 con il problema 2.
PROBLEMA 1 PROBLEMA 2
Prof. Filippo TROTTA
10. In pratica vengono utilizzate due tecniche:
a) MACRO-ESPANSIONE: si
utilizzano gli algoritmi 1 e 2 per
definirne un terzo;
b) SOTTOPROGRAMMA: la
soluzione del problema è formata
dall’esecuzione congiunta degli
algoritmi 1 e 2;
Prof. Filippo TROTTA
13. SOLUZIONE A MACRO
IF d <= e THEN
<<CARICA (a,b,c)>>
d=e
i=1
END IF
d=0
i=1 IL PESO
DO
e=0 MASSIMO
d = d + a(i)
DO E’ IN d
i=i+1
e = e + c(i)
LOOP UNTIL i > 18
i=i+1
i=1
LOOP UNTIL i > 18
e=0
IF d <= e THEN
DO
d=e
e = e + b(i)
END IF
i=i+1
MSGBOX(“Il maggiore è “&d)
LOOP UNTIL i > 18 Prof. Filippo TROTTA
14. SOLUZIONE A SOTTOPROGRAMMA
Interfaccia che associa i parametri
<<CARICA (a,b,c)>>
FORMALI a quelli ATTUALI
<<ASSEGNA A d IL PESO DI a>>
<<ASSEGNA A e IL PESO DI b>> I=1
IF d <= e THEN d = e P=0
<<ASSEGNA A e IL PESO DI c>> DO
IF d <= e THEN d = e P = P + X(I)
MSGBOX(“Il maggiore è “&d) I=I+1
LOOP UNTIL I > N
PROGRAMMA
PRINCIPALE SOTTOPROGRAMMA
Prof. Filippo TROTTA
15. Interfaccia che associa i
parametri
FORMALI a quelli ATTUALI
dall’esempio sarà:
Parametri formali: X P N
Parametri attuali: a d 18
b e 18
c e 18
Prof. Filippo TROTTA
16. CONFRONTO FRA MACRO E SOTTOPROGRAMMA
Il confronto fra le due organizzazioni si effettua
relativamente ad alcuni parametri:
• OCCUPAZIONE DI MEMORIA
intesa come numero di celle occupate dal programma
codificato nel linguaggio macchina;
• TEMPO DI ESECUZIONE;
• COSTO DI UTILIZZAZIONE
Prof. Filippo TROTTA
17. OCCUPAZIONE DI MEMORIA
L’organizzazione a sottoprogrammi
molto più vantaggiosa quanta più è
frequente in un algoritmo
l’esecuzione di sottoprogrammi
sempre uguali.
Prof. Filippo TROTTA
18. TEMPO DI ESECUZIONE
L’organizzazione a sottoprogramma
è tanto peggiore, rispetto a quella a
macro, quanto più tempo si spende
per la chiamata e l’associazione dei
parametri.
Prof. Filippo TROTTA
19. COSTO DI UTILIZZAZIONE
Si intende il costo delle operazioni necessarie per
giungere all’esecuzione del programma. Nel caso
di sottoprogrammi è data dalla codifica delle
chiamate e dal caricamento del sottoprogramma.
Nel caso di macro ogni espansione richiede, in
generale, lesame di tutta la macro: operazione
che è in generale più costosa di quelle richieste
per la chiamata del corrispondente programma.
Prof. Filippo TROTTA
20. Dalle considerazioni fatte si può dire che:
NESSUNA DELLE DUE
ORGANIZZAZIONI PREVALE
SULL’ALTRA.
Prof. Filippo TROTTA
21. Ambiente locale e non-locale di un
sottoprogramma
L’ambiente è l’insieme di tutte le entità
caratterizzate da un nome, accessibili da
un programma (costanti simboliche,
variabili, sottoprogrammi, ecc.)
Prof. Filippo TROTTA
22. Supponiamo che un programma P, chiami un
sottoprogramma P’ e chiediamoci: qual’è
l’ambiente di P’? cioè qual’è l’insieme delle
variabili accessibili a P’?
Si considerano, fondamentalmente due possibilità:
a) l’ambiente del chiamato è lo stesso del
chiamante; (L.M., BASIC COBOL ecc.)
b) il programma chiamato dispone di un
ambiente locale inaccessibile al programma
chiamante. (ALGOL, PASCAL, C, C++ ecc.)
Prof. Filippo TROTTA
23. COMPRENSIONE AMBIENTI NON-LOCALE
M (progr. principale)
Dim X,Y,Z as integer;
sottoprog. P livello 0 M
dim A,X as integer;
sottoprogr. R
dim A,B as integer;
.......
B A+Z+X livello 1 P Q
.........
sottoprogr. Q
dim A,B,Z as integer;
..........
Y A+B+Z livello 2 R
...........
........... corpo
Z X+Y
del P,Q e R
principale
senza parametri
Prof. Filippo TROTTA
24. Regole di “scoping”
M (progr. principale)
Dim X,Y,Z as integer; Regola 1. L’ambiente
sottoprog. P
dim A,X as integer;
di un sottoprogramma
sottoprogr. R è composto solo da
dim A,B as integer;
.......
variabili appartenenti
B A+Z+X agli ambienti locali dei
.........
sottoprogr. Q
programmi che lo
dim A,B,Z as integer; contengono.
..........
Y A+B+Z
Es. non locale di Q
...........
........... corpo sarà composto solo da
del
Z X+Y
principale variabili dell’ambiente
locale di M.
Prof. Filippo TROTTA
25. Regola 2. Se nei
M (progr. principale) programmi contenenti un
dim X,Y,Z as integer;
sottoprog. P
programma P vi sono più
dim A,X as integer; variabili avente lo stesso
sottoprogr. R nome N, ogni riferimento
dim A,B as integer;
.......
ad N in P è alla variabile
B A+Z+X del sottoprogramma di
......... livello più profondo.
sottoprogr. Q
dim A,B,Z as integer; Es.
..........
Y A+B+Z
non-locale di P: Y, Z di M
........... non-locale di Q:X, Y di M
........... corpo non-locale di R: X di P
Z X+Y
del
principale non-locale di R: Y, Z di M
Prof. Filippo TROTTA
26. Regola 3. I nomi dei
M (progr. principale)
Dim X,Y,Z as integer;
parametri formali di
sottoprog. P un sottopr. P agiscono
dim A,X as integer;
sottoprogr. R (x)
come quelli delle
dim A,B as integer; variabili locali.
.......
B
.........
A+Z+X
Es. Se il sottopr. R
sottoprogr. Q avesse un parametro
dim A,B,Z as integer;
..........
formale X o Z, ogni
Y A+B+Z riferimento ad X o Z
...........
........... corpo
sarebbe a queste
Z X+Y
del
principale
parametri.
Prof. Filippo TROTTA
27. OCCORRE LIMITARE
M (progr. principale) AL MINIMO LA
dim X,Y,Z as integer;
sottoprog. P
MODIFICA
dim A,X as integer; DELL’AMBIENTE
sottoprogr. R NON-LOCALE, COME
dim A,B as integer;
.......
AD ES.
B A+Z+X
......... Y A + B + Z in Q
sottoprogr. Q
dim A,B,Z as integer;
..........
Y A+B+Z
........... Effetti laterali
........... corpo
Z X+Y
del
principale
Prof. Filippo TROTTA
28. Esercizio n.1
Un programma principale M di un linguaggio strutturato
a blocchi contiene tre variabili intere A, B, C. M
contiene due sottoprogrammi interni P e Q i cui ambienti
locali sono costituiti dalle variabili intere A, X, Y e B, C,
Y rispettivamente.
P, a sua volta, contiene un sottoprogramma interno R
avente come variabili locali A, X, D intere.
Descrivere gli ambienti non locali delle tre
procedure P, Q, R.
Prof. Filippo TROTTA
29. Risposta Esercizio n.1
M (progr. principale)
dimA,B,C as integer;
sottoprog. P non locale di P: B, C di M
dimr A,X,Y as integer;
sottoprogr. R non locale di Q: A di M
dim A,X,D as integer;
....... non locale di R:Y di P
.........
......... non locale di R: B, C di M
sottoprogr. Q
dim B,C,Y as integer;
..........
..........
...........
...........
...........
Prof. Filippo TROTTA
30. Esercizio n.2
Risolvere il problema precedente
supponenndo che le procedure R e Q
abbiano dei parametri formali di nome
B, C e A, X rispettivamente.
Prof. Filippo TROTTA
31. Risposta Esercizio n.2
M (progr. principale)
dim A,B,C as integer;
sottoprog. P non locale di P: B, C di M
dim A,X,Y as integer;
sottoprogr. R(B, C ..) non locale di Q: nessuna
dim A,X,D as integer;
....... non locale di R:Y di P
.........
......... non locale di R: nessuna
sottoprogr. Q(A, X ..)
dim B,C,Y as integer;
..........
..........
...........
...........
...........
Prof. Filippo TROTTA
32. Esercizio n.3
Dim A, B as integer
PP PROVA_COMPRENSIONE_AMBIENTI_NON_LOCALI
B = 10; A = 10; chiama P; chiama Q; scrivi A, B
End PP
A B Ap
10 10 11 Sub P:
Sub P 8 12
9 B=A+1
Dim A as integer Sub Q:
A = B + 1; B = A + 1 {fine proc. P} B=A-1
A=B-1
Sub Q
B = A - 1; A = B - 1 {fine proc. Q}
Cosa scrive il programma? Quali istruzioni di P e Q
provocano degli effetti Prof. Filippo TROTTA
laterali?
33. Esercitazione Visual Basic
Creare un progetto VB che:
4. Carichi un array di N numeri casuali
5. Visualizzi l’array in una TextBox non modificabile
6. Ordini L’array
7. Visualizzi l’array ordinato in un’altra TextBox
N.B.
• Le due TextBox devono prevedere l’utilizzo di barre di
scorrimento verticale
• Tutto il progetto va in esecuzione con l’evento load del
form
Prof. Filippo TROTTA
34. I parametri e la loro trasmissione.
Si possono dividere i parametri in tre classi direzionali:
- parametri di ingresso (in)
- parametri di uscita (out)
- patrametri di ingresso/uscita (in/out)
Le principali tecniche implementative del passaggio dei
parametri nei più comuni linguaggi di programm. sono:
- passaggio per valore
- passaggio per indirizzo o “by reference”
Prof. Filippo TROTTA
35. Schema riassuntivo
Direzionalità dei parametri
O in out in/out
c M
c e
Tipo VALORE INDIRIZZO INDIRIZZO
u d m
semplice p.a. = p.a. = p.a. =
p i o
espressione variabile variabile
a r
z i
i a Tipo INDIRIZZO INDIRIZZO INDIRIZZO
o strutturato p.a. = p.a. = p.a. =
n variabile variabile variabile
e
Prof. Filippo TROTTA
36. Interfacciamento fra chiamante e chiamato
Interfaccia di comunicazione:
Sub <nome-sub> ([<lista parametri formali>])
Per la chiamata adotteremo la seguente sintassi:
<nome-sub> <arg1>, <arg2>, .......<arg n>
parametri attuali
Prof. Filippo TROTTA
37. Calcolo del quoziente e resto per differenze successive
Sub DIVISIONE (ByVal D, D1 as integer; ByRef Q, R as integer)
R=D
Q=0 parametri formali
do while R >= D1 R = R - D1: Q = Q + 1 loop
End Sub sottoprogrammi
una possibile chiamata:
DIVISIONE (A + B, 3, C, B);
parametri attuali
Prof. Filippo TROTTA
38. Per quanto riguarda il numero e il tipo di argomenti,
occorre, in generale, attenersi alle seguenti regole:
il numero dei parametri attuali deve uguagliare
quello dei parametri formali.
il tipo di un parametro attuale deve essere uguale,
o almeno compatibile, con quello del
corrispondente parametro formale.
Prof. Filippo TROTTA
39. Esercizio n.4
Scrivere l’interfaccia di comunicazione dei
sottoprogrammi che risolvono i seguenti problemi:
a) sommare q ad una data variabile;
b) calcolare, se esistono, le radici intere di una
equazione di 2° grado;
c) calcolare il numero di volte in cui ciascuna
lettera è presente in una data stringa;
d) eseguire una ricerca su un vettore di 100 numeri
reali;
e) Scambia il valore tra due variabili;
Prof. Filippo TROTTA
40. Risposta esercizio n.4
a) Sub sommaq (ByVal X as integer; ByRef S as integer)
b) Sub equazione (ByVal A,B,C as integer; ByRef X1,X2 as single)
c) Sub contalettera (ByVal S as string; ByRef NVOL as VET)
Dim VET(26) as string*1 {26 lettere alfabeto}
d) Sub ricerca (ByRef V () as integer; ByRef J as integer)
J è il valore dell’indice se esiste altrimenti J=0.
e) Sub scambia (ByRef x, y as integer)
Prof. Filippo TROTTA
41. I SOTTOPROGRAMMI FUNZIONALI
A differenza delle procedure, che
manifestano i loro effetti attraverso delle
modifiche all’ambiente (sia con
assegnamenti alle variabili non locali, sia
attraverso i parametri di out e in/out), le
function manifestano il loro effetto
restituendo un valore al programma
chiamante.
Prof. Filippo TROTTA
42. La definizione assume l’aspetto di questo tipo:
function <nome_function> ([<lista dei parametri formali>]) [as <tipo risultato>]
<corpo della funzione>
Prima di tornare al programma chiamante occorre
specificare quale valore restituire. La tecnica più
diffusa è:
<nome_function> <espressione>
Prof. Filippo TROTTA
43. Definizione della funzione per il calcolo del MCD
algoritmo
Function MCD(ByVal x, y As Integer) As Integer di
Dim M As Integer, N As Integer, RESTO As Integer Euclide
M = x: N = y
If M < N Then Scambia M, N ' {chiamata a SCAMBIA}
RESTO = M Mod N
do while RESTO <> 0
M = N: N = RESTO: RESTO = M Mod N
loop Sub Scambia(ByRef x, y As Integer)
Dim h As Integer
MCD = N h=x
End Function x=y
y=h
End Sub
Prof. Filippo TROTTA
44. riferito all’esempio è perfettamente lecito scrivere:
A = MCD(MCD(A, B), MCD(B, 3)) + 1
o
MsgBox (“Il mcd è “ & MCD(A + B, A - B))
sono invece sintatticamente errate scritture come:
MCD(A, B) = w
o
A=InputBox()
B=InputBox()
MCD(A, B);
Prof. Filippo TROTTA
45. Esercizio n.5
Scrivere l’interfaccia di comunicazione delle function
che risolvono i seguenti problemi:
• calcolare l’importo scontato dato l’importo totale e
la percentuale di sconto
• stabilire se un vettore di stringhe è in ordine
alfabetico;
• trasformate un numero intero nella sua
rappresentazione a stringa in base b;
• stabilire se una stringa del tipo GG/MM/AA può
rappresentare la data di un giorno (tener conto
degli anni bisestili);
• Calcolare il numero primo successivo a un numero
dato;
Prof. Filippo TROTTA
46. Risposta esercizio n.5
a) function sconto(ByVal X as Long, ByVal Y as integer)as Long
b) function ordine(ByRef V() as Integer) as boolean
c) function converte (ByVal N as integer) as string
d) function contr_data (ByVal S as string) as boolean
dove S conterrà GG/MM/AA
e) function primo (ByVal n as integer) as integer
Prof. Filippo TROTTA
47. I SOTTOPROGRAMMI RICORSIVI
Se si stabilisce che un sottoprogramma può
chiamare qualsiasi altro sottoprogramma (ad
esso accessibile) dobbiamo esaminare la
possibilità che richiami se stesso.
Quando ciò avviene si parla di
programmazione ricorsiva e l’azione o la
denotazione del richiamo viene detta
ricorsione.
Prof. Filippo TROTTA
48. L’algoritmo di Euclide per trovare il MCD fra m e n con
(m > n) potrebbe essere espresso come segue a parole
come segue:
{per trovare MCD(m, n) si effettui la divisione fra
m ed n. Sia r il resto della divisione. Se r = 0 allora
n è il MCD, altrimenti il MCD(m, n) è uguale al
MCD(n, r)} cioè:
MCD(15, 9) = MCD(9, 6) = MCD(6, 3 ) = 3
certamente si ricorre ma su argomenti sempre più piccoli
fino a trovare un caso in cui non si ricorre più.
Prof. Filippo TROTTA
49. Definizione ricorsiva della funzione per il
calcolo del MCD
function MCD (ByVal M,N as integer) as integer
Dim R as integer algoritmo
R = M mod N di
Euclide
if R = 0 then MCD = N ‘ {o return N}
else MCD = MCD(N, R) ‘{o return MCD (N, R)}
End function
chiamata ricorsiva
Prof. Filippo TROTTA
50. Matematica Programmazione
Costruire un sottoprogramma
ricorsivo per un dato problema
corrisponde a dare una definizione
per induzione della sua soluzione.
Prof. Filippo TROTTA
51. Affinché un sottoprogramma ricorsivo sia
correttamente concepito (in pratica perché non
vada in loop infinito):
a) deve esserci un modo per uscire dal
sottoprogramma evitando ogni chiamata
ricorsiva (corrisponde alla base di
induzione).
b) deve esserci almeno una chiamata ricorsiva
con argomenti orientati alla soluzione di un
sottoproblema più piccolo dell’originale
(corrisponde all’ipotesi d’induzione).
Prof. Filippo TROTTA
52. Non tutti i linguaggi consentono la ricorsione (ad es.
FORTRAN, BASIC, COBOL). Ciò è dovuto al fatto che
la ricorsione richiede un tipo di gestione dinamica
degli ambienti locali.
Una chiamata ricorsiva comporta (come per una
chiamata non ricorsiva) il salvataggio delle informazioni
necessarie a riprendere successivamente il calcolo, e
cioè:
- il punto di ritorno
- i parametri attuali
- lo stato dell’ambiente locale.
Prof. Filippo TROTTA
53. Esercizio n.6
1) scrivere una function ricorsiva per il calcolo del
fattoriale di un numero N >= 0 (che succede se
N < 0?);
2) scrivere una function ricorsiva per il calcolo del
numero di combinazioni di n oggetti presi a K a
K; cioè C n,k
3) scrivere una procedura ricorsiva per eseguire a
ricerca binaria su un vettore A(1 to N). Restituire
l’indice dell’elemento cercato (se esiste) e l’esito
della ricerca;
4) cosa calcola la seguente funzione ricorsiva?
function F (ByVal N, K as integer) as integer
if N <=0 then F = 0 else F = N ^ K + F(N - 1, K)
Prof. Filippo TROTTA
54. SOTTOPROGRAMMI ESTRENI, MODULI E
LA FASE DI COLLEGAMENTO
Fino a questo punto abbiamo fatto l’ipotesi
che i sottoprogrammi (procedure e funzioni)
fossero definiti internamente al programma
principale.
Se questo fosse l’unico modo di definire i
sottoprogrammi, il linguaggio soffrirebbe dei
seguenti inconvenienti:
Prof. Filippo TROTTA
55. a) Una volta scritto un sottoprogramma di uso
generale (ad es. un algoritmo di ordinamento), non
è possibile riutilizzarlo in altri programmi se non
ricopiandone il testo.
b) Non è possibile mettere a punto separatamente
(magari da parte di diverse persone)
sottoprogrammi diversi apparteneneti ad uno
stesso progetto di programmazione.
c) L’impiego di sottoprogrammi inteni può
incoraggiare un certo abuso dell’ambiente non
locale che porta spesso ad errori e all’illeggibilità
dei sottoprogrammi stessi.
Prof. Filippo TROTTA
56. Più sottoprogrammi esterni legati logicamente fra loro (e/o
operanti su un unico ambiente non locale) sono riuniti in
un modulo o libreria.
Si tratta di un modo abbastanza moderno di strutturare e
concepire i programmi, secondo una metodologia che
potremmo chiamare programmazione modulare.
Subroutine Esempi di utilizzo del Modulo
Function
variabile
Prof. Filippo TROTTA