Process synchronization

Slides:



Advertisements
Presentazioni simili
Dipartimento di Matematica
Advertisements

Creazione di matrici Delimititatore di riga Delimititatore di matrice
Diagrammi 2D e 3D Funzioni di ordine superiore
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sottoprogrammi Marco D. Santambrogio – Ver. aggiornata al 20 Dicembre 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sottoprogrammi Marco D. Santambrogio – Ver. aggiornata al 14 Dicembre 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sottoprogrammi Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Script bash I file di comandi in Linux. BASH  Bourne Again Shell  Modalità interattiva o batch (file di comandi)  Ambiente di programmazione “completo”
Le funzioni in C++. Introduzione  Spesso alcuni gruppi di operazioni vengono ripetute in diverse parti all’interno del medesimo programma  Si pensi.
Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica FONDAMENTI DI INFORMATICA Domenico Talia
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Parte 2 Programmare in Matlab – I Sommario: Introduzione: m-file Strutture condizionali e cicli –Istruzione “if” + Operatori logici in MatlabIstruzione.
Fondamenti di Informatica A - Massimo Bertozzi LE FUNZIONI.
1 Simulazione Numerica dei Fenomeni di Trasporto Necessità di introduzione dei tensori  11  12  13  23  21  22 Vogliamo descrivere in un modo che.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
CONTROLLO DELLA CONCORRENZA
Process synchronization
Process synchronization
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
Ambienti di Programmazione per il Software di Base
© 2007 SEI-Società Editrice Internazionale, Apogeo
Process synchronization
11. Lettura e Scrittura di file in Matlab
Process synchronization
Terza Lezione → Navigare nel file System → parte 2
Script Marco D. Santambrogio –
Diagrammi 2D e 3D Funzioni di ordine superiore
IL CONCETTO DI ALGORITMO
Dal problema al processo risolutivo
10. Programmazione Ricorsiva Ing. Simona Colucci
MATRICI (ARRAY) IN MATLAB/OCTAVE
Le postcondizioni specificano l’output della funzione.
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Diagrammi 2D e 3D Funzioni di ordine superiore
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Informatica per l’Ingegneria
Process synchronization
Informazioni globali nelle pagine HTML
Process synchronization
Process synchronization
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmare.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Secondo Programma in C.
Ricorsione 16/01/2019 package.
Process synchronization
LA RETTA.
Definizione di linguaggio di programmazione
Process synchronization
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Process synchronization
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Process synchronization
Processi decisionali e funzioni di controllo
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Process synchronization
Esercitazione guidata 1
Unità 1 Programmi base.
Process synchronization
Diagrammi 2D e 3D Funzioni di ordine superiore
I sistemi di equazioni di I grado
Array e Stringhe Linguaggio C.
Process synchronization
La programmazione strutturata
Corso di Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
Process synchronization
Script su vettori Realizza uno script che chiede in input una dimensione d e crea un vettore di d numeri interi casuali. Poi calcola la somma dei due numeri.
Corso di Fondamenti di Informatica
Transcript della presentazione:

Process synchronization Operating System Sottoprogrammi Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 14 Dicembre 2015 © 2005 William Fornaciari

Obiettivi Sottoprogrammi/funzioni Come invocare una funzione Passaggio dei dati Funzioni vs Scripts

Sottoprogrammi: perché 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

Sottoprogrammi: come 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

Funzione fact per il calcolo del fattoriale Testata + corpo 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

Sintassi della definizione di funzione: testata + corpo 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

Funzione usata invocandola >> 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)

Sintassi dell’invocazione 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 primo formale  primo attuale secondo formale  secondo attuale etc. Numero parametri attuali = numero parametri formali 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;

Dove si definisce (scrive) una funzione? 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 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

Esecuzione delle funzioni e passaggio dei parametri Comportamento dell’interprete MATLAB durante esecuzione funzioni Consideriamo esempio >> r=12; s=42; [h,k]=MCDmcm(r, s) h = 6 k = 84 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 function [M, m]=MCDmcm(a, b) x=a; y=b; while x ~= y if x>y x=x-y; else y=y-x; end; M=x; m=a*b/M;

Ambiente 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

Effetto dell’esecuzione di [h,k] = MCDmcm(r, s)

Effetto dell’esecuzione di [h,k] = MCDmcm(r, s) 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 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”

Sequenza dell’esecuzione di [h,k] = MCDmcm(r, s) principale (1)

Sequenza dell’esecuzione di [h,k] = MCDmcm(r, s) x:… y:… a:… b:… M:.. m:… r:12 s:42 h:… k:… r:12 s:42 h:… k:… principale principale (1) (2)

Sequenza dell’esecuzione di [h,k] = MCDmcm(r, s) x:… y:… MCDmcm x:… y:… a:… b:… M:.. m:… a:12 b:42 M: m: r:12 s:42 h:… k:… r:12 s:42 h:… k:… r:12 s:42 h:… k:… principale principale principale (1) (2) (3)

