La fonction avec pointeur de fonction

Question

Écrivez la fonction critère2 qui évalue le nombre d'éléments d'un tableau vérifiant un critère défini dans une fonction dont l'adresse est transmise en pointeur.

Utilisez cette fonction pour réaliser des décomptes selon des critères différents.

Solution

Le nom du paramètre pointeur de fonction s'appelle f.

1
int critere2(int *tval, unsigned int n, bool (*f)(int)){
2
  int nb=0 ;
3
  for(; n>0 ; --n, ++tval)
4
    if(f(*tval))nb++; // ecriture possible if( (*f)(*tval))nb++ ;
5
  return nb;
6
}
7
// les fonctions test critères
8
bool pair(int n){ return 0==n%2;}
9
bool mult3(int n){return 0==n%3;}
10
bool mult5(int n){return 0==n%5;}
11
// utilisation de la fonction critere2int main(){
12
  const int taille=30;
13
  int t[taille], i;
14
  bool b[taille];  for(i=0; i<taille ; ++i) t[i]=i+1;
15
  printf (" nombre de nombre pair=%d\n",critere2(t, b, taille, pair));
16
  printf (" nombre de nombre multiple de 3=%d\n",critere2(t, b, taille, mult3));
17
  printf (" nombre de nombre multiple de 5=%d\n",critere2(t, b, taille, mult5));
18
  return 0;
19
}

Un exemple un peu plus concret

On peut calculer une approximation de l'intégrale d'une fonction f entre a et b donnés (\(a<b\)) par la méthode des trapèzes.

On suppose que \(f\left ( x \right )> 0,\, \forall\: x\in \left [ a,b \right ]\).

Pour cela, on calcule f en \(a, a+\Delta , a+2\Delta ,\cdots , a+n\Delta=b\). n étant une valeur choisie pour définir le pas Δ.

L'intégrale est définie comme la somme des intégrales sur les intervalles successifs \(\left [a,\, a+\Delta\right ], \left [a+\Delta,\, a+2\Delta\right ] ,\cdots , \left [a+\left (n+1 \right ) \Delta,\, b \right ]\).

À chaque étape i, on calcule l'intégrale de f sur l'intervalle \(\left [a+i\Delta,\, a+\left (i+1 \right ) \Delta\right ]\) par le calcul de l'aire du trapèze défini par \(x, x+\Delta,\, f\left (x \right ), f\left (x+\Delta \right )\).

La fonction suivante implémente cette méthode en supposant fonc connue.

1
double integrale(double a, double b, unsigned int nbinter){
2
  double delta=(b-a)/nbinter ;
3
  double integrale=0, t=a , d ;
4
  while(t<b){
5
    d=t+delta ;
6
    integrale += (fonc(t)+fonc(d))*delta/2 ;
7
    t=d ;
8
  }
9
  return integrale ;
10
}

Modifiez cette fonction afin de pouvoir calculer l'intégrale de toute fonction positive sur [a, b].