Il 0% ha trovato utile questo documento (0 voti)
6 visualizzazioni7 pagine

02 Funzioni Lucidi

Caricato da

cennifrancesco3
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
6 visualizzazioni7 pagine

02 Funzioni Lucidi

Caricato da

cennifrancesco3
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 7

Le funzioni

Le funzioni (chiamate anche moduli o procedure)


▶ servono per scomporre algoritmi complessi in moduli più semplici
Funzioni sfruttabili più volte
▶ sono blocchi di programmi
András Horváth ▶ sono destinati ad effettuare un’operazione preferibilmente semplice
[email protected] ▶ quasi sempre ricevono dati in input chiamati parametri o argomenti
▶ quasi sempre restituiscono dati in output con la parola chiave return
▶ possono fare parte di una libreria o definita nel programma che scriviamo

Funzioni, András Horváth 1/ 26 Funzioni, András Horváth 2/ 26

Le funzioni Le funzioni
Forma generale per creare una funzione: Per chiamare (effettuare) una funzione basta conoscere la sua interfaccia
composto dal
tipo-restituito nome (lista di parametri) ▶ nome
{ ▶ numero di parametri e il tipo di ogni parametro
...dichiarazioni ed istruzioni...(il corpo della funzione)
▶ tipo del valore restituito
return risultato;
} non bisogna sapere come arriva dai parametri al valore restituito

Nella lista di parametri bisogna fornire per ogni parametro


▶ il tipo
▶ il nome
▶ il tipo di passaggio di parametro:
▶ passaggio di parametro per valore oppure
▶ passaggio di parametro per riferimento

Funzioni, András Horváth 3/ 26 Funzioni, András Horváth 4/ 26