Sequenza dell’esecuzione di [h,k] = MCDmcm(r, s) x:… y:… MCDmcm x:… y:… a:… b:… M:.. m:… a:12 b:42 M: m: r:12 s:42 h:… k:… r:12 s:42 h:… k:… r:12 s:42 h:… k:… principale principale principale (1) (2) (3) MCDmcm x: 6 y: 6 a:12 b:42 M:6 m:84 r:12 s:42 h:… k:… principale (4)

Sequenza dell’esecuzione di [h,k] = MCDmcm(r, s) x:… y:… MCDmcm x:… y:… a:… b:… M:.. m:… a:12 b:42 M: m: r:12 s:42 h:… k:… r:12 s:42 h:… k:… r:12 s:42 h:… k:… principale principale principale (1) (2) (3) 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 r:12 s:42 h:… k:… r:12 s:42 h:6 k:84 principale principale (4) (5)

Sequenza dell’esecuzione di [h,k] = MCDmcm(r, s) x:… y:… MCDmcm x:… y:… a:… b:… M:.. m:… a:12 b:42 M: m: r:12 s:42 h:… k:… r:12 s:42 h:… k:… r:12 s:42 h:… k:… principale principale principale (1) (2) (3) 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 r:12 s:42 h:… k:… r:12 s:42 h:6 k:84 r:12 s:42 h:6 k:84 principale principale principale (4) (5) (6)

Scope delle variabili 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 >> Meglio comunque in generale evitare omonimie come queste, che creano confusione function [M, m]=MCDmcm(a, b) x=a; y=b; while x ~= y if x>y x=x-y; else y=y-x; end; M=x; m=a*b/M;

Parametri di tipo array 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

Parametri di tipo array 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 4 5 6 >> [p, i]=cerca(4,A) p = 1 i = 4 6 8 >>

Parametri di tipo array 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 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 pres=p>0; >> A=[1, 2, 3, 4, 3, 4, 5, 4, 5, 6] A = 1 2 3 4 3 4 5 4 5 6 >> [p, i]=cerca(4,A) p = 1 i = 4 6 8 >>

Parametri di tipo Matrice 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

Parametri di tipo Matrice 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

Parametri di tipo Matrice 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

Parametri di tipo struct Parametri di tipo struct (ovviamente) ammessi: ma non c’è (ahimè) controllo di tipi attezione a corrispondenza parametri attuali-formali, specie in ingresso

Parametri di tipo struct 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 x y P

Parametri di tipo struct 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 x y P

Parametri di tipo struct 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 x y P function [c]=polar2cart(p) c.x=p.ro*cos(p.teta); c.y=p.ro*sin(p.teta);

Parametri di tipo struct 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 >> R.to=1; R.teta=pi/3 R = to: 1 >> Q=polar2cart(R) ??? Reference to non-existent field 'ro'. Error in ==> polar2cart at 2 c.x=p.ro*cos(p.teta);   P x y P NB!! function [c]=polar2cart(p) c.x=p.ro*cos(p.teta); c.y=p.ro*sin(p.teta);

istruzione return 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

istruzione return 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; if ~trovato p=0; m=0;

istruzione return 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 NB: l’istruzione return non è indispensabile si può sostituire con combinazioni di altre istruzioni, usando eventualmente variabili aggiuntive permette però di scrivere funzioni più compatte e leggibili %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; if ~trovato p=0; m=0; 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; p=0; m=0; %eseguite solo se non trovato alcun multiplo

Funzioni che chiamano funzioni 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)

Funzioni che chiamano funzioni 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) Esempio semplice: calcolo del coefficiente binomiale usiamo funzione fact(n) per il fattoriale definita in precedenza (NB: nessun conflitto tra parametro n di fact e parametro n di coefBin)

Funzioni che chiamano funzioni 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) Esempio semplice: calcolo del coefficiente binomiale 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);

Esecuzione di coefBin(6,2) 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) interprete comandi (1) coefBin(6,2) (2) fact(6) (3) (4) fact(2) (5) (6) fact(4) (7) (8) (9)

Confronto Funzioni vs. Script 1/3 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 SCRIPT 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

Confronto Funzioni vs. Script 2/3 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); function [d] = distFunz(x1,y1,x2,y2) 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

Confronto Funzioni vs. Script 2/3 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); function [d] = distFunz(x1,y1,x2,y2) 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 >> Dab=distFunz(ax,ay,bx,by) Dab = 1 >> Dcd=distFunz(cx,cy,dx,dy) Dcd = 2 CORRETTO

Confronto Funzioni vs. Script 2/3 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); function [d] = distFunz(x1,y1,x2,y2) 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; >> Dcd = d Dcd = 3.1623 ERRATO >> Dab=distFunz(ax,ay,bx,by) Dab = 1 >> Dcd=distFunz(cx,cy,dx,dy) Dcd = 2 CORRETTO

Confronto Funzioni vs. Script 3/3 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 NB: l’errore passa inosservato se non si controlla il risultato 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

Fonti per lo studio + Credits Introduzione alla programmazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio Capitolo 4 Credits Prof. A. Morzenti

Esempio con ingresso array di strutture Esempio: function [dm]=distMedia(a) distanza media dall’origine dei punti (strutture con campi x e y) contenuti nell’array 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 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); >> a.x=1;a.y=0;b.x=0;b.y=2; >> v=[a,b]; >> distMedia(v) ans = 1.5000