Problema
dati tre vettori a, b, c di dimensione N calcolare
il massimo di ogni vettore
ƒ
Procedure
Procedure
il massimo dei massimi
ƒ
•dati di input: N,
tre vettori a, b, c
•dati di output: maxa, maxb, maxc,
max
2
Algoritmo
Metodologia di costruzione degli
algoritmi
begin MASSIMO
var: a[100], b[100], c[100]: array of real
var: i,N: integer
var: maxa,maxb,maxc,max : real
read N
ISTRUZIONI
for i= 1,N do
NON ELEMENTARI
read a(i), b(i), c(i)
endfor
•Si scrive l’algoritmo per grandi linee
mediante azioni non elementari
•Si raffina l’algoritmo, cioè si sostituiscono
le istruzioni non elementari con istruzioni
elementari
{calcola
{calcola
{calcola
{calcola
massimo
massimo
massimo
massimo
di a (maxa)}
di b (maxb)}
di c (maxc)}
tra i massimi (max)}
print maxa,maxb,maxc,max
end MASSIMO
3
4
1
{calcola massimo di a (maxa)}
{calcola massimo di b (maxb)}
maxa:=a(1)
for i=2, N do
read a(i)
if (maxa<a(i)) then
maxa:=a(i)
endif
endfor
maxb:=b(1)
for i=2, N do
read b(i)
if (maxb<b(i)) then
maxb:=b(i)
endif
endfor
{calcola massimo di c (maxc)}
{calcola massimo tra
i massimi (max)}
maxc:=c(1)
for i=2, N do
read c(i)
if (maxc<c(i)) then
maxc:=c(i)
endif
endfor
STRATEGIA:
1.
scrivere un algoritmo generale
2. assegnare un nome a tale algoritmo
3. fare riferimento ad esso attraverso il nome
quando serve
max:=maxa
if (maxb>max) then
max:=maxb
endif
if (maxc>max) then
max:=maxc
endif
Scrivere una PROCEDURA
5
Algoritmo
Esempio: calcolo massimo
begin MASSIMO
var: a[100], b[100], c[100],mass[3]: array of real
var: i,N: integer
var: maxa,maxb,maxc,max : real
read N
{lettura degli array}
N,a
maxa
N,b
maxb
N,c
maxc
6
MASSIMO_VETT è il
NOME DELLA PROCEDURA
MASSIMO_VETT
USO DELLA PROCEDURA
attraverso il nome
mass(1):=maxa,mass(2):=maxb,mass(3):=maxc
N,mass
max
print maxa,maxb,maxc,max
end MASSIMO
7
8
2
L’istruzione massimo_vett (in: N,a; out: maxa)
nell’algoritmo chiamante attiva l’esecuzione della procedura
Algoritmo
begin MASSIMO
var: a[100], b[100], c[100]: array of real
var: i,N: integer
var: maxa,maxb,maxc,max : real
read N
{lettura degli array}
parametri di input, definiti nell’algoritmo
MASSIMO (alg. chiamante)
procedure massimo_vett (in: N,vett; out: max)
var: vett[N]: array of real
var: i,N: integer
PARAMETRI
var: max: real
FORMALI
max:= vett(1)
for i=2,N do
if(max<vett(i)) then
max:=vett(i)
L’istruzione return
endif
rimanda il controllo
endfor
all’algoritmo chiamante
return
end
{calcola massimo di a (maxa)}
massimo_vett(in:N,a;out:maxa)
{calcola massimo di b (maxb)}
massimo_vett(in:N,b;out:maxb)
{calcola massimo di c (maxc)}
massimo_vett(in:N,c;out:maxc)
PARAMETRI
ATTUALI
mass(1):=maxa,mass(2):=maxb,mass(3):=maxc
{calcola massimo tra i massimi (max)}
massimo_vett(in:3,mass;out:max)
print maxa,maxb,maxc,max
end MASSIMO
parametro di output,
definito nella procedura
9
10
Procedure
Corrispondenza dei parametri
TESTATA DELLA PROCEDURA
procedure massimo_vett (in: N,vett; out: max)
procedure massimo_vett (in: N,vett; out: max)
•Le variabili che compaiono nella testata si chiamano
PARAMETRI FORMALI
massimo_vett(in:N,a;out:maxa)
•I parametri costituiscono un canale di comunicazione
tra l’algoritmo principale e la procedura
CHIAMATA ALLA PROCEDURA
massimo_vett(in:N,a;out:maxa)
•La corrispondenza tra parametri attuali e formali
avviene per posizione
•Le variabili che compaiono nella chiamata si chiamano
PARAMETRI ATTUALI
• È necessaria la corrispondenza del tipo di ciascun
parametro
Una procedura, oltre ai parametri di input e di output,
può avere variabili utilizzate nelle fasi intermedie
(VARIABILI LOCALI alla procedura; es. i)
11
12
3
I parametri formali sono dichiarati
all’interno della procedura
ALGORITMO CHIAMANTE
I valori dei parametri attuali nell’algoritmo
chiamante sono associati ai parametri formali
all’interno della procedura
PROCEDURA
begin MASSIMO
procedure massimo_vett (in: N,vett...)
var: a[100]: array of real
•i parametri attuali di input devono essere
definiti nell’algoritmo chiamante
var: vett[N]: array of real
•i parametri formali di input non devono
essere definiti nella procedura
NOTA
all’interno di una procedura, la dimensione di un
array che è parametro formale può essere
specificata da una variabile che deve a sua volta
essere parametro formale
•i parametri formali di output devono essere
definiti nella procedura
13
14
Esercizio
dato un array a di lunghezza N, sviluppare
•È possibile richiamare piú volte una
procedura
•una procedura per l’ordinamento dell’array
•una procedura per la ricerca binaria di un elemento
nell’array
•un algoritmo che richiami le due procedure
•Le procedure possono essere innestate l’una
nell’altra
•array a
•elemento
LE PROCEDURE
PROCEDURE RAPPRESENTANO
RAPPRESENTANO
LE
MODULI PER
PER SVILUPPARE
SVILUPPARE
MODULI
ALGORITMI COMPLESSI
COMPLESSI
ALGORITMI
procedura
per
l’ordinamento
di a
15
ALGORITMO
array a
ordinato
indicatore di
errore oppure
posizione
dell’elemento in a
procedura
per la
ric. bin.
dell’elem. in a
16
4
Procedura
Problema
dati due vettori ordinati a, b di dimensione rispettivamente
M ed N sviluppare una procedura per la loro fusione (merge)
•dati di input: M, N,
procedure merging(in:a,M,b,N;out:c)
var:a[M], b[N], c[M+N]:array of real
var:M,N: integer
var: ia, ib, ic,L: integer
ia:=1; ib:=1; L:=M+N
due vettori ordinati a, b
•dati di output: un vettore ordinato c di
dimensione M+N i cui elementi appartengono
all’unione degli insiemi degli elementi di a e b
if (ib>N) then
c(ic):=a(ia)
ia:=ia+1
else
c(ic):= b(ib)
ib:=ib+1
endif
for ic=1,L do
if (ia≤M and ib≤N) then
if (a(ia)<b(ib)) then
c(ic):= a(ia)
ia:=ia+1
else
c(ic):= b(ib)
ib:=ib+1
endif
Esempio:
dati di input: 4,
1, 3, 5, 7,
5,
2, 3, 4, 9, 10
dati di output: 1, 2, 3, 3, 4, 5, 7, 9, 10
else
endif
endfor
return
end
17
18
Procedura
Problema
dati due vettori ordinati a, b di dimensione M ed N
sviluppare una procedura per la loro fusione senza ripetizioni
•dati di input: M, N,
due vettori ordinati a, b
•dati di output: L (L≤M+N)
un vettore ordinato c di dimensione L i
cui elementi rappresentano l’unione degli
insiemi degli elementi di a e b
procedure merging(in:a,M,b,N;out:c,L)
var:a[M], b[N], c[M+N]:array of real
var:M,N: integer
var: ia, ib, ic,k: integer
ia:=1; ib:=1; ic:=1
repeat
if (a(ia)<b(ib)) then
c(ic):= a(ia)
ia:=ia+1
else
c(ic):= b(ib)
ib:=ib+1
if (a(ia)=b(ib)) then
ia:=ia+1
endif
endif
ic:=ic+1
until (ia>M or ib>N)
Esempio:
dati di input: 4,
1, 3, 5, 7,
5,
2, 3, 4, 9, 10
dati di output: 1, 2, 3, 4, 5, 7, 9, 10
19
if (ia>M) then
for k=ib,N do
c(ic):= b(k)
ic:=ic+1
endfor
else
for k=ia,M do
c(ic):= a(k)
ic:=ic+1
endfor
endif
L:=ic-1
return
end
20
5
Problema
dati due vettori a, b di dimensione M ed N sviluppare una
procedura per la loro fusione senza ripetizioni
Esercizio:
riscrivere la procedura eliminando
l’ipotesi che a e b siano ordinati
•dati di input: M, N,
due vettori a, b
•dati di output: L (L≤M+N)
un vettore ordinato c di dimensione L i
cui elementi rappresentano l’unione degli
insiemi degli elementi di a e b
Esempio:
dati di input: 4,
5, 7, 1, 3,
5,
4, 3, 9, 2, 10
dati di output: 1, 2, 3, 4, 5, 7, 9, 10
21
22
6