Utilizzo di funzioni di una libreria Dichiarazione e utilizzo di una semplice funzione
L’utilizzo della funzione acos definita nella libreria cmath: 1 // definition and usage of a simple function
1 // usage of cmath functions 2 #include<iostream>
2 #include<iostream> 3 #include<cmath>
3 #include<cmath> // libreria con funzionalita’ matematiche 4 using namespace std;
4 using namespace std; 5
5 6 double area_circle(double);
6 int main(){ 7
7 double pi, x; 8 int main(){
8 9 double r;
9 pi=acos(-1); // acos definita in cmath 10 cout << "raggio: ";
10 cout << "pi: " << pi << endl; 11 cin >> r;
11 12 cout << "l’area: " << area_circle(r) << endl;
12 cin >> x; 13 return 0;
13 cout << "radice quadrata: " << sqrt(x) << endl; // sqrt definita in cmath 14 }
14 15
15 cout << M_PI; // PI, costante definita in cmath 16 // calculate area of a circle
16 17 double area_circle(double rad){
17 return 0; 18 return rad*rad*M_PI;
18 } 19 }
Funzioni, András Horváth 5/ 26 Funzioni, András Horváth 6/ 26

Dichiarazione e utilizzo di una semplice funzione Funzione con più parametri

1 // definition and usage of a simple function 1 // function with more than one parameter
2 #include<iostream> 2 #include<iostream>
3 #include<cmath> 3 using namespace std;
4 using namespace std; 4
5 5 // check roots of 2nd order polynomial, c2 must be non-zero
6 double area_circle(double); 6 bool check_root(double c0, double c1, double c2){
7 7 double d=c1*c1-4*c0*c2; // discriminant
8 int main(){ 8 if(d>=0) return true;
9 double d; 9 return false; }
10 cout << "diametro: "; 10
11 cin >> d; 11 int main(){
12 cout << "l’area: " << area_circle(d/2) << endl; 12 double a0,a1,a2;
13 return 0; 13 for(int i=1;i<=3;i=i+1){
14 } 14 cout << "a0, a1, a2 (!=0): ";
15 15 cin >> a0 >> a1 >> a2;
16 // calculate area of a circle 16 if(check_root(a0,a1,a2)) cout << "Almeno un zero reale." << endl;
17 double area_circle(double rad){ 17 else cout << "Solo zeri complessi." << endl; }
18 return rad*rad*M_PI; 18 return 0; }
19 }
Funzioni, András Horváth 7/ 26 Funzioni, András Horváth 8/ 26
Funzione senza parametri Funzione senza valore restituito

1 // calculate longest edge of right triangle 1 // print cube of a number


2 #include<iostream> 2 #include<iostream>
3 #include<cmath> 3 using namespace std;
4 4
5 // reads positive real number from keyboard 5 // print cube of real number
6 double read_positive(){ 6 void print_cube(double y){
7 double k; 7 cout << y*y*y << endl;
8 do{ 8 }
9 std::cout << "Un numero positivo, per favore:"; 9
10 std::cin >> k; 10 int main(){
11 }while(k<=0); 11 double x;
12 return k; } 12 cin >> x;
13 13 print_cube(x);
14 int main(){ 14 return 0;
15 double k1,k2; 15 }
16 k1=read_positive();
17 k2=read_positive();
18 std::cout << sqrt(k1*k1+k2*k2);
19 return 0; }
Funzioni, András Horváth 9/ 26 Funzioni, András Horváth 10/ 26

Funzione ricorsiva Funzione ricorsiva inefficiente

1 // calculates sum of first k naturals 1 // fibonacci number


2 #include<iostream> 2 #include<iostream>
3 using namespace std; 3 using namespace std;
4 4
5 // function calculates sum of first k naturals 5 // function calculates fibonacci number
6 // recursion based on sum_k(k)=k+sum_k(k-1) 6 int fib(int k){
7 int sum_k(int k){ 7 if(k==0||k==1) // base case
8 if(k==0||k==1) // base case (caso base) 8 return k;
9 return k; 9 return fib(k-1)+fib(k-2); // recursion
10 int a=sum_k(k-1); // recursion (ricorsione) 10 }
11 return k+a; 11
12 } 12 int main(){
13 13 int j;
14 int main(){ 14 cin >> j;
15 int j; 15 cout << fib(j);
16 cin >> j; 16 return 0;
17 cout << sum_k(j); 17 }
18 return 0;
19 }
Funzioni, András Horváth 11/ 26 Funzioni, András Horváth 12/ 26
Passaggio di parametro per valore Illustrazione del programma precedente

1 // illustrazione di passaggio di parametro per valore


2 #include<iostream>
3 using namespace std;
4
5 // x di triple prende il valore del x del main
6 // ma e’ un’altra variabile, funzione non puo’ modificare x del main
7 int triple(int x){
8 x=3*x;
9 return x;
10 }
11
12 int main(){
13 int x=3,y;
14 y=triple(x); // x rimane 3, y diventa 9;
15 cout << x << " " << y << endl;
16 x=triple(x); // x diventa 9 per effetto del =
17 cout << x << endl;
18 return 0;
19 }
Funzioni, András Horváth 13/ 26 Funzioni, András Horváth 14/ 26

Passaggio di parametro per riferimento Illustrazione del programma precedente

1 // illustrazione di passaggio di parametro per riferimento


2 #include<iostream>
3 using namespace std;
4
5 // x di triple prende un riferimento alla variabile che
6 // viene utilizzato come argomento e quindi puo’ modificarlo
7 int triple(int &x){
8 x=3*x;
9 return x+1;
10 }
11
12 int main(){
13 int y=3,x;
14 x=triple(y); // y diventa 9, x diventa 10;
15 cout << x << " " << y << endl;
16 y=triple(x); // x diventa 30, y diventa 31
17 cout << x << " " << y << endl;
18 return 0;
19 }
Funzioni, András Horváth 15/ 26 Funzioni, András Horváth 16/ 26
Passaggio di parametro per riferimento Passaggio di parametro per riferimento per restituire più di un valore
Il passaggio di parametro per riferimento è utile quando 1 // function that returns more than one parameter
▶ quando una grande quantità di dati devono essere passati in input ad una 2 #include<iostream>
3 #include<cmath>
funzione e con passaggio di parametro per riferimento si evita di copiare i dati,
4 using namespace std;
▶ oppure quando la funzione deve restituire più di un valore 5
6 // calculates real roots if any, c2 must be non-zero
7 bool check_and_calc_roots(double c0, double c1, double c2,
8 double &r1, double &r2){
9 double d=c1*c1-4*c0*c2; // discriminant
10 if(d<0) return false;
11 d=sqrt(d);
12 r1=(-c1-d)/2/c2;
13 r2=(-c1+d)/2/c2;
14 return true;
15 }

Funzioni, András Horváth 17/ 26 Funzioni, András Horváth 18/ 26

Passaggio di parametro per riferimento per restituire più di un valore Swap con passaggio di parametro per riferimento

16 ▶ scriviamo una funzione swap tale che


17 int main(){
18 double a0,a1,a2,x1,x2; int a=5,b=10;
19 cout << "a0, a1, a2 (!=0): "; swap(a,b);
20 cin >> a0 >> a1 >> a2; cout << a << " " << b << endl;
21 if(check_and_calc_roots(a0,a1,a2,x1,x2))
22 cout << "Zeri: " << x1 << ", " << x2 << endl; stampi
23 else
24 cout << "Solo zeri complessi." << endl; 10 5
25 return 0; ▶ soluzione:
26 }
void swap(int &x, int &y){
int t;
t=x; x=y; y=t;}

Funzioni, András Horváth 19/ 26 Funzioni, András Horváth 20/ 26


Visibilità delle variabili Visibilità delle variabili

1 // variable scope example 13


2 #include<iostream> 14 int main(){
3 #include<cmath> 15 int x=10; // local variable of main
4 using namespace std; 16 cout << x << endl; // prints 10
5 17 x=f(20); // prints 40 in f
6 int x=5; // global variable 18 {
7 19 int x=15; // local variable of block {}
8 int f(int y){ 20 cout << x << endl; // prints 15
9 int x=2*y; // local variable of f 21 }
10 cout << x << endl; 22 cout << x << endl; // prints 40
11 return x; 23 cout << ::x << endl; // prints 5
12 } 24 x=23;
25 ::x=46;
26 cout << x << endl; // prints 23
27 cout << ::x << endl; // prints 46
28 return 0;
29 }

