Procedure - Funzioni
Procedure e funzioni Parti di programma a cui è associato un nome e che può essere attivata mediante una chiamata. Le funzioni a differenza delle procedure restituisco un valore. Scrivere un programma che legge da input le misure dei lati di tre diversi parallelepipedi e ne calcoli il volume: vol1 := largh1 * prof1 * alt1 vol2 := largh2 * prof2 * alt2 vol3 := largh3 * prof3 * alt3 Cosa usereste per leggere i valori e per calcolare il volume? Procedura o funzione?
Parametri Parametri formali: sono quelli specificati nell’intestazione della procedura: Procedure p(x: char; var t: integer); Parametri attuali: sono quelli specificati al momento della chiamata, dopo il nome della procedura: p(a, b); I parametri attuali devono corrispondere, per numero e per tipo, ai parametri formali. Quindi a deve essere di tipo char e b di tipo integer.
Passaggio dei parametri Per valore: Il parametro per valore è una variabile locale della procedura/funzione, che viene inizializzata, al momento della chiamata, con il valore fornito come parametro attuale, che può essere una variabile o anche un’espressione di tipo equivalente al parametro formale. Per indirizzo (o per riferimento): Il parametro attuale deve essere una variabile dello stesso tipo specificato per il parametro formale. Ogni operazione riguardante il parametro formale è applicata direttamente al parametro attuale. Il nome del parametro formale deve essere preceduto dalla parola chiave var.
VAR larghezza, profondita, altezza, volume, i: integer; Procedure leggi (var larg, prof, alt:integer); BEGIN writeln('parallelepipedo ',i); write('inserire i valori della larghezza: '); readln(larg); write('inserire i valori della profondita'': '); readln(prof); write('inserire i valori dell''altezza: '); readln(alt); END; function calcolavolume (larg, prof, alt:integer):integer; BEGIN calcolavolume := larg * prof * alt; END; BEGIN for i:=1 to 3 do begin leggi (larghezza, profondita, altezza); WHILE (larghezza < 0) OR (profondita < 0) OR (altezza < 0) DO BEGIN write('Dati non corretti - Ripetere l''inserimento '); leggi (larghezza, profondita, altezza); END; volume:=calcolavolume(larghezza,profondita,altezza); writeln('Il volume del parallelepipedo e'' ', volume); writeln; end; readln; END. Passaggio per indirizzo Passaggio per valore
Individuare le chiamate non corrette Procedure A (x: integer; var y,z: integer; w: char); Le variabili n, k, h sono di tipo integer, b è di tipo char. A (n+1, k, h, b) A (n, k+1, h, b) A(ord(b), k, h, chr(n)) A(k div h, k, h, chr(n)) A( k / h, k, h, chr(n))
Simulazione Si simuli “manualmente” l'esecuzione del seguente programma al fine di dedurre l'output prodotto. VAR x, y: integer; PROCEDURE piu5 (a: integer; VAR b: integer); BEGIN writeln ('All''inizio dell''esecuzione di piu5: ',a:4,b:4); a := a + 5; b := b + 5; writeln ('Alla fine dell''esecuzione di piu5: ',a:4,b:4) END; BEGIN x := 10; y := 20; piu5(x,y); writeln ('Al rientro, dopo l''esecuzione di piu5: ',x:4, y:4); readln; END.
Inizializzazione nel main x1020y BEGIN x := 10; y := 20; piu5(x,y); writeln ('Al rientro, dopo l''esecuzione di piu5: ',x:4, y:4); readln; END.
Chiamata alla procedura: Piu5(x,y),dove x=10, y=20 x10 a y20 Quindi: writeln ('All''inizio dell''esecuzione di piu5: ',a:4,b:4); stampa All'inizio dell'esecuzione di piu5: x 10 b y25a15 Quindi: writeln ('Alla fine dell''esecuzione di piu5: ',a:4,b:4) stampa Alla fine dell'esecuzione di piu5: Infine: writeln('Al rientro, dopo l''esecuzione di piu5: ',x:4, y:4); stampa Al rientro, dopo l''esecuzione di piu5: BEGIN writeln ('All''inizio dell''esecuzione di piu5: ',a:4,b:4); a := a + 5; b := b + 5; writeln ('Alla fine dell''esecuzione di piu5: ',a:4,b:4) END; PROCEDURE piu5 (a: integer; VAR b: integer); b
program EC; {$APPTYPE CONSOLE} uses SysUtils; var b, ris: integer; Function doppio(Var a: integer): integer; begin a:=2*a; doppio:=a; end; begin b:=3; ris:=2* doppio (b); writeln('Primo risultato: ', ris); writeln; b:=3; ris:= doppio (b) + doppio (b); writeln ('Secondo risultato: ', ris); readln; end. Cosa stampa?
Primo risultato: ris:=2* doppio (B) B3 A B6 A B3 La funzione doppio(b) = 2 ris = 2 * 6 = 12 Quindi writeln('Primo risultato: ', ris); stampa Primo risultato: 12 Function doppio (Var a: integer): integer; begin a:=2*a; doppio:=a; end;
Secondo risultato: ris:=doppio(B)+doppio(B) B3 A B6 A B3 La funzione doppio(B) = 6 Ris = 6 + doppio(B) B6 A B12 A B6 La funzione doppio(B) = 12 Risultato = = 18 Function doppio (Var a: integer): integer; begin a:=2*a; doppio:=a; end;
Var a, b: integer; Procedure Proc1 (var x,y: integer; c: integer); var aus: integer; Procedure Proc2 (var v,z: integer; c: integer); begin v:=v+c; z:=z+c; end; begin aus:=x; x:=y; y:=aus; Proc2(x,y,c); end; begin write ('Digita il primo numero: '); readln (a); write ('Digita il secondo numero: '); readln (b); Proc1(a,b,5) writeln('Il primo numero e'': ',a); writeln('Il secondo numero e'': ',b); readln; end. Cosa succede quando chiamo: Proc1 (a, b, 5) ?????? Se a=4, b=6 Si ha a = 11 b= 9 Scambia x e y Somma a v e z il valore c=5
Esercizio: permutazione random Dato un un numero intero n, costruire una procedura che generi una permutazione random di n elementi. Di cosa necessitiamo? Random(numero): funzione che ritorna un numero random nell’intervallo 0 <= X < numero. Se numero non è specificato, restituisce un valore reale nell’intervallo 0<= X < 1. E se volessi generare un numero 1 <= X <= numero? Randomize: procedura che inizializza il generatore di numeri random utilizzando un valore random ottenuto dal clock di sistema.
Procedura Procedure permRandom (var A: tipoArray); Var i: integer; begin for i:=1 to n do p[i]:=i; for i:=n downto 2 do begin x:= random(i)+1; //Deve generare 1 <= x <= i scambia (v[i], v[x]); end;
Esempio: n= for i:=1 to n do p[i]:=i; for i:=n downto 2 do begin x:= random(i)+1; scambia (v[i], v[x]); end; i=4, x=random(4)+1= 2Scambia(v[4], v[2]) i=3, x=random(3)+1= 2Scambia(v[3], v[2]) i=2, x=random(2)+1= 1Scambia(v[2], v[1]) La permutazione random è
Esercizio 2 Data un numero intero n, costruire una procedura che generi una permutazione random di n elementi e la disponga in una matrice 4x4. Esempio: gioco del 15. Il 16 corrisponde alla casella vuota