« C pointeurs/Tableau de pointeurs de fonctions 2 » : différence entre les versions

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Page blanchie
Ligne 1 :
{{Chapitre
| niveau = 14
| idfaculté = informatique
| numéro = 4
| précédent = [[../Tableau de pointeurs de fonctions/]]
| suivant = [[../Double pointeur de double/]]
}}
 
 
= Introduction =
 
* Deuxième partie.
 
 
== Les fonctions f‘ et f‘‘ ==
 
* 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 ===
 
<source lang="c">
double (*Derivate[3])(double (*P_f)(double x),double a,double h) = {fx,Df_x,Df_xx};
</source>
 
 
* Toutes les fonctions (fx,Df_x,Df_xx) ont la même forme :
** <tt>double ''fonction''(double (*P_f)(double x) double double)</tt>.
 
 
* Le tableau à la même forme que les fonctions :
** <tt>double ''tableau''(double (*P_f)(double x) double double)</tt>.
 
 
* Il y a trois fonctions. (0,1,2)= {fx, Df_x, Df_xx}.
** La fonction fx() donne f().
 
 
=== Exemple d'un appel ===
 
 
<source lang="c">
Derivate[0](f,x,0.) ==> f(x)
</source>
 
 
* 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 ==
 
 
<source lang="c">
/* ------------------------------ */
/* 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;
}
</source>
 
 
=== Avec le résultat dans un fichier ===
 
 
* Déclarer le pointeur de fichiers.
** FILE *fp;
* Ouvrir le fichier.
** fp = fopen("list.txt","w");
* Fermer le fichiers
** fclose(fp);
* Remplacer tout les '''printf(''' par '''fprintf(fp,'''
** fprintf(fp,
 
 
<source lang="c">
/* ------------------------------ */
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;
}
</source>
 
= Conclusion =
 
* Vous pouvez approfondir ce travail grâce à ce wikibook : [[b:Mathc_gnuplot|Mathc gnuplot]]
* Ou bien continuer directement sur wikiversité : [[Mathc Home Edition]]
 
 
{{Bas de page
| idfaculté = informatique
| précédent = [[../Tableau de pointeurs de fonctions/]]
| suivant = [[../Double pointeur de double/]]
}}