Aller au contenu

Introduction au langage C/Tableau de pointeurs de fonctions

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
Icône de la faculté
Chapitre no 12
Leçon : Introduction au langage C
Chap. préc. :Pointeurs de fonctions
Chap. suiv. :Tableau de pointeurs de fonctions 2
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
Introduction au langage C/Tableau de pointeurs de fonctions
 », n'a pu être restituée correctement ci-dessus.


Introduction

Nous avons des fonctions semblables. Nous voulons les associer pour pouvoir les manipuler dans des boucles.


Nous allons créer un tableau de pointeurs de fonctions.


Je vais utiliser les fonctions trigonométriques prédéfinies pour faciliter la lecture.

Premier exemple

Un tableau de pointeurs de fonctions

double (*TrigF[6])(double x) = {cos,sin,tan,atan,asin,acos};
  • Toutes les fonctions ont la même forme.
  • double FUNCTION(double)
  • Le tableau à la même forme que les fonctions.
  • double ARRAY(double)
  • Il y a six fonctions. (0,1,2,3,4,5)= {cos,sin,tan,atan,asin,acos}.

Exemple d'un appel

   cos(.5) = TrigF[0](.5)

Exemple à tester

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

int main(void)
{
double (*TrigF[6])(double x) = {cos,sin,tan,atan,asin,acos};

double x= .5;
int    i=  0;

 printf(" Nous avons declare un tableau "\
        " de pointeurs de fonctions.\n  "\
        " J’ai utilise ici les fonctions predefinie du c.\n");

  
  printf("       cos(%.1f)  = %.3f  \n",  x,     cos(x));
  printf(" TrigF[%d](%.1f)) = %.3f\n\n",i,x,TrigF[i](x));

 printf(" Press return to continue");
 getchar();

 return 0;
}


Application

  • Créer un tableau de valeurs des fonctions trigonométriques.
  • Imprimer le résultat dans cette ordre (sin,cos,tan,acos,asin,atan)
  • Pour .1 <= x <+ .5
  • Ce travail pourrait être récupéré dans une matrice.

Résultat dans un fichier

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

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

double (*TrigF[6])(double x) = {atan,asin,acos,tan,cos,sin};

int    i= 6; 
double x= .1;

fprintf(fp,"   x || sin    cos    tan    acos   asin   atan \n");

     for(;x<=.5;x+=.1)
        {
         fprintf(fp," %.1f ||",x);
         for(i=6;i;)
            fprintf(fp," %.3f ",TrigF[--i](x));
         fprintf(fp,"\n");
        }

 fclose(fp);

 printf("\n\n Ouvrir le fichier list.txt\n");
 getchar();

 return 0;
}

Le résultat :

  x || sin    cos    tan    acos   asin   atan 
0.1 || 0.100  0.995  0.100  1.471  0.100  0.100 
0.2 || 0.199  0.980  0.203  1.369  0.201  0.197 
0.3 || 0.296  0.955  0.309  1.266  0.305  0.291 
0.4 || 0.389  0.921  0.423  1.159  0.412  0.381 
0.5 || 0.479  0.878  0.546  1.047  0.524  0.464 
Remarque : 
* Attention à l’ordre des fonctions dans la déclaration du tableau.
* double (*TrigF[6])(double x) = {atan,asin,acos,tan,cos,sin};
Au démarage :
* La décrémentation ce fait dans le tableau. TrigF[--i](x)
* Il entre 6 dans le tableau.
* 6 est décrémenté → 5 (avant l'appel de la fonction --i)
* La sixième fonctions est appelé (Sin). 
* La numéro cinq. :)
Au final :
* Il entre UN dans le tableau.
* UN est décrémenté → 0
* La première fonctions est appelé (atan).
* La numéro zéro. :))
* i est égal à zéro en rentrant dans la boucle.
* Le cycle est cassé. :(

Avec résultat à l'écran

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

int main(void)
{
double (*TrigF[6])(double x) = {atan,asin,acos,tan,cos,sin};

int    i= 6;
double x= .1;

     for(;x<=.5;x+=.1)
       {
         printf("\n");
         for(i=6;i;) printf(" %.3f ",TrigF[--i](x));
       }

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

 return 0;
}