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

 
Taules de valors de diverses funcions. Passar una funció com argument d'una altra funció

En aquesta pràctica aprendrem a declarar, definir i cridar funcions que tenen com arguments punters a altres funcions.

 

Desenvolupament de la pràctica

Definiu un projecte nou anomenat m5pa2 i afegiu-li un arxiu de font C/C++ anomenat m5pa2.cpp. Escriviu el següent codi:

// m5pa2.cpp: Llista de valors de diverses funcions

#include <math.h>
#include <stdio.h>

void proces(double(*f)(double),double vi, double inc, int np);

void main(){
    double vi=0;
    double inc=1;
    int np=5;
  
  double (*pf)(double);

    printf("Llista de valors de la funció sin\n");
    pf=sin;proces(pf,vi,inc,np);

    printf("Llista de valors de la funció oos\n");
    pf=cos;proces(pf,vi,inc,np);

    printf("Llista de valors de la funció tan\n");
    pf=tan;proces(pf,vi,inc,np);
}

void proces(double(*f)(double),double vi, double inc, int np){
    int ct;
    double valor;

    for (ct=0,valor=vi;ct<np;ct++,valor=valor+inc){
        printf("%d: %4.2lf %4.2lf\n",ct,valor,f(valor));
    }
}

Explicació del programa

Una altre ús dels punters a funcions és la possibilitat de poder passar una funció com argument d'una altra funció. En aquest programa, la funció que té com argument una funció és la funció procés() que té el següent protocol:

 
void proces(double(*f)(double),double vi, double inc, int np);

Aquesta funció, que no retorna cap valor, té quatre arguments, el primer del qual és un punter a una funció que té un argument del tipus double i retorna un valor del tipus double. Els altres tres arguments són de variables numèriques normals.

Aquesta funció servirà per imprimir una llista de np valors de la funció apuntada pel punter f on els arguments d'aquesta funció comencen amb vi i s'incrementen de inc en inc.

Per exemple, quan el punter pf apunta a la funció sin, com que el valor de les variables són vi=0, inc=1, np=5, la funció proces(pf,vi,inc,np) fa que s'imprimeixi el valor i el sinus dels números des del 0 fins al 4, és a dir:

 
Llista de valors de la funció sin
0:     0.00    0.00
1:     1.00    0.84
2:     2.00    0.91
3:     3.00    0.14
4:     4.00   -0.76

Per tal que el punter pf declarat prèviament com un punter a una funció que retorna un valor double i admet un argument double apunti a la funció de la llibreria estàndard sin() basta amb assignar-li el nom de la funció sense els parèntesis:

 
    pf=sin;

Això mateix es podria fer amb qualsevol funció,  ja sigui de la llibreria estàndard de C/C++ o no. Només és necessari que la funció tingui el protocol compatible amb la definició del punter pf.