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