• Non ci sono risultati.

Funzioni in C++

N/A
N/A
Protected

Academic year: 2021

Condividi "Funzioni in C++"

Copied!
8
0
0

Testo completo

(1)

Funzioni in C++

Passaggio di parametri per indirizzo

Passaggio di parametri per indirizzo

(2)

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 indirizzo Passaggio 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 ”<<&A<<endl;

cout <<“L’indirizzo di A vale ”<<&A<<endl;

Sullo schermo viene prodotto:

Sullo schermo viene prodotto:

A vale 5 A vale 5

L’indirizzo di A vale 0x28ff44 L’indirizzo di A vale 0x28ff44

Che significa che la variabile A è allocata all’indirizzo di memoria 28ff44 che è espresso in base 16 (0x)

28ff44 A A 5 5

(3)

Passaggio di parametri per indirizzo Passaggio di parametri per indirizzo

Vediamo il seguente esempio in cui la funzione “aggiungi” aggiunge 1 ai due

parametri ricevuti. Il primo parametro viene passato 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 x x y y

Schermo

0 0 5 5 0 0 1 1 6 6

nella funzione: x vale 1 nella funzione: x vale 1 nella funzione: y vale 6 nella funzione: y vale 6

nel main: a vale 0 nel main: a vale 0

nel main: b vale nel main: b vale 6 6

/ / / /

(4)

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 << endl; cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << endl;

}}

// Funzione Scambio che effettua lo scambio

void 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 valore Passaggio di parametri per valore

RAMRAM

MAINMAIN FUNZIONEFUNZIONE

var1var1 var2var2 x x y y temptemp

3.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 = 1.41 Prima dello scambio....: var1 = 3.14 var2 = 1.41 Dopo lo scambio....: var1 = 3.14 var2 = 1.41 Dopo lo scambio....: var1 = 3.14 var2 = 1.41

Schermo

(5)

RAMRAM

MAINMAIN FUNZIONEFUNZIONE

var1var1 var2var2 xx y y temptemp

/* 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 << endl; cout << "Dopo lo scambio....: var1 = " << var1 << " var2 = " << var2 << endl;

}}

// Funzione Scambio che effettua lo scambio

void 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 indirizzo Passaggio 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 = 1.41 Prima dello scambio....: var1 = 3.14 var2 = 1.41 Dopo lo scambio....: var1 =

Dopo lo scambio....: var1 = 1.41 1.41 var2 = var2 = 3.143.14

Schermo

(6)

66

Passaggio di parametri con i vettori Passaggio 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

(7)

ESERCIZIO

ESERCIZIO : diagramma di struttura : diagramma di struttura

Altezze degli alunni Altezze degli alunni di una classe

di una classe

Inserire le Inserire le

altezze in un altezze in un

vettore vettore

Calcolare la Calcolare la media delle media delle altezze

altezze

Contare Contare

quanti alunni quanti alunni

superano la superano la

media media

Risolviamo il seguente problema:

Date le altezze di 30 alunni di una classe, calcolare l’altezza media e

stabilire quanti sono gli alunni che superano la media

(8)

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 vettore void inserisci(int v[],int dim) // carico il vettore {{

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) //calcolo la float calcolamedia(int v[],int dim) //calcolo la

media 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 m) void contaaltezze(int v[],int dim,float m)

//calcolo le altezze //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 media cout<<"\ngli alunni che superano la media sono "<<conta;

sono "<<conta;

}}

SOLUZIONE ESERCIZIO: programma SOLUZIONE ESERCIZIO: programma

Riferimenti