Funzioni in C++ Passaggio di parametri per indirizzo
description
Transcript of Funzioni in C++ Passaggio di parametri per indirizzo
Funzioni in C++Passaggio di parametri per indirizzoPassaggio di parametri per indirizzo
22
Il passaggio di parametri per indirizzo (o per riferimento) passa alla funzione l’indirizzo di memoria del parametro anziché il valore.Non ci sono quindi variabili distinte, una nel main ed una nella funzione,ma la funzione opera sulla stessa area di memoria del main.
Data la variabile intera A per sapere qual è l’indirizzo di memoria di A si usa l’operatore &.
Passaggio di parametri per indirizzoPassaggio di parametri per indirizzo
Osserviamo le istruzioni seguenti:Osserviamo le istruzioni seguenti:
int A;int A;
A=5;A=5;
cout <<“A vale ”<<A <<endl;cout <<“A vale ”<<A <<endl;
cout <<“L’indirizzo di A vale cout <<“L’indirizzo di A vale ”<<&A<<endl;”<<&A<<endl;
Sullo schermo viene Sullo schermo viene prodotto:prodotto:
A vale 5A vale 5
L’indirizzo di A vale L’indirizzo di A vale 0x28ff440x28ff44
Che significa che la variabile A è allocata all’indirizzo di memoria 28ff44 che è espresso in base 16 (0x)
28ff44 A A 5 5
33
Passaggio di parametri per indirizzoPassaggio di parametri per indirizzo
Vediamo il seguente esempio in cui lafunzione “aggiungi” aggiunge 1 ai dueparametri ricevuti. Il primo parametro
vienepassato per valore il secondo per
indirizzo.
void aggiungi(int, int &);void aggiungi(int, int &);
int main()int main()
{{ int a,b;int a,b;
a=0;a=0;
b=5; b=5;
aggiungi(a, b);aggiungi(a, b);
cout<<“nel main a vale”<<a;cout<<“nel main a vale”<<a;
cout<<“nel main b vale”<<b;cout<<“nel main b vale”<<b;
}}void aggiungi(int x, int &y)void aggiungi(int x, int &y){x++;{x++; y++;y++; cout<<“nella funzione x vale”<<x;cout<<“nella funzione x vale”<<x; cout<<“nella funzione y vale”<<y;cout<<“nella funzione y vale”<<y; }}
RAMRAM
MAINMAIN FUNZIONEFUNZIONE
aa bb xx yy
Schermo
00 5 5 00
1166
nella funzione: x vale 1nella funzione: x vale 1
nella funzione: y vale 6nella funzione: y vale 6
nel main: a vale 0nel main: a vale 0
nel main: b vale nel main: b vale 66
// //
3.143.14
44
/* Scambio del valore di due variabili mediante /* Scambio del valore di due variabili mediante valore valore */*/#include <iostream>#include <iostream>using namespace std;using namespace std;/* Scambio riceve due parametri di tipo float */
void Scambio(float , float ); void Scambio(float , float ); // prototipo
int main()int main(){{ float var1 = 3.14, var2 = 1.41;float var1 = 3.14, var2 = 1.41; // variabili locali cout << "Prima dello scambio: var1 = " << var1 << " var2 = " << var2 << endl;cout << "Prima dello scambio: var1 = " << var1 << " var2 = " << var2 << endl; // A Scambio sono passati i valori contenuti in var1 e var2
Scambio (var1, var2); Scambio (var1, var2); // chiamata di funzione cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << endl;endl;}}
// Funzione Scambio che effettua lo scambiovoid Scambio(float x, float y)void Scambio(float x, float y){{ float temp = x;float temp = x; x = y;x = y; y = temp;y = temp;}}
Passaggio di parametri per valorePassaggio di parametri per valore
RAMRAM
MAINMAIN FUNZIONEFUNZIONE
var1var1 var2var2 xx yy temptemp3.143.14 1.41 1.41 // 1.41 1.41 // 3.143.14
1.41 1.41 3.143.14
Prima dello scambio....: var1 = 3.14 var2 = Prima dello scambio....: var1 = 3.14 var2 = 1.411.41
Dopo lo scambio....: var1 = 3.14 var2 = Dopo lo scambio....: var1 = 3.14 var2 = 1.411.41
Schermo
RAMRAM
MAINMAIN FUNZIONEFUNZIONE
var1var1 var2var2 xx yy temptemp
55
/* Scambio del valore di due variabili mediante /* Scambio del valore di due variabili mediante indirizzoindirizzo */ */#include <iostream>#include <iostream>using namespace std;using namespace std;/* Scambio riceve due reference a variabili di tipo float */
void Scambio(float &, float &); void Scambio(float &, float &); // prototipo
int main()int main(){{ float var1 = 3.14, var2 = 1.41;float var1 = 3.14, var2 = 1.41; // variabili locali cout << "Prima dello scambio: var1 = " << var1 << " var2 = " << var2 << endl;cout << "Prima dello scambio: var1 = " << var1 << " var2 = " << var2 << endl; // A Scambio sono passati gli indirizzi a var1 e var2
Scambio (var1, var2); Scambio (var1, var2); // chiamata di funzione cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << endl;endl;}}
// Funzione Scambio che effettua lo scambiovoid Scambio(float &x, float &y)void Scambio(float &x, float &y){{ float temp = x;float temp = x; x = y;x = y; y = temp;y = temp;}}
Passaggio di parametri per indirizzoPassaggio di parametri per indirizzo
3.143.14 1.41 1.41 // // 3.143.14
1.41 1.41 3.143.14
Prima dello scambio....: var1 = 3.14 var2 = Prima dello scambio....: var1 = 3.14 var2 = 1.411.41
Dopo lo scambio....: var1 = Dopo lo scambio....: var1 = 1.41 1.41 var2 = var2 = 3.143.14
Schermo
66
Passaggio di parametri con i vettoriPassaggio di parametri con i vettori
Nel caso dei vettori l’indirizzo di memoria in cui il vettore è allocato è indicato con il nome del vettore.
Nel caso dei vettori il passaggio di parametri per indirizzo è l’unico utilizzabile
77
ESERCIZIOESERCIZIO: diagramma di struttura: diagramma di struttura
Altezze degli alunniAltezze degli alunnidi una classedi una classe
Inserire le Inserire le altezze in un altezze in un vettorevettore
Calcolare Calcolare la media la media delle delle altezzealtezze
Contare Contare quanti quanti alunni alunni superano la superano la mediamedia
Risolviamo il seguente problema:Date le altezze di 30 alunni di una classe, calcolare l’altezza
media estabilire quanti sono gli alunni che superano la media
88
// prototipi delle funzioni// prototipi delle funzioni
void inserisci(int v[],int);void inserisci(int v[],int);
float calcolamedia(int v[],int);float calcolamedia(int v[],int);
void contaaltezze(int v[],int,float);void contaaltezze(int v[],int,float);
int main()int main(){ { int const max=30;int const max=30;int vett[max];int vett[max];float media;float media;inserisci(vett,max);inserisci(vett,max);media=calcolamedia(vett,max);media=calcolamedia(vett,max);contaaltezze(vett,max,media);contaaltezze(vett,max,media);}}
void inserisci(int v[],int dim) // carico il void inserisci(int v[],int dim) // carico il vettorevettore
{{
for (int i=0;i<dim;i++)for (int i=0;i<dim;i++)
{cout<<"\ndigita un elemento del vettore {cout<<"\ndigita un elemento del vettore ";";
cin>>v[i];cin>>v[i];
}}}}
float calcolamedia(int v[],int dim) float calcolamedia(int v[],int dim) //calcolo la media//calcolo la media
{float s,m;{float s,m;
for (int i=0;i<dim;i++)for (int i=0;i<dim;i++)
s=s+v[i];s=s+v[i];
m=s/dim;m=s/dim;
cout<<"\nla media e' "<<m;cout<<"\nla media e' "<<m;
return m;return m;
}}
void contaaltezze(int v[],int dim,float void contaaltezze(int v[],int dim,float m) //calcolo le altezzem) //calcolo le altezze
{int conta=0;{int conta=0;
for (int i=0;i<dim;i++)for (int i=0;i<dim;i++)
{ {
if (v[i]>m)if (v[i]>m)
conta++;conta++;
}}
cout<<"\ngli alunni che superano la cout<<"\ngli alunni che superano la media sono "<<conta;media sono "<<conta;
}}
SOLUZIONE ESERCIZIO: programmaSOLUZIONE ESERCIZIO: programma