C pointeurs/Tableau de pointeurs de fonctions 2

Début de la boite de navigation du chapitre
Tableau de pointeurs de fonctions 2
Icône de la faculté
Chapitre no 4
Leçon : C pointeurs
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, « C pointeurs : Tableau de pointeurs de fonctions 2
C pointeurs/Tableau de pointeurs de fonctions 2
 », n'a pu être restituée correctement ci-dessus.


Introduction

modifier
  • Deuxième partie.


Les fonctions f‘ et f‘‘

modifier
  • Nous voulons créer la fonction Derivate
    • Calculer la dérivé première et seconde d'une fonction
    • Utiliser un tableau de pointeurs de fonctions.

Voir listing en fin de page.


Déclaration du tableau

modifier
double (*Derivate[3])(double (*P_f)(double x),double a,double h) = {fx,Df_x,Df_xx};


  • Toutes les fonctions (fx,Df_x,Df_xx) ont la même forme :
    • double fonction(double (*P_f)(double x) double double).
  • Le tableau à la même forme que les fonctions :
    • double tableau(double (*P_f)(double x) double double).
  • Il y a trois fonctions. (0,1,2)= {fx, Df_x, Df_xx}.
    • La fonction fx() donne f().


Exemple d'un appel

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


  • 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())


Application

modifier
/* ------------------------------ */
/* Save as c04.c */
/* ------------------------------ */
#include <stdio.h>
#include <math.h>

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

/* ------------------------------ */
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 Df_x(
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 Df_xx(
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,Df_x,Df_xx};
double a = 2;
double h = 0.001;

printf("\n\n");

printf(" f(%.3f) = %.3f = %.3f \n",a, f(a), Derivate[0](f,a,0));
printf(" f'(%.3f) = %.3f = %.3f \n",a,Df_x (f,a,h),Derivate[1](f,a,h));
printf("f''(%.3f) = %.3f = %.3f \n",a,Df_xx(f,a,h),Derivate[2](f,a,h));

printf("\n\n");

printf(" g(%.3f) = %.3f = %.3f \n",a, g(a), Derivate[0](g,a,0));
printf(" g'(%.3f) = %.3f = %.3f \n",a,Df_x (g,a,h),Derivate[1](g,a,h));
printf("g''(%.3f) = %.3f = %.3f \n",a,Df_xx(g,a,h),Derivate[2](g,a,h));

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

 return 0;
}


Avec le résultat dans un fichier

modifier
  • Déclarer le pointeur de fichiers.
    • FILE *fp;
  • Ouvrir le fichier.
    • fp = fopen("list.txt","w");
  • Fermer le fichiers
    • fclose(fp);
  • Remplacer tous les printf( par fprintf(fp,
    • fprintf(fp,


/* ------------------------------ */
int main(void)
{
FILE *fp = fopen("list.txt","w");

double (*Derivate[3])(double (*P_f)(double x),
                      double a,
                      double h) = {fx,Df_x,Df_xx};
double a = 2;
double h = 0.001;

fprintf(fp,"\n\n");

fprintf(fp," f(%.3f) = %.3f = %.3f \n",a, f(a), Derivate[0](f,a,0));
fprintf(fp," f'(%.3f) = %.3f = %.3f \n",a,Df_x (f,a,h),Derivate[1](f,a,h));
fprintf(fp,"f''(%.3f) = %.3f = %.3f \n",a,Df_xx(f,a,h),Derivate[2](f,a,h));

fprintf(fp,"\n\n");

fprintf(fp," g(%.3f) = %.3f = %.3f \n",a, g(a), Derivate[0](g,a,0));
fprintf(fp," g'(%.3f) = %.3f = %.3f \n",a,Df_x (g,a,h),Derivate[1](g,a,h));
fprintf(fp,"g''(%.3f) = %.3f = %.3f \n",a,Df_xx(g,a,h),Derivate[2](g,a,h));

fclose(fp); 

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

 return 0;
}

Conclusion

modifier