Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B)...

21
Sottoprogrammi e Sottoprogrammi e Unità di Compilazione Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari

Transcript of Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B)...

Page 1: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

Sottoprogrammi e Sottoprogrammi e Unità di CompilazioneUnità di Compilazione

Nicola Fanizzi Laboratorio - Corso di Programmazione (B)C.d.L. in InformaticaDIB - Università degli Studi di Bari

Page 2: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

22

SottoprogrammiSottoprogrammi attività ripetitive (routine) all'interno di un

programma possono essere fattorizzate

In Pascal si possono avere procedure e funzioni

intestazione in BNF

procedure <ID-procedura>(<listaparametri>);

<dichiarazioni>

<corpo-procedura>

function <ID-funzione>(<listaparametri>): <tipo>;

<dichiarazioni>

<corpo-funzione>

Page 3: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

33

ParametriParametri la lista parametri è costituita da dichiarazioni

separate da ; passaggio parametri:

– per valore: <lista ID-parametri>: <tipo>

– per indirizzo: VAR <lista ID-parametri>: <tipo>

– <lista ID-parametri>::= <ID>{,<ID>}0

esempio:procedure insert_array

(var A:vettore; var n:integer; MAX:integer);

function restituisce un valore del tipo specificato:

– una variabile con il nome della funzione fa da parametro formale

Page 4: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

44

Chiamata SottoprogrammiChiamata Sottoprogrammi la chiamata avviene scrivendo il nome del

sottoprogramma seguito dalla lista dei parametri effettivi da passare:– per valore: <ID-variabile>

del tipo indicato nella dichiarazione

– per indirizzo: <espressione> del tipo indicato nella dichiarazione

esempio: insert_array(A,i,10*DIM); le funzioni restituiscono un valore da

catturare in un'espressione: trovato := cerca(A,x,100);

supponendo ad es. di aver dichiarato: function ricerca(V: vettore; x,n:integer): boolean;

Page 5: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

55

Attivazione dei SottoprogrammiAttivazione dei Sottoprogrammiad ogni chiamata corrisponde un record di attivazione su una pila: nome sottoprogramma e

riferimento all'inizio del suo corpo riferimento di catena statica

gerarchia di dichiarazione riferimento di ritorno

istruzione successiva all'invocazione

parametri formali variabili locali

Nome Prif. corpo di P

rif. catena statica di P

rif. ritorno da P

parametri formali di P

variabili locali di P

Page 6: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

66

Attivazione dei SottoprogrammiAttivazione dei SottoprogrammiDimensioni del Record di AttivazioneDimensioni del Record di Attivazione

nome sottoprogramma e riferimento al corpo: 1 parola

riferimento di catena statica: 1 parola riferimento di ritorno: 1 parola parametri formali: 100 (oppure 1) + 1 =

= 101 (o 2) parole variabili locali: 1 + 1 = 2 parole

Totale: 106 (o 7) parole

type vettore= array[1..100] of integer;...procedure P (var a:vettore; n: integer);var i, temp: integer;begin...end;

Page 7: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

77

Effetti CollateraliEffetti Collaterali effetti (indesiderati) che modificano la

semantica del programma, in genere dovuti a:– uso di variabili non locali– passaggio di parametri per riferimento a

funzioni esempio:

function doppio(var b:integer):integer;begin

b := b * 2;doppio := b;

end chiamata:

x:=1; write(doppio(x)); stampa 2x:=1; write(doppio(x)+doppio(x)) stampa 6 non 4

Page 8: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

88

VisibilitàVisibilitàEsempioEsempioprogram Visibilita (input, output);var a, b, c: integer;

