DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Sottoprogrammi
Marco D. Santambrogio – [email protected]
Ver. aggiornata al 24 Agosto 2015
Obiettivi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
•
•
•
Sottoprogrammi/funzioni
Come invocare una funzione
Passaggio dei dati
Funzioni vs Scripts
2
Sottoprogrammi: perché
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Riusabilità
 scrivere una sola volta codice usato più
volte
• Astrazione
 esprimere in modo sintetico operazioni
complesse
• Estendibilità del linguaggio
 non tutte operazioni incluse come
predefinite
3
Sottoprogrammi: come
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Per un sottoprogramma deve essere definito
• quale operazione astratta realizza
• come può essere identificato dal programma principale
• quali parametri coinvolge
•
•
dati in ingresso come punto di partenza dei calcoli
valori restituiti ai programmi che lo usano
• Un sottoprogramma definito può essere utilizzato dal
programma principale
• L’utilizzo è detto chiamata (o invocazione) del
sottoprogramma
• In MATLAB i sottoprogrammi hanno la forma di funzioni
 dominio corrisponde a operandi/dati
 codominio corrisponde a valori calcolati
4
Sintassi della definizione di funzione: testata +
corpo
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• La testata contiene informazioni rilevanti per l’uso corretto
del sottoprogramma
 lista dei risultati, tra parentesi quadre, separati da ‘,’
• matematicamente, il codominio della funzione
 identificatore del sottoprogramma
 lista degli argomenti, tra parentesi tonde, separati da ‘,’
• matematicamente, il dominio della funzione
• Argomenti e risultati detti
 parametri formali se considerati dal punto di vista della
funzione
 parametri attuali se considerati dal punto di vista del
programma chiamante
5
Testata + corpo: esempio
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Funzione fact per il calcolo del fattoriale
function [f]=fact(n)
f=1;
for k=1:n
f=f*k;
end
testata
corpo: è la parte
eseguibile
6
Funzione usata invocandola
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
>> x=fact(4)
x =24
•
Sintassi dell’invocazione ispirata a notazione matematica


una funzione, applicata a suoi argomenti, fornisce un valore del suo codominio
nei programmi i valori denotati da espressioni
•
chiamata di funzione sintatticamente è un’espressione
>> x=fact(2)+fact(3)
x=8
>> fact(fact(3))
ans = 720
• Equivalente a
>> y=fact(3); fact(y)
ans = 720
7
Sintassi dell’invocazione
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
•
Identificatore della funzione
Lista dei parametri attuali racchiusa fra parentesi tonde

parametri attuali
•
•
valori degli argomenti ai quali applicata funzione
ogni parametro è un’espressione qualsiasi (di tipo appropriato…)
–
può essere una chiamata di funzione
•
NB: parametri possono essere di tipo qualsiasi (senza alcuna restrizione)
•
Se ci sono più parametri, corrispondenza tra formali e attuali determinata dall’ordine


•
etc.
Numero parametri attuali = numero parametri formali

•
primo formale  primo attuale
secondo formale  secondo attuale
ovviamente, tipo dei parametri attuali compatibile con tipo dei formali
Nel caso di più parametri in uscita, risultati “raccolti” usando la notazione dei vettori
>> [x,y]=sumProd(4,5)
x=9
y = 20
function [s,p]=sumProd(a,b)
s=a+b;
p=a*b;
8
Dove si definisce (scrive) una funzione?
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• In un m-file di tipo particolare detto “file di funzione”
• Ha estensione “.m” come i file di script
• File di funzione deve
 avere stesso nome della funzione che contiene
 iniziare con la definizione della funzione
• NB: parola function va in minuscolo
• ciò distingue da file di script
 trovarsi in una cartella che sta nel PATH di MATLAB
• Per evitare conflitti di nomi usare exist(‘nomeFunzione’)
 restituisce 0 se la funzione non esiste, ≠0 altrimenti
