Aller au contenu

Introduction au langage C/Tableau de pointeurs de fonctions 2

Leçons de niveau 14
Une page de Wikiversité, la communauté pédagogique libre.
Version datée du 1 août 2017 à 17:26 par Crochet.david.bot (discussion | contributions) (Robot : Remplacement de texte automatisé (-\n(==={0,3})(?: *)([^\n=]+)(?: *)\1(?: *)\n +\n\1 \2 \1\n))
Début de la boite de navigation du chapitre
Tableau de pointeurs de fonctions 2
Icône de la faculté
Chapitre no 13
Leçon : Introduction au langage C
Chap. préc. :Tableau de pointeurs de fonctions
Chap. suiv. :Double pointeur de double
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Introduction au langage C : Tableau de pointeurs de fonctions 2
Introduction au langage C/Tableau de pointeurs de fonctions 2
 », n'a pu être restituée correctement ci-dessus.


Introduction (deuxième partie)

Nous voulons créer la fonction Derivate capable de calculer la dérivé première et seconde d'une fonction, en utilisant un tableau de pointeurs de fonctions.

Premier exemple

Un tableau de pointeurs de fonctions

  • Voir listing en fin de page.
double (*Derivate[3])(double (*P_f)(double x),double a,double h) = {fx,Dx_1,Dx_2};


  • Toutes les fonctions (fx,Dx_1,Dx_2) ont la même forme.
  • double FUNCTION(double (*P_f)(double x) double double)
  • Le tableau à la même forme que les fonctions.
  • double ARRAY(double (*P_f)(double x) double double)
  • Il y a trois fonctions. (0,1,2)= {fx, Dx_1, Dx_2}.
  • La fonction fx donne f.
  • Supprimer cette fonction et travailler sur deux fonctions.
  • Réfléchissez.

Exemple d'un appel

     f(x)=Derivate[0](f,x,0.)


  • Derivate[0] donne f(x).
  • Voir la fonction fx() la première fonction du tableau.
  • h = 0 dans cet appel parce qu’il n’est pas utilisé (voir code de fx())

Exemple à tester

/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */


/* ------ Fonction f ------------ */
double f(double x){return( pow(x,2.));}
/* ------------------------------ */
char feq[] = "x**2";
/* ------------------------------ */

/* ------ Fonction g ------------ */
double g(double x){return(
 pow(cos(x),2.)+sin(x)+x-3);}
/* ------------------------------ */
char geq[] = "cos(x)**2+sin(x)+x-3";
/* ------------------------------ */


/* ----------------------------- */
double fx(
double (*P_f)(double x),
double a,
double h
)
{
 return( ((*P_f)(a)) );
}


/* ------------------------------
 f'(a) = f(a+h) - f(a-h)
          -------------
              2h
   ------------------------------ */
double Dx_1(
double (*P_f)(double x),
double a,
double h
)
{
 return( ( ((*P_f)(a+h))-((*P_f)(a-h)) ) / (2.*h) );
}


/* -----------------------------
 f''(a) = f(a+h) - 2 f(a) + f(a-h)
           ----------------------
                     h**2
   ------------------------------- */
double Dx_2(
double (*P_f)(double x),
double a,
double h
)
{
 return( (((*P_f)(a+h))-2*((*P_f)(a))+((*P_f)(a-h))) / (h*h) );
}


/* ------------------------------ */
int main(void)
{
double (*Derivate[3])(double (*P_f)(double x),
                      double a,
                      double h) = {fx,Dx_1,Dx_2};
double x = 2;
double h = 0.001;

printf("\n\n");

printf(" f(%.3f) = %.3f = %.3f \n",x,f(x), Derivate[0](f,x,0.));
printf(" f'(%.3f) = %.3f = %.3f \n",x,Dx_1(f,x,h),Derivate[1](f,x,h));
printf("f''(%.3f) = %.3f = %.3f \n",x,Dx_2(f,x,h),Derivate[2](f,x,h));

printf("\n\n");

printf(" g(%.3f) = %.3f = %.3f \n",x,g(x), Derivate[0](g,x,0.));
printf(" g'(%.3f) = %.3f = %.3f \n",x,Dx_1(g,x,h),Derivate[1](g,x,h));
printf("g''(%.3f) = %.3f = %.3f \n",x,Dx_2(g,x,h),Derivate[2](g,x,h));

    printf("\n\n Press return to continue.");

 getchar();

 return 0;
}