procedure p2;var a, d, e: integer;begina := 2;b := 2; d := 2; e := 2;writeln('*** p2 : a = ', a : 1, ', b = ', b : 1, ', c

= ', c : 1, ', d = ', d : 1, ', e = ', e : 1)end;

procedure p3;var x: integer;begin

x := 3;writeln('*** p3 : a = ', a : 1, ', b = ', b : 1,

', c = ', c : 1, ', x = ', x : 1)end;

begina := 1; b := 1; c := 1;writeln('*** main : a = ', a : 1, ', b = ', b : 1, ', c

= ', c : 1);p2;p3;writeln('*** main : a = ', a : 1, ', b = ', b : 1, ', c

= ', c : 1)end.

Page 9: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

99

VisibilitàVisibilitàoutputoutput*** main : a = 1, b = 1, c = 1*** p2 : a = 2, b = 2, c = 1, d = 2, e = 2*** p3 : a = 1, b = 2, c = 1, x = 3*** main : a = 1, b = 2, c = 1

Page 10: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1010

Visibilità Visibilità Esempio (2)Esempio (2)program visibile (input, output);var x: integer;

procedure p2;var x: integer;begin x := 1; writeln(x);end;

procedure p1;var x: integer;begin x := 2; p2; writeln(x);end;

{Corpo del programma principale}

begin x := 3; p1; writeln(x); readln;end.

Page 11: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1111

Array come ParametriArray come Parametri il passaggio di un array va fatto tenendo conto

di:– minore efficienza del passaggio per valore a

causa della copia

– possibili effetti collaterali indesiderati nel passaggio per riferiento

esempio: – lettura:

procedure leggi(var A:Tvettore; var N: Tindice);

– scrittura: procedure stampa(A:Tvettore; N: Tindice);

– elaborazione: procedure ordina(var A:Tvettore; N: Tindice);

Page 12: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1212

Visibilità delle VariabiliVisibilità delle Variabili

Parametri: Tipo

(dominio dei valori + operazioni definite) Valore

(tra quelli del dominio) Ambito

(dove è accessibile l'identificatore della variabile)

Durata(quando esiste memoria allocata per la variabile)

Page 13: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1313

Ricerca Binaria IterativaRicerca Binaria Iterativaprocedure bsit (v: vettore; x: real; a,z: integer; VAR esito:boolean);

var m:integer;

beginif a > z then

esito := falseelse

beginrepeatm := (a+z) div 2; if x < v[m] then

z := m-1 else

a := m+1until (a>z) or (v[m]=x);esito := (v[m]=x)end

end;

function bsit (v: vettore; x: real; a,z: integer): boolean;

var m:integer;

beginif a > z then

bsit := falseelse

beginrepeatm := (a+z) div 2; if x < v[m] then

z := m-1 else

a := m+1until (a>z) or (v[m]=x);bsit := (v[m]=x)end

end;

Page 14: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1414

Ricerca Binaria RicorsivaRicerca Binaria Ricorsivaprocedure bsr (v: vettore; x: real; a,z: integer; VAR esito:boolean);

var m:integer;

beginif a > z then

esito := falseelse

beginm := (a+z) div 2; if v[m]=x then

esito := trueelse if x < v[m] then

bsr(v,x,a,m-1,esito) else

bsr(v,x,m+1,z,esito)end

end;

function bsr (v: vettore; x: real; a,z: integer): boolean;

var m:integer;

beginif a > z then

bsr := false else

begin m := (a+z) div 2; if v[m]=x then

bsr := trueelse if x < v[m] then

bsr:= bsr(v,x,a,m-1) else

bsr:= bsr(v,x,m+1,z)end

end;

Page 15: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1515

QuicksortQuicksort RicorsivoRicorsivoprogram quicks(input,output);

const N = 10;

type lista = array[1..N] of integer;

var v: lista; i: integer;

procedure qs (sin,des:integer); var i,j,m: integer;

procedure scambia (var a,b:integer); var aux: integer; begin

aux := a; a := b; b := aux;

end;

begin {quicksort ricorsivo } m:=(v[sin]+v[des]) div 2; i := sin; j := des; repeat while v[i]<m do i := i+1; while m<v[j] do j := j-1; if i<=j then begin scambia(v[i], v[j]); i := i+1; j := j-1; end until i>j; if sin<j then qs(sin,j); if i<des then qs(i,des); end;

begin {principale}for i:=1 to N do

begin write(i, '° elemento: ');

readln(v[i]); end;

qs(1,N); { Chiamata di qs }

writeln;for i:=1 to N do writeln(v[i])end.

Page 16: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1616

Quicksort Quicksort Versione IterativaVersione Iterativatype Vet = array[1..100] of real;

procedure Scambia (var a:Vet; i,j:integer);var temp: real;begin temp:=a[i]; a[i]:=a[j];a[j]:=tempend;

procedure Quicksortit (var v:Vet; l,r:integer);var i, j, stacklen: integer; x: real; stackl, stackr: array[1..50] of integer;

beginstacklen := 1;stackl[stacklen] := l;stackr[stacklen] := r;

repeatl:=stackl[stacklen];r:=stackr[stacklen];stacklen:=stacklen-1;i:=l; j:=r;x:=v[(l+r) div 2];repeat while x > v[i] do i:=i+1;

while v[j] > x do j:=j-1; if i<=j then begin

if v[i]<>v[j] then Scambia(vet, i, j);

i:=i+1; j:=j-1end

until i > j;if l < j then begin stacklen:=stacklen+1;

stackl[stacklen] := l;

stackr[stacklen] := jend;

if i < r then begin stacklen:=stacklen+1; stackl[stacklen] := i; stackr[stacklen] := r end;

until stacklen = 0end;

Page 17: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1717

Mutua RicorsioneMutua RicorsioneDirettiva ForwardDirettiva Forwardprogram Conversione;VAR num : integer; ancora : BOOLEAN; risposta : CHAR;

PROCEDURE stamparesto(q,r: integer); FORWARD;

PROCEDURE stampaB(x: integer); VAR q, r : integer;BEGIN q := x DIV 2; r := x MOD 2; stamparesto(q, r); END;

PROCEDURE stamparesto (q,r:

integer);BEGIN IF q > 0

THEN stampaB(q);write(r); END;

BEGIN writeln('Conversione');writeln('decimali -> binari');

REPEAT writeln;write('Immettere numero:');readln(num);

writeLn;

write(num, 'decimale ');write('in binario e'':');stampaB(num);

writeLn;

write('Ancora? S/N ');readln(risposta); ancora := (risposta = 'S') or (risposta = 's');

UNTIL NOT ancora; END.

Page 18: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1818

Unità di CompilazioneUnità di Compilazione estensione del Pascal standard unità compilabili separatamente (keyword unit) si dividono in 2 parti:

interfaccia (keyword interface): dichiarazioni esportabili (globali a tutta l'unità) implementazione (keyword implementation): definizioni dei sottoprogrammi dichiarati e di costanti, tipi, variabili e sottoprogrammi non esportabili (locali)

opzionalmente può comparire una sezione di inizializzazione, racchiusa in un blocco begin-end

Page 19: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

1919

Unità di CompilazioneUnità di CompilazioneStrutturaStrutturaunit <ID-Unit>

interface<dichiarazione-costanti> <dichiarazione-tipi> <dichiarazione-variabili><definizione-sottoprogrammi>

implementation<dichiarazione-costanti> <dichiarazione-tipi> <dichiarazione-variabili><definizione-sottoprogrammi>

[begin {inizializzazioni} ] end.

Page 20: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

2020

Unità di CompilazioneUnità di CompilazioneFunzioni di servizio su vettoriFunzioni di servizio su vettoriunit Servizio_Vettori;interfaceprocedure shell (var a:Tvettore; n:integer);procedure bubble (var a:Tvettore; n:integer);procedure leggi (var a:Tvettore; var n:integer);procedure stampa (a:Tvettore; n:integer);function cerca (x:Tbase; var a:Tvettore;

n:integer): boolean;

implementation

procedure shell (var a:Tvettore; n:integer);begin . . . end;procedure bubble (var a:Tvettore; n:integer);begin . . . end;procedure leggi (var a:Tvettore; var n:integer);begin . . . end;procedure stampa (a:Tvettore; n:integer);begin . . . end;function cerca (x:Tbase; a:Tvettore; n:integer): boolean;begin . . . end;

end.

Page 21: Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.

2121

Unità di CompilazioneUnità di CompilazioneSomma usando solo succ() e pred()Somma usando solo succ() e pred()unit Somma;interface

function SommaIt(a,b:integer):integer;function SommaR(a,b:integer):integer;

implementation

function SommaIt(a,b:integer):integer;begin while a > 0 do

begin b := succ(b); a:=pred(a)

end; SommaIt := b;

end;

function SommaR(a,b:integer):integer;begin

if (a = 0) then SommaR := b else SommaR := succ(SommaR(pred(a),b))

end;