• es. ‘sin’ è una funzione predefinita (built-in)
>> exist('sin')
ans = 5
9
Esecuzione delle funzioni e passaggio dei parametri
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Comportamento dell’interprete MATLAB durante esecuzione
funzioni
Consideriamo esempio
>> r=12; s=42; [h,k]=MCDmcm(r, s)
h=6
k = 84
function [M, m]=MCDmcm(a, b)
x=a; y=b;
while x ~= y
if x>y
x=x-y;
else
y=y-x;
end;
end;
M=x;
m=a*b/M;
• Descrizione esecuzione fa uso di metafora delle macchine
astratte
 una macchina principale per esecuzione programma chiamante
 una “asservita” per esecuzione funzione
• entrambe dotate di proprio insieme di variabili
 detto ambiente o stato di esecuzione
10
Ambiente
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Ambiente macchina principale contiene
 due variabili r e s, argomenti della chiamata
(parametri attuali di ingresso)
 due variabili h e k cui sono assegnati i risultati
(parametri attuali di uscita)
• Ambiente della macchina asservita (ambiente
locale della funzione) contiene
 i quattro parametri formali, due di ingresso, a e b,
e due di uscita, M ed m
• sono a tutti gli effetti delle variabili locali alla funzione
– visibili solo al suo interno
– esistono indipendentemente da altre variabili anche omonime
esterne
 altre due variabili locali x e y
11
Effetto dell’esecuzione di [h,k] =
MCDmcm(r, s)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Macchina principale valuta espressione a destra
dell’assegnamento ‘=‘
 calcolato il valore dei parametri attuali di ingresso
 creata macchina asservita
 passaggio dei parametri
• copiatura valore parametri attuali in ingresso (r ed s) nei
corrispondenti parametri formali a e b
 ceduto il controllo alla macchina asservita (esecuzione
macchina principale sospesa)
 esecuzione del corpo della funzione
 alla fine variabili M ed m hanno valore risultante
dall’esecuzione nell’ambiente locale
 passaggio dei parametri
• copiatura all’indietro dei parametri formali di uscita (M ed m) nei
parametri attuali h e k
 controllo restituito a macchina principale , macchina
asservita (con tutto il suo ambiente) “distrutta”
12
Sequenza dell’esecuzione di
[h,k] = MCDmcm(r, s)
r:12
h:…
s:42
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
k:…
principale
(1)
13
Sequenza dell’esecuzione di
[h,k] = MCDmcm(r, s)
r:12
h:…
s:42
k:…
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
MCDmcm
x:…
y:…
a:…
M:..
m:…
h:…
k:…
r:12
b:…
s:42
principale
principale
(1)
(2)
14
Sequenza dell’esecuzione di
[h,k] = MCDmcm(r, s)
r:12
h:…
s:42
k:…
MCDmcm
x:…
y:…
MCDmcm
x:…
y:…
a:…
M:..
m:…
a:12
b:42
M:
m:
h:…
k:…
s:42
h:…
k:…
r:12
b:…
s:42
principale
principale
(1)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
r:12
principale
(2)
(3)
15
Sequenza dell’esecuzione di
[h,k] = MCDmcm(r, s)
r:12
h:…
s:42
k:…
x:…
y:…
MCDmcm
x:…
y:…
a:…
M:..
m:…
a:12
b:42
M:
m:
h:…
k:…
s:42
h:…
k:…
r:12
b:…
s:42
MCDmcm
x: 6
y: 6
a:12
b:42
M:6
m:84
s:42
h:…
k:…
r:12
principale
(2)
(1)
r:12
MCDmcm
principale
principale
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
(3)
principale
(4)
16
Sequenza dell’esecuzione di
[h,k] = MCDmcm(r, s)
r:12
h:…
s:42
k:…
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
MCDmcm
x:…
y:…
MCDmcm
x:…
y:…
a:…
M:..
m:…
a:12
b:42
M:
m:
h:…
k:…
s:42
h:…
k:…
r:12
b:…
s:42
principale
principale
principale
(3)
(2)
(1)
MCDmcm
x: 6
y: 6
MCDmcm
x: 6
y: 6
a:12
b:42
M:6
m:84
M:12
m:42
M:6
m:84
s:42
h:…
k:…
r:12
s:42
h:6
k:84
r:12
principale
r:12
principale
(4)
(5)
17
Sequenza dell’esecuzione di
[h,k] = MCDmcm(r, s)
r:12
h:…
s:42
k:…
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
MCDmcm
x:…
y:…
MCDmcm
x:…
y:…
a:…
M:..
m:…
a:12
b:42
M:
m:
h:…
k:…
s:42
h:…
k:…
r:12
b:…
s:42
principale
principale
r:12
principale
(3)
(2)
(1)
MCDmcm
x: 6
y: 6
MCDmcm
x: 6
y: 6
MCDmcm
x: 6
y: 6
a:12
b:42
M:6
m:84
M:12
m:42
M:6
m:84
M:12
m:42
M:6
m:84
s:42
h:…
k:…
r:12
s:42
h:6
k:84
r:12
s:42
h:6
k:84
r:12
principale
principale
principale
(4)
(5)
(6)
18
Scope delle variabili
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Ambienti della macchina principale e di quella asservita sono disgiunti



