IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Tableau de pointeur de fonction


Sujet :

C

  1. #1
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut Tableau de pointeur de fonction
    Bonjour,

    je dois modifier le code suivant et utiliser un tableau de fonction utilisant les operations arithmetiques élémentaires et verifiés les débordements éventuels.


    Code de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    double eval(Arbre *a)
     {
      double r1,r2;
    if((*a)->type == Constante)
    return ((*a)->info.cte)
     
    if((*a)->type == Operateur)
    {
        r1=eval(&((*a)->gauche));
        r2= eval(&((*a)->droit));
        switch ((*a)->info.op)
         {
          case '+':return(r1+r2);
          case '-':return(r1-r2);
          case '*':return(r1*r2);
          case '/':return(r1/r2);
         }
       }
      /* si aucun return n'a été effectué jusqu'ici*/
      puts("erreur (code opératoire inconnu par exemple)");
      return(0);
     }

    Code de la fonction plus,les autres sont de la meme forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    double plus(double a, double b)
    {
    double res = a+b;
     
    if(res<=(-DBL_MAX) || res >= DBL_MAX)
    return DBL_MAX;
    return res;
    }

    code modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    double eval(Arbre *a)
     {
      char tab1[] = {'+','-','/','*','\0'};
      char (*tab2[])(double,double) = {plus,moins,div,mul,NULL};
      double r1,r2;
     
      if((*a)->type == Constante)
         return ((*a)->info.cte)
     
      if((*a)->type == Operateur)
         {
           r1=eval(&((*a)->gauche));
           r2= eval(&((*a)->droit));
           int i;
             for(i=0; tab1[i] != '\0' && tab1[i] != (*a)->info.op; i++)
                            ;
     
             if(tab1[i] == '\0')
               {
                 printf("erreur\n");
                 return DBL_MAX
                }
     
            if((*tab2[i])(r1,r2) ==DBL_MAX)
              {
                 printf("debordement\n");
                 return DBL_MAX
              }
     
      /* si aucun return n'a été effectué jusqu'ici*/
      puts("erreur (code opératoire inconnu par exemple)");
      return(0);
     }
    Pouvez vous m'indiquez si cette manière de faire est correcte.

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    As-tu toit même testé ??
    On peut le faire en tout cas.

  3. #3
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    <HS>
    Citation Envoyé par Trap D
    As-tu toit même testé ??
    Argh, elle est salée celle-là, quand même...
    </HS>

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    toi toi mon toit ....
    C'est les fêtes, les neurones et l'aurtaugraffe sont en vacances

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Trap D
    As-tu toit même testé ??
    Non,car je ne suis pas chez moi(pas de compilateur).

    On peut le faire en tout cas.
    J'aimerais bien

    la structure arbre se definit de cette maniere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    enum Type{Constante,Operateur};
     
    union Info
    {
    double cte;
    char op;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct noeud
    {
    enum Type type;
    union Info info;
    struct noeud*gauche;
    struct noeud*droit;
    }Noeud,*Arbre;

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Voilà ce qu'on peut faire, ça correspond je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <stdio.h>
     
    typedef double (*t_fonc)(double, double);
     
    double f_somme(double e1, double e2)
    {
    	return e1 + e2;
    }
     
    double f_diff(double e1, double e2)
    {
    	return e1 - e2;
    }
     
    double f_mult(double e1, double e2)
    {
    	return e1 * e2;
    }
     
    // attention, aucun test d'erreur
    double f_div(double e1, double e2)
    {
    	return e1 / e2;
    }
     
     
    t_fonc Tab[4] = {f_somme, f_diff, f_mult, f_div};
     
    int main(void)
    {
    	double e1= 1.5;
    	double e2 = 3.6;
     
    	printf("Somme %lf %lf = %lf\n", e1,e2, Tab[0](e1,e2));
    	printf("Diff %lf %lf = %lf\n", e1,e2, Tab[1](e1,e2));
    	printf("Mult %lf %lf = %lf\n", e1,e2, Tab[2](e1,e2));
    	printf("div %lf %lf = %lf\n", e1,e2, Tab[3](e1,e2));
     
    	return 0;
    }

  7. #7
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Trap D
    Voilà ce qu'on peut faire, ça correspond je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <stdio.h>
     
    typedef double (*t_fonc)(double, double);
     
    double f_somme(double e1, double e2)
    {
    	return e1 + e2;
    }
     
    double f_diff(double e1, double e2)
    {
    	return e1 - e2;
    }
     
    double f_mult(double e1, double e2)
    {
    	return e1 * e2;
    }
     
    // attention, aucun test d'erreur
    double f_div(double e1, double e2)
    {
    	return e1 / e2;
    }
     
     
    t_fonc Tab[4] = {f_somme, f_diff, f_mult, f_div};
     
    int main(void)
    {
    	double e1= 1.5;
    	double e2 = 3.6;
     
    	printf("Somme %lf %lf = %lf\n", e1,e2, Tab[0](e1,e2));
    	printf("Diff %lf %lf = %lf\n", e1,e2, Tab[1](e1,e2));
    	printf("Mult %lf %lf = %lf\n", e1,e2, Tab[2](e1,e2));
    	printf("div %lf %lf = %lf\n", e1,e2, Tab[3](e1,e2));
     
    	return 0;
    }
    Ce code s'utilise comment avec un arbre ?

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    ben dans ta fonction d'évaluation, lorsque tu es sur un opérateur tu appelles ta fonction sur ton sous arbre gauche et ton sous arbre droit.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/09/2011, 14h26
  2. tableau de pointeur de fonction
    Par exhortae dans le forum C
    Réponses: 2
    Dernier message: 31/12/2007, 12h33
  3. [BCB6]Tableau de pointeurs sur fonctions
    Par rtg57 dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/10/2006, 20h49
  4. Tableau de pointeurs de fonctions
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 29/10/2005, 13h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo