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é:
Pouvez vous m'indiquez si cette manière de faire est correcte.
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); }
Merci d'avance
Partager