comunicano attraverso i parametri
possono contenere variabili omonime, che rimangono distinte
NB: dopo esecuzione di una funzione non rimane traccia del suo ambiente
Es.: variabili x e y locali a MCDmcm distinte da quelle
dell’ambiente principale, variabilea indefinita fuori da MDDmcm
>> x=12;y=42;[h,k]=MCDmcm(x,y)
h=6
k = 84
>> [x,y]
ans = 12 42
>> a
??? Undefined function or variable 'a'.
Es.: nessun pericolo di confusione tra variabili omonime
nei due ambienti, comunicazione avviene mediante copiatura
>> M=12;m=42;[a,b]=MCDmcm(M,m)
a= 6
b = 84
>>
•
function [M, m]=MCDmcm(a, b)
x=a; y=b;
while x ~= y
if x>y
x=x-y;
else
y=y-x;
end;
end;
M=x;
m=a*b/M;
Meglio comunque in generale evitare omonimie come queste, che
creano confusione
19
Parametri di tipo array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Parametri di tipo array possibili in ingresso e anche in uscita
 occorre conoscere le dimensioni dell’array in ingresso
• funzione predefinita length(v) fornisce il numero degli elementi di v
 l’array in uscita può essere costruito incrementalmente
Esempio:
function [pres, pos]=cerca(x, v)
cerca lo scalare x nell’array v
se x è presente pres=1 altrimenti pres=0
pos è un vettore con indici di tutti elementi di v uguali a x
20
Parametri di tipo array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Parametri di tipo array possibili in ingresso e anche in uscita
 occorre conoscere le dimensioni dell’array in ingresso
• funzione predefinita length(v) fornisce il numero degli elementi di v
 l’array in uscita può essere costruito incrementalmente
Esempio:
function [pres, pos]=cerca(x, v)
cerca lo scalare x nell’array v
se x è presente pres=1 altrimenti pres=0
pos è un vettore con indici di tutti elementi di v uguali a x
>> A=[1, 2, 3, 4, 3, 4, 5, 4, 5, 6]
A= 1 2 3 4 3 4 5
>> [p, i]=cerca(4,A)
p= 1
i= 4 6 8
>>
4
5
6
21
Parametri di tipo array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Parametri di tipo array possibili in ingresso e anche in uscita
 occorre conoscere le dimensioni dell’array in ingresso
• funzione predefinita length(v) fornisce il numero degli elementi di v
 l’array in uscita può essere costruito incrementalmente
Esempio:
function [pres, pos]=cerca(x, v)
cerca lo scalare x nell’array v
se x è presente pres=1 altrimenti pres=0
pos è un vettore con indici di tutti elementi di v uguali a x
>> A=[1, 2, 3, 4, 3, 4, 5, 4, 5, 6]
A= 1 2 3 4 3 4 5
>> [p, i]=cerca(4,A)
p= 1
i= 4 6 8
>>
4
5
6
function [pres, pos]=cerca(x, v)
p=0; pos=[];
for i=1:length(v)
if v(i)==x
p=p+1;
pos(p)=i;
end
end
pres=p>0;
22
Parametri di tipo Matrice
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Parametri di tipo matrice (o array a n dimensioni) possibili in
ingresso e anche in uscita
 occorre conoscere le dimensioni del parametro in ingresso
• funzione predefinita ndims(v) dà numero n delle dimensioni di v
• funzione predefinita size(v) dà array con n valori: le dimensioni di v
• e.g., [R,C]=size(m) dà, in R e in C, num. righe e colonne della matrice m
• Esempio: function [t]=trasposta(m)
 crea matrice t con righe e colonne scambiate rispetto a ingresso m
23
Parametri di tipo Matrice
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Parametri di tipo matrice (o array a n dimensioni) possibili in
ingresso e anche in uscita
 occorre conoscere le dimensioni del parametro in ingresso
• funzione predefinita ndims(v) dà numero n delle dimensioni di v
• funzione predefinita size(v) dà array con n valori: le dimensioni di v
• e.g., [R,C]=size(m) dà, in R e in C, num. righe e colonne della matrice m
• Esempio: function [t]=trasposta(m)
 crea matrice t con righe e colonne scambiate rispetto a ingresso m
>> m=[1,2,3,4;5,6,7,8;9,10,11,12]
m=
1 2 3 4
5 6 7 8
9 10 11 12
>> trasposta(m)
ans =
1 5 9
2 6 10
3 7 11
4 8 12
24
Parametri di tipo Matrice
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Parametri di tipo matrice (o array a n dimensioni) possibili in
ingresso e anche in uscita
 occorre conoscere le dimensioni del parametro in ingresso
• funzione predefinita ndims(v) dà numero n delle dimensioni di v
• funzione predefinita size(v) dà array con n valori: le dimensioni di v
• e.g., [R,C]=size(m) dà, in R e in C, num. righe e colonne della matrice m
• Esempio: function [t]=trasposta(m)
 crea matrice t con righe e colonne scambiate rispetto a ingresso m
>> m=[1,2,3,4;5,6,7,8;9,10,11,12]
m=
1 2 3 4
5 6 7 8
9 10 11 12
>> trasposta(m)
ans =
1 5 9
2 6 10
3 7 11
4 8 12
function [t]=trasposta(m)
[R,C]=size(m);
for r=1:R
for c=1:C
t(c,r)=m(r,c);
end;
end
25
Parametri di tipo struct
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Parametri di tipo struct (ovviamente) ammessi: ma non c’è (ahimè) controllo di tipi

attezione a corrispondenza parametri attuali-formali, specie in ingresso
26
Parametri di tipo struct
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Parametri di tipo struct (ovviamente) ammessi: ma non c’è (ahimè) controllo di tipi

attezione a corrispondenza parametri attuali-formali, specie in ingresso
Esempio: function [c]=polar2cart(p)
da rappresentazione polare di punto nel piano a quella cartesiana
P
y
P


x
27
Parametri di tipo struct
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Parametri di tipo struct (ovviamente) ammessi: ma non c’è (ahimè) controllo di tipi

attezione a corrispondenza parametri attuali-formali, specie in ingresso
Esempio: function [c]=polar2cart(p)
da rappresentazione polare di punto nel piano a quella cartesiana
>> P.ro=1; P.teta=pi/3
P=
ro: 1
teta: 1.0472
>> Q=polar2cart(P)
Q=
x: 0.5000
y: 0.8660
P
y
P


x
28
Parametri di tipo struct
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Parametri di tipo struct (ovviamente) ammessi: ma non c’è (ahimè) controllo di tipi

attezione a corrispondenza parametri attuali-formali, specie in ingresso
Esempio: function [c]=polar2cart(p)
da rappresentazione polare di punto nel piano a quella cartesiana
>> P.ro=1; P.teta=pi/3
P=
ro: 1
teta: 1.0472
>> Q=polar2cart(P)
Q=
x: 0.5000
y: 0.8660
P
y
P


