Enrere Mòdul 5
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Disseny d’una funció que intercanvia el contingut de dues variables

En aquesta pràctica aprendrem la diferència entre el pas d'arguments per valor i per referència. Veurem com crear una funció que modifiqui els seus arguments.

 

Desenvolupament de la pràctica

Com hem vist en mòduls anteriors, al passar paràmetres a una funció es passa una còpia del contingut de la variable. Això implica que la funció no pot modificar les variables externes a ella (a excepció de les globals). Podem modificar el contingut d’aquesta còpia però no afectarà al contingut de la variable original.

Per entendre bé aquest concepte anem a estudiar el següent programa:

// m5p021.cpp: Funció permuta (I) pas per valor.

#include <iostream.h>

void permuta(int a,int b);

void main(){

    int x=10, y=20;

    cout<<" Abans de la crida a la funció x= "<<x<<" i y = "
                <<y<<endl;

    permuta(x,y);

    cout<<" Després de la crida a la funció x= "<<x
                <<" i y ="<<y<<endl;

}

 

// les variables a i b son locals a la funció i recullen una còpia dels valors de x , y

 

void permuta(int a,int b){

     int canvia;

     canvia=a;
     a=b;
          b=canvia;

}

 

Abans de la crida a la funció x= 10 i y = 20
Després de la crida a la funció x= 10 i y =20

Explicació del programa

Aquest programa no canvia el valor de les variables. Per què? perquè la comunicació entre una funció i aquella que fa la crida és per al traspàs de valors i no de variables. En realitat, aquest programa intercanvia els valors dels seus paràmetres a i b però no els arguments de la crida, és a dir, el valor inicial és  a = 10 i b = 20, i després a = 20 i b = 10, però x = 10 i y = 20 tant abans de la crida a la funció permuta, com després.

En general podem enviar a les funcions dos tipus d'informació sobre les variables. En primer lloc, si usem la sintaxi :

funcio1(x);

li transferim el valor de la variable x. En segon lloc, si utilitzem la sintaxi:

funcio2(&x);

li transferim l'adreça de memòria de la variable x.

El primer format requereix que la definició de la funció inclogui un argument formal del mateix tipus que la variable x:

funciol(int num){
   ................
}

i el segon format, necessita que la definició de la funció inclogui un argument formal que sigui un punter al tipus de variable corresponent:

funcio2(int *prt){
.................
}

S'utilitza el primer format quan la funció necessita el valor per fer algun càlcul o executar alguna acció sobre el valor de la variable. Usarem el segon format quan la funció necessiti modificar les variables del programa de la crida. És aquest, evidentment, el cas de la funció que volem fer, per tant, modificarem el codi de la següent forma:

// m5p022.cpp: Funció permuta (II) pas per referència

#include <iostream.h>

void permuta(int *a,int *b);

void main(){

    int x=10, y =20;

    cout<<" Abans de la crida a la funció x= "<<x
                <<" i de y= "<<y<<endl;

    permuta(&x,&y);

    cout<<" Després de la crida a la funció x= "<<x
                <<" i de y="<<y<<endl;

}

void permuta(int *a , int *b){

    int canvia;

    canvia=*a;
        *a=*b;
        *b=canvia;
}

Abans de la crida a la funció x= 10 i y = 20
Després de la crida a la funció x= 20 i y =10

La funció permuta intercanvia punters, de tal manera que a apunta a x i b apunta a y, tant abans com després de la crida a la funció. Com que la funció ha intercanviat els valors que són apuntats per les variables a i b, de fet, intercanvia els valors de les variables x i y.