Funzioni, András Horváth 21/ 26 Funzioni, András Horváth 22/ 26

Static vs automatic Output del programma precedente

1 // static vs automatic storage class example


2 #include<iostream>
f was called 1 times
3 #include<cmath> 28
4 using namespace std; f was called 2 times
5 30
6 int f(int y){
f was called 3 times
7 static int x=0;
8 // static variable maintains value between calls 32
9 x=x+1; f was called 4 times
10 cout << "f was called " << x << " times" << endl; 34
11 return 2*y+28;
f was called 5 times
12 }
13 36
14 int main(){ f was called 6 times
15 for(int i=0;i<=5;i=i+1) 38
16 cout << f(i) << endl;
17 return 0;
18 }
Funzioni, András Horváth 23/ 26 Funzioni, András Horváth 24/ 26
Static vs automatic Output del programma precedente

1 // static vs automatic storage class example


2 #include<iostream>
f was called 1 times
3 #include<cmath> 28
4 using namespace std; f was called 1 times
5 30
6 int f(int y){
f was called 1 times
7 int x=0;
8 // automatic variable does not maintain value between calls 32
9 x=x+1; f was called 1 times
10 cout << "f was called " << x << " times" << endl; 34
11 return 2*y+28;
f was called 1 times
12 }
13 36
14 int main(){ f was called 1 times
15 for(int i=0;i<=5;i=i+1) 38
16 cout << f(i) << endl;
17 return 0;
18 }
Funzioni, András Horváth 25/ 26 Funzioni, András Horváth 26/ 26

Potrebbero piacerti anche