x
function [c]=polar2cart(p)
c.x=p.ro*cos(p.teta);
c.y=p.ro*sin(p.teta);
29
Parametri di tipo struct
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Parametri di tipo struct (ovviamente) ammessi: ma non c’è (ahimè) controllo di tipi

attezione a corrispondenza parametri attuali-formali, specie in ingresso
Esempio: function [c]=polar2cart(p)
da rappresentazione polare di punto nel piano a quella cartesiana
>> P.ro=1; P.teta=pi/3
P=
ro: 1
teta: 1.0472
>> Q=polar2cart(P)
Q=
x: 0.5000
y: 0.8660
P
y
P


x
NB!!
>> R.to=1; R.teta=pi/3
R=
to: 1
teta: 1.0472
>> Q=polar2cart(R)
??? Reference to non-existent field 'ro'.
Error in ==> polar2cart at 2
c.x=p.ro*cos(p.teta);
function [c]=polar2cart(p)
c.x=p.ro*cos(p.teta);
c.y=p.ro*sin(p.teta);
30
istruzione return
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Termina l’esecuzione della funzione e restituisce il controllo al
programma chiamante
• (usualmente questo avviene dopo l’esecuzione dell’ultima
istruzione della funzione)
• Esempio d’uso: funzione cercaMultiplo cerca un multiplo di un
numero v (assunto 0) in un array a, restituisce posizione p e
valore m del multiplo se trovato (o coppia di zeri altrimenti)
 NB: se nell’array ci sono più multipli se ne può restituire uno qualsiasi
31
istruzione return
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Termina l’esecuzione della funzione e restituisce il controllo al
programma chiamante
• (usualmente questo avviene dopo l’esecuzione dell’ultima
istruzione della funzione)
• Esempio d’uso: funzione cercaMultiplo cerca un multiplo di un
numero v (assunto 0) in un array a, restituisce posizione p e
valore m del multiplo se trovato (o coppia di zeri altrimenti)
 NB: se nell’array ci sono più multipli se ne può restituire uno qualsiasi
%versione senza istruzione return
function [p,m]=cercaMultiploNR(v, a)
trovato=0; k=1;
while k <= length(a) && ~trovato
if mod(a(k),v)==0
p=k; m=a(k); trovato=1;
end;
k=k+1;
end;
if ~trovato
p=0; m=0;
end;
32
istruzione return
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Termina l’esecuzione della funzione e restituisce il controllo al
programma chiamante
• (usualmente questo avviene dopo l’esecuzione dell’ultima
istruzione della funzione)
• Esempio d’uso: funzione cercaMultiplo cerca un multiplo di un
numero v (assunto 0) in un array a, restituisce posizione p e
valore m del multiplo se trovato (o coppia di zeri altrimenti)
 NB: se nell’array ci sono più multipli se ne può restituire uno qualsiasi
function [p,m]=cercaMultiplo(v, a)
for k=1:length(a)
if mod(a(k),v)==0
p=k; m=a(k);
return; %si restituisce il primo multiplo incontrato
% evita ulteriori inutili calcoli
end;
end;
p=0; m=0; %eseguite solo se non trovato alcun multiplo
 NB: l’istruzione return non è indispensabile
%versione senza istruzione return
function [p,m]=cercaMultiploNR(v, a)
trovato=0; k=1;
while k <= length(a) && ~trovato
if mod(a(k),v)==0
p=k; m=a(k); trovato=1;
end;
k=k+1;
end;
if ~trovato
p=0; m=0;
end;
• si può sostituire con combinazioni di altre istruzioni, usando
eventualmente variabili aggiuntive
• permette però di scrivere funzioni più compatte e leggibili
33
Funzioni che chiamano funzioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Finora assunto funzioni invocate dal programma cosiddetto
“chiamante” o “principale”
•
•
•
linea di comando
script
alternativa: istruzione di chiamata inclusa in una (altra) funzione
•
caso molto interessante. con sviluppi importantissimi (ricorsione)
34
Funzioni che chiamano funzioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Finora assunto funzioni invocate dal programma cosiddetto
“chiamante” o “principale”
•
•
•
alternativa: istruzione di chiamata inclusa in una (altra) funzione
•
•
linea di comando
script
caso molto interessante. con sviluppi importantissimi (ricorsione)
n
n!
Esempio semplice: calcolo del coefficiente binomiale
  
 k  k! n  k !
• usiamo funzione fact(n) per il fattoriale definita in precedenza
• (NB: nessun conflitto tra parametro n di fact e parametro n di coefBin)
35
Funzioni che chiamano funzioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Finora assunto funzioni invocate dal programma cosiddetto
“chiamante” o “principale”
•
•
•
alternativa: istruzione di chiamata inclusa in una (altra) funzione
•
•
linea di comando
script
caso molto interessante. con sviluppi importantissimi (ricorsione)
n
n!
Esempio semplice: calcolo del coefficiente binomiale
  
 k  k! n  k !
• usiamo funzione fact(n) per il fattoriale definita in precedenza
• (NB: nessun conflitto tra parametro n di fact e parametro n di coefBin)
function [c]=coefBin(n, k)
f1=fact(n);
f2=fact(k);
f3=fact(n-k);
c=f1/(f2*f3);
36
Esecuzione di coefBin(6,2)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Si generano più macchine astratte asservite. che
 esistono simultaneamente
 solo quella creata per ultima è attiva
 ordine di terminazione delle macchine inverso a quello di
inizio
• (gestione LIFO, Last In First Out)
fact(6)
fact(2)
coefBin(6,2)
coefBin(6,2)
coefBin(6,2)
coefBin(6,2)
interprete
comandi
interprete
comandi
interprete
comandi
interprete
comandi
interprete
comandi
(1)
(2)
(3)
(4)
(5)
fact(4)
coefBin(6,2)
coefBin(6,2)
coefBin(6,2)
interprete
comandi
interprete
comandi
interprete
comandi
(6)
(7)
(8)
interprete
comandi
(9)
37
Confronto Funzioni vs. Script 1/3
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
FUNZIONI
• Hanno un proprio ambiente di esecuzione
 variabili locali distinte da quelle del chiamante
 variabili locali cessano di esistere al ritorno
• Comunicazione mediante copiatura parametri
• Adatte a sviluppo sistematico di applicazioni complesse
 Unità di programma con alta coesione interna e interfacce minimali e
chiaramente identificate
SCRIP
T
• NON hanno un proprio ambiente
di esecuzione
– variabili dello script sono le stesse del chiamante
– variabili create nello script continuano a esistere
• Comunicazione mediante scrittura/lettura variabili comuni
• Adatti a sviluppo esplorativo e prototipale
38
Confronto Funzioni vs. Script 2/3
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: calcolo distanza tra due punti in piano cartesiano mediante script o funzione
% script: file distScript.m
dx = x2 – x1;
dy = y2 –y1;
d = sqrt(dx^2 + dy^2);
quattro punti: a(1,1), b(1,2), c(3,2) e d(3,4);
calcolata distanza tra a e b (=1) e tra c e d (=2)
function [d] = distFunz(x1,y1,x2,y2)
dx = x2 – x1;
dy = y2 –y1;
d= sqrt(dx^2 + dy^2);
>> ax = 1; ay = 1; bx = 1; by = 2;
>> cx = 3; cy = 2; dx = 3; dy = 4;
variabili usate per comunicare con lo script:
- x1, y1, x2, y2 per trasmettere allo script i punti di cui calcolare la distanza
- d per restituire al chiamante il risultato
39
Confronto Funzioni vs. Script 2/3
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: calcolo distanza tra due punti in piano cartesiano mediante script o funzione
% script: file distScript.m
dx = x2 – x1;
dy = y2 –y1;
d = sqrt(dx^2 + dy^2);
quattro punti: a(1,1), b(1,2), c(3,2) e d(3,4);
calcolata distanza tra a e b (=1) e tra c e d (=2)
function [d] = distFunz(x1,y1,x2,y2)
dx = x2 – x1;
dy = y2 –y1;
d= sqrt(dx^2 + dy^2);
>> ax = 1; ay = 1; bx = 1; by = 2;
>> cx = 3; cy = 2; dx = 3; dy = 4;
variabili usate per comunicare con lo script:
- x1, y1, x2, y2 per trasmettere allo script i punti di cui calcolare la distanza
- d per restituire al chiamante il risultato
>> Dab=distFunz(ax,ay,bx,by)
Dab = 1
>> Dcd=distFunz(cx,cy,dx,dy)
Dcd = 2
CORRETT
O
40
Confronto Funzioni vs. Script 2/3
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Esempio: calcolo distanza tra due punti in piano cartesiano mediante script o funzione
function [d] = distFunz(x1,y1,x2,y2)
dx = x2 – x1;
dy = y2 –y1;
d= sqrt(dx^2 + dy^2);
% script: file distScript.m
dx = x2 – x1;
dy = y2 –y1;
d = sqrt(dx^2 + dy^2);
quattro punti: a(1,1), b(1,2), c(3,2) e d(3,4);
calcolata distanza tra a e b (=1) e tra c e d (=2)
>> ax = 1; ay = 1; bx = 1; by = 2;
>> cx = 3; cy = 2; dx = 3; dy = 4;
variabili usate per comunicare con lo script:
- x1, y1, x2, y2 per trasmettere allo script i punti di cui calcolare la distanza
- d per restituire al chiamante il risultato
>> x1=ax; y1=ay; x2=bx; y2=by;
>> distScript
>> Dab = d
Dab = 1
>> x1=cx; y1=cy; x2=dx; y2=dy;
>> distScript
>> Dcd = d
Dcd = 3.1623
>> Dab=distFunz(ax,ay,bx,by)
Dab = 1
>> Dcd=distFunz(cx,cy,dx,dy)
Dcd = 2
ERRATO
CORRETT
O
41
Confronto Funzioni vs. Script 3/3
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Codice che usa la funzione è molto più conciso: incorpora parte
di passaggio parametri
•
•
Perchè lo script dà un risultato errato?
Problema con variabili dx e dy: hanno due ruoli
 nel chiamante rappresentano coordinate del punto d
 nello script differenze delle ascisse e delle ordinate dei due punti
• Prima esucuzione dello script modifica coordinate dx e dy del
punto d: diventa d(0,1)
• Seconda calcola distanza tra il punto c(3,2) e quello erroneo
d(0,1): viene
10  3.1623se non si controlla il risultato
• NB: l’errore passa inosservato
• Morale: script e suo programma chiamante non possono essere
definiti indipendentemente

occorre individuare variabili usate da entrambi script e chiamante
per la comunicazione
 le altre variabili devono essere usate da uno solo dei due
42
Fonti per lo studio + Credits
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Fonti per lo studio
 Introduzione alla programmazione in
MATLAB, A.Campi, E.Di Nitto, D.Loiacono,
A.Morzenti, P.Spoletini, Ed.Esculapio
• Capitolo 4
• Credits
 Prof. A. Morzenti
43
Esempio con ingresso array di strutture
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Esempio: function [dm]=distMedia(a)
 distanza media dall’origine dei punti (strutture con campi x e y)
contenuti nell’array a
>> a.x=1;a.y=0;b.x=0;b.y=2;
>> v=[a,b];
>> distMedia(v)
ans =
1.5000
function [dm]=distMedia(a)
s=0;
for k=1:length(a)
s=s+sqrt(a(k).x^2+a(k).y^2);
end;
dm=s/length(a);
• Una comoda possibilità per le funzioni con più risultati
(parametri in uscita):
Esempio: function [s,p]=sumProd(a,b), invocata con >>[x,y]=sumProd(4,5)
• Possibile restituire solo il primo dei valori (l’altro viene perso)
assegnando il risultato a uno scalare
>> x=sumProd(4,5)
x=9
44
Scarica

